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  | 
       
         否  | 
       
         块大小。  |