更新时间:2024-09-18 GMT+08:00
分享

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配套使用)。

  1. 下载hadoop-3.1.1.tar.gz,并解压到/opt/hadoop-3.1.1目录。
  2. 在/etc/profile文件中增加配置内容:

    export HADOOP_HOME=/opt/hadoop-3.1.1
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

  3. 安装hadoop-huaweicloud。

    1. 在官方Github下载hadoop-huaweicloud:下载地址

      如果没有匹配版本的jar包,可自行修改hadoop-huaweicloud目录下pom文件中的hadoop版本重新编译生成。

    2. 将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的版本号。

  4. 配置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>
    

  5. 验证是否对接成功。

    您可以通过命令行和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,此参数用于设置缓存方式,取值范围:

  • disk:缓存在磁盘
  • array:缓存在JVM堆内内存
  • bytebuffer:缓存在JVM堆外内存

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()接口的返回值。

  • TRUE:obs://bucketname
  • FALSE:null

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

块大小。

相关文档