Hadoop对接OBS
概述
Hadoop系统提供了分布式存储、计算和资源调度引擎,用于大规模数据处理和分析。OBS服务实现了Hadoop的HDFS协议,在大数据场景中可以替代Hadoop系统中的HDFS服务,实现Spark、MapReduce、Hive等大数据生态与OBS服务的对接,为大数据计算提供“数据湖”存储。
HDFS协议:Hadoop中定义了HDFS协议(通过FileSystem抽象类),其他各类存储系统均可以实现HDFS协议,例如Hadoop中内置的HDFS服务,华为云的对象存储服务OBS。
约束与限制
不支持以下HDFS语义:
- Lease
- Symbolic link operations
- Proxy users
- File concat
- File checksum
- File replication factor
- Extended Attributes(XAttrs) operations
- Snapshot operations
- Storage policy
- Quota
- POSIX ACL
- Delegation token operations
注意事项
为了减少日志输出,在/opt/hadoop-3.1.1/etc/hadoop/log4j.properties文件中增加配置:
log4j.logger.com.obs=ERROR
对接步骤
以Hadoop 3.1.1为例(建议使用最新的版本,不推荐使用低于2.8.3版本的hadoop与hadoop-huaweicloud配套使用)。
- 下载hadoop-3.1.1.tar.gz,并解压到/opt/hadoop-3.1.1目录。
- 在/etc/profile文件中增加配置内容:
export HADOOP_HOME=/opt/hadoop-3.1.1 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
- 安装hadoop-huaweicloud。
- 在官方Github下载hadoop-huaweicloud:下载地址。
如果没有匹配版本的jar包,可自行修改hadoop-huaweicloud目录下pom文件中的hadoop版本重新编译生成。
- 将hadoop-huaweicloud-x.x.x-hw-y.jar拷贝到/opt/hadoop-3.1.1/share/hadoop/tools/lib和/opt/hadoop-3.1.1/share/hadoop/common/lib目录下。
hadoop-huaweicloud-x.x.x-hw-y.jar包含义:前三位x.x.x为配套hadoop版本号;最后一位y为OBSA版本号,y值最大为最新版本。如:hadoop-huaweicloud-3.1.1-hw-40.jar,3.1.1是配套hadoop版本号,40是OBSA的版本号。
- 在官方Github下载hadoop-huaweicloud:下载地址。
- 配置hadoop。
修改 /opt/hadoop-3.1.1/etc/hadoop/core-site.xml,增加OBS相关配置信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<property> <name>fs.obs.impl</name> <value>org.apache.hadoop.fs.obs.OBSFileSystem</value> </property> <property> <name>fs.AbstractFileSystem.obs.impl</name> <value>org.apache.hadoop.fs.obs.OBS</value> </property> <property> <name>fs.obs.access.key</name> <value>xxx</value> <description>HuaweiCloud Access Key Id</description> </property> <property> <name>fs.obs.secret.key</name> <value>xxx</value> <description>HuaweiCloud Secret Access Key</description> </property> <property> <name>fs.obs.endpoint</name> <value>xxx</value> <description>HuaweiCloud Endpoint</description> </property>
- 验证是否对接成功。
您可以通过命令行和MR程序两种方式进行验证。示例如下:
- 命令行
hadoop fs -ls obs://obs-bucket/
回显如下信息:
-rw-rw-rw- 1 root root 1087 2018-06-11 07:49 obs://obs-bucket/test1 -rw-rw-rw- 1 root root 1087 2018-06-11 07:49 obs://obs-bucket/test2
- MR程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount obs://example-bucket/input/test.txt obs://obs-bucket/output
- 命令行
【附】hadoop-huaweicloud相关配置
配置项 |
默认值 |
是否必填 |
说明 |
---|---|---|---|
fs.obs.impl |
org.apache.hadoop.fs.obs.OBSFileSystem |
是 |
- |
fs.AbstractFileSystem.obs.impl |
org.apache.hadoop.fs.obs.OBS |
是 |
- |
fs.obs.endpoint |
无 |
是 |
华为云OBS的终端节点(Endpoint)。 |
fs.obs.access.key |
无 |
是 |
华为云的AK(Access Key Id),需要具备访问OBS对应桶的权限。 |
fs.obs.secret.key |
无 |
是 |
华为云的SK(Secret Access Key),需要具备访问OBS对应桶的权限。 |
fs.obs.session.token |
无 |
否 |
华为云的securitytoken,需要具备访问OBS对应桶的权限。当使用临时AK/SK时需要。 |
fs.obs.security.provider |
无 |
否 |
实现com.obs.services.IObsCredentialsProvider接口的类,用于获取访问OBS的凭证。 |
fs.obs.connection.ssl.enabled |
FALSE |
否 |
是否通过HTTPS访问OBS。 |
fs.obs.threads.keepalivetime |
60 |
否 |
控制读写线程池参数keepAliveTime。 |
fs.obs.threads.max |
20 |
否 |
控制读写线程池参数corePoolSize和maximumPoolSize |
fs.obs.max.total.tasks |
20 |
否 |
控制读写线程池参数BlockingQueue的容量,其等于fs.obs.threads.max+fs.obs.max.total.tasks |
fs.obs.multipart.size |
104857600 |
否 |
写相关配置,多段上传大小。 |
fs.obs.fast.upload.buffer |
disk |
否 |
写相关配置,所有数据在写入OBS前都会先缓存然后再上传到OBS,此参数用于设置缓存方式,取值范围:
|
fs.obs.buffer.dir |
${hadoop.tmp.dir} |
否 |
写相关配置,当fs.obs.fast.upload.buffer为disk时的缓存目录,支持多目录并以逗号分隔。 |
fs.obs.bufferdir.verify.enable |
FALSE |
否 |
写相关配置,当fs.obs.fast.upload.buffer为disk时是否验证缓存目录是否存在以及是否具备写权限。 |
fs.obs.fast.upload.active.blocks |
4 |
否 |
写相关配置,每个流操作最大可以使用的缓存个数(通过多段上传线程池最多可以提交的线程任务个数),从而限制每个流操作最大可以使用的缓存空间fs.obs.fast.upload.active.blocks*fs.obs.multipart.size。 |
fs.obs.fast.upload.array.first.buffer |
1048576 |
否 |
写相关配置,当fs.obs.fast.upload.buffer为array时,此参数控制JVM堆内缓存初始化大小 |
fs.obs.readahead.range |
1048576 |
否 |
写相关配置,预读片段大小。 |
fs.obs.multiobjectdelete.enable |
TRUE |
否 |
删除相关配置,删除目录时是否启动批量删除。 |
fs.obs.delete.threads.max |
20 |
否 |
删除相关配置,控制线程池参数maximumPoolSize和corePoolSize |
fs.obs.multiobjectdelete.maximum |
1000 |
否 |
删除相关配置,批量删除时单次OBS批量删除请求中支持的最多可删除对象的个数,最大值为1000。 |
fs.obs.multiobjectdelete.threshold |
3 |
否 |
删除相关配置,批量删除时当对象个数小于此参数值时将不启动批量删除。 |
fs.obs.list.threads.core |
30 |
否 |
List相关配置,控制线程池参数corePoolSize |
fs.obs.list.threads.max |
60 |
否 |
List相关配置,控制线程池参数maximumPoolSize |
fs.obs.list.workqueue.capacity |
1024 |
否 |
List相关配置,控制线程池参数BlockingQueue的容量 |
fs.obs.list.parallel.factor |
30 |
否 |
List相关配置,控制并发因子参数。 |
fs.obs.paging.maximum |
1000 |
否 |
List相关配置,单次OBS List请求最多返回的对象个数,最大值为1000。 |
fs.obs.copy.threads.max |
40 |
否 |
对象桶rename相关配置,对象桶rename目录时copy线程池配置参数maximumPoolSize,corePoolSize的值为此参数的一半,BlockingQueue的容量为1024。 |
fs.obs.copypart.size |
104857600 |
否 |
对象桶rename相关配置,单个对象copy时当对象的大小超过了此参数值则进行多段copy,且段大小为此参数值;否则进行简单copy。 |
fs.obs.copypart.threads.max |
5368709120 |
否 |
对象桶rename相关配置,单个对象copy时如果进行了多段copy,多段copy线程池配置参数maximumPoolSize,corePoolSize的值为此参数的一半,BlockingQueue的容量为1024。 |
fs.obs.getcanonicalservicename.enable |
FALSE |
否 |
控制getCanonicalServiceName()接口的返回值。
|
fs.obs.multipart.purge |
FALSE |
否 |
初始化OBSFilesystem时是否清理桶内的多段上传任务。 |
fs.obs.multipart.purge.age |
86400 |
否 |
初始化OBSFilesystem时清理桶内多久之前的多段上传任务。 |
fs.obs.trash.enable |
FALSE |
否 |
是否开启垃圾回收功能。 |
fs.obs.trash.dir |
无 |
否 |
垃圾回收目录。 |
fs.obs.block.size |
134217728 |
否 |
块大小。 |