
# Hadoop对接OBS
#### 概述
Hadoop系统提供了分布式存储、计算和资源调度引擎，用于大规模数据处理和分析。OBS服务实现了Hadoop的HDFS协议，在大数据场景中可以替代Hadoop系统中的HDFS服务，实现Spark、MapReduce、Hive等大数据生态与OBS服务的对接，为大数据计算提供"数据湖"存储。
![](https://support.huaweicloud.com/bestpractice-obs/public_sys-resources/note_3.0-zh-cn.png)
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
```
![](https://support.huaweicloud.com/bestpractice-obs/public_sys-resources/note_3.0-zh-cn.png)
大数据场景下，不断往OBS写入数据过程中，可能会产生一些多段碎片，请及时删除过期的多段碎片以释放空间和节约成本，清理碎片相关操作请参见[清理碎片](https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829110.html)。
#### 对接步骤
以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：[下载地址](https://github.com/huaweicloud/obsa-hdfs/tree/master/release)。
      ![](https://support.huaweicloud.com/bestpractice-obs/public_sys-resources/note_3.0-zh-cn.png)
      如果没有匹配版本的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目录下。
      ![](https://support.huaweicloud.com/bestpractice-obs/public_sys-resources/note_3.0-zh-cn.png)
      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相关配置信息：
   ```
   <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                              | 否    | 块大小。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| fs.obs.fast.upload.checksum.type      | none                                   | 否    | 写相关配置，上传文件到OBS开启数据校验功能： - md5：开启md5校验算法，性能下降会比较明显。  - sha256：开启sha256校验算法，性能下降会比较明显。  - crc32c：开启crc32c校验算法，性能下降幅度比较低，但是需要服务端并行文件系统开启crc32c校验功能。  - none：不开启数据校验功能。   |
   
