本文介绍如何使用阿里云Jindo DistCp从HDFS迁移数据到OSS。

背景信息

在传统大数据领域,HDFS经常作为大规模数据的底层存储。在进行数据迁移、数据拷贝的场景中,最常用的是Hadoop自带的DistCp工具。但是该工具不能很好利用对象存储OSS的特性,导致效率低下并且不能最终保证一致性。此外,该工具提供的功能选项也比较简单,不能很好的满足用户的需求。

阿里云Jindo DistCp(分布式文件拷贝工具)是用于大规模集群内部和集群之间拷贝文件的工具。它使用MapReduce实现文件分发,错误处理和恢复,把文件和目录的列表作为map/reduce任务的输入,每个任务会完成源列表中部分文件的拷贝。全量支持HDFS之间、HDFS与OSS之间、以及OSS之间的数据拷贝场景,提供多种个性化拷贝参数和多种拷贝策略。

相对于Hadoop DistCp,使用阿里云Jindo DistCp从HDFS迁移数据到OSS具有以下优势:
  • 效率高,在测试场景中最高可达到1.59倍的加速。
  • 基本功能丰富,提供多种拷贝方式和场景优化策略。
  • 深度结合OSS,对文件提供直接归档和低频、压缩等操作。
  • 实现No-Rename拷贝,保证数据一致性。
  • 场景全面,可完全替代Hadoop DistCp,目前支持Hadoop2.7+和Hadoop3.x。

前提条件

  • 如果您使用的是自建ECS集群,需要具备Hadoop2.7+或Hadoop3.x环境以及进行MapReduce作业的能力。
  • 如果您使用的是阿里云E-MapReduce:
    • 对于EMR3.28.0/bigboot2.7.0及以上的版本,可以通过Shell命令的方式使用Jindo DistCp。详情请参见Jindo DistCp使用说明
    • 对于EMR3.28.0以下的版本,可能会存在一定的兼容性问题,您可以通过提交工单申请处理。

步骤1:下载JAR包

步骤2:配置OSS的访问密钥AccessKey

您可以通过以下任一方式配置AccessKey:
  • 在命令中指定--key--secret--endPoint参数选项来指定AccessKey。示例命令如下:
    hadoop jar jindo-distcp-2.7.3.jar --src /data/incoming/example_file --dest oss://example_folder/example_file --key yourAccessKeyId --secret yourAccessKeySecret --endPoint oss-cn-hangzhou.aliyuncs.com
  • 将OSS的--key--secret--endPoint预先配置在Hadoop的core-site.xml文件里 ,避免每次使用时临时填写。配置如下:
    <configuration>
        <property>
            <name>fs.jfs.cache.oss-accessKeyId</name>
            <value>xxx</value>
        </property>
        <property>
            <name>fs.jfs.cache.oss-accessKeySecret</name>
            <value>xxx</value>
        </property>
        <property>
            <name>fs.jfs.cache.oss-endpoint</name>
            <value>oss-cn-xxx.aliyuncs.com</value>
        </property>
    </configuration>
  • 配置免密功能,避免明文保存AccessKey,提高安全性。详情请参见使用JindoFS SDK免密功能

步骤3:设置相关参数

Jindo DistCp提供多种实用功能及其对应的参数选择。参数含义及其示例如下表所示。详细的使用方法和完整的命令示例请参见Jindo DistCp使用指南
参数 是否必须 含义 示例
--src 指定拷贝的源路径。 --src oss://exampleBucket/sourceDir
--dest 指定拷贝的目标路径 --dest oss://exampleBucket/destDir
--parallelism 指定拷贝的任务并行度,可根据集群资源调节。 --parallelism 10
--policy 指定拷贝到OSS后的文件类型。取值:
  • archive(归档)
  • ia(低频)
--policy archive
--srcPattern 指定正则表达式来选择或者过滤需要拷贝的文件。您可以编写自定义的正则表达式来完成过滤操作,正则表达式必须为全路径正则匹配。 拷贝以.log结尾的文件:

--srcPattern .*\.log

--deleteOnSuccess 指定是否在拷贝完成后删除源路径下的文件,即移动文件。类似于mv操作。 --deleteOnSuccess
--outputCodec 指定拷贝文件按何种方式压缩。当前版本支持编解码器gzip、gz、lzo、lzop和snappy,以及关键字none和keep,含义如下:
  • none:保存为未压缩的文件。如果文件已压缩,则Jindo DistCp会将其解压缩。
  • keep(默认):不更改文件压缩形态,按原样复制。
--outputCodec gzip
srcPrefixesFile 指定需要一次拷贝的文件列表,列表里文件以src路径作为前缀。 --srcPrefixesFile file:///opt/folders.txt
--outputManifest 指定在dest目录下生成一个gzip压缩的文件,记录已完成拷贝的文件信息。 --outputManifest=manifest-2020-04-17.gz
--requirePreviousManifest 指定本次拷贝是否需要读取之前已拷贝的文件信息,从而进行增量更新。取值:
  • false:不需要
  • true:需要
--requirePreviousManifest=false
--previousManifest 指定本次拷贝需要读取之前已拷贝文件的信息,完成增量更新。 --previousManifest=oss://exampleBucket/manifest-2020-04-16.gz
--copyFromManifest 从已完成的Manifest文件中进行拷贝,通常和--previousManifest配合使用。 --previousManifest oss://exampleBucket/manifest-2020-04-16.gz --copyFromManifest
--groupBy 指定正则表达式将符合规则的文件进行聚合,和targetSize选项配合使用。 --groupBy='.*/([a-z]+).*.txt'
--targetSize 指定聚合的文件大小,聚合完的文件不超过这个值的大小,单位MB --targetSize=10
--enableBalancePlan 执行策略,适用于数据量差异不大的场景 --enableBalancePlan
--enableDynamicPlan 执行策略,适用于数据量差异较大的场景,如大小文件混合 --enableDynamicPlan
--enableTransaction 执行策略,保证Job级别的一致性,默认是Task级别 --enableTransaction
--diff 对比策略,查看本次拷贝是否完成全部文件拷贝,未完成会生成文件列表。 --diff
--key 指定OSS访问的AccessKey ID。 --key yourAccessKeyId
--secret 指定OSS访问的AccessKey Secret。 --secret yourAccessKeySecret
--endPoint 指定OSS访问的地域信息。 --endPoint oss-cn-hangzhou.aliyuncs.com
--cleanUpPending 清理OSS残留文件,这可能会花费一定的时间。 --cleanUpPending