迁移OSS-HDFS服务不同Bucket之间的数据

更新时间:
复制 MD 格式

本文介绍如何使用阿里云Jindo DistCpOSS-HDFS服务不同Bucket之间迁移数据。

前提条件

  • 已创建阿里云EMR-5.6.0EMR-3.40.0及以上版本的集群。具体步骤,请参见创建集群

  • 自建ECS集群需具备Hadoop2.7+或3.x环境及MapReduce作业能力。通过自建ECS集群完成迁移任务前,需要自行部署JindoData(包含JindoSDK以及JindoFSx),建议下载最新版本。

  • 已开通并授权访问OSS-HDFS服务。具体操作,请参见开通OSS-HDFS服务

背景信息

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

使用阿里云Jindo DistCp迁移数据时,有以下优势:

  • 效率高,在测试场景中最高可达到1.59倍的加速。

  • 基本功能丰富,提供多种拷贝方式和场景优化策略。

  • 深度结合OSS,对文件提供归档、压缩等操作。

  • 实现No-Rename拷贝,保证数据一致性。

  • 场景全面,可完全替代Hadoop DistCp,目前支持Hadoop2.7+和Hadoop3.x。

步骤一:下载JAR

下载地址,请参见GitHub

步骤二:配置OSS-HDFS服务的AccessKey

您可以通过以下任意方式配置OSS-HDFS服务的AccessKey:

  • 在示例命令中配置AccessKey

    例如,在将OSS-HDFSsrcbucket的数据迁移到destbucket的示例中结合--hadoopConf选项配置AccessKey。

    hadoop jar jindo-distcp-tool-${version}.jar --src oss://srcbucket.cn-hangzhou.oss-dls.aliyuncs.com/ --dest oss://destbucket.cn-hangzhou.oss-dls.aliyuncs.com/ --hadoopConf fs.oss.accessKeyId=yourkey --hadoopConf fs.oss.accessKeySecret=yoursecret --parallelism 10
  • 通过配置文件预先配置AccessKey

    OSS-HDFSfs.oss.accessKeyId、fs.oss.accessKeySecret预先配置在Hadoopcore-site.xml文件里。示例命令如下:

    <configuration>
        <property>
            <name>fs.oss.accessKeyId</name>
            <value>LTAI********</value>
        </property>
    
        <property>
            <name>fs.oss.accessKeySecret</name>
            <value>KZo1********</value>
        </property>
    </configuration>

步骤三:配置OSS-HDFS服务Endpoint

访问OSS-HDFS服务时需要配置Endpoint。推荐访问路径格式为oss://<Bucket>.<Endpoint>/<Object>,例如oss://examplebucket.cn-shanghai.oss-dls.aliyuncs.com/exampleobject.txt。配置完成后,JindoSDK会根据访问路径中的Endpoint访问对应的OSS-HDFS服务接口。

您还可以通过其他方式配置OSS-HDFS服务Endpoint,且不同方式配置的Endpoint存在生效优先级。更多信息,请参见配置Endpoint的其他方式

步骤四:在OSS-HDFS服务不同Bucket之间全量迁移数据

以下以Jindo DistCp 4.4.0版本为例,您可以根据实际环境替换对应的版本号。

使用相同的AccessKey将同一个RegionBucket A的数据迁移至Bucket B

  • 命令格式

    hadoop jar jindo-distcp-tool-${version}.jar --src oss://bucketname.region.oss-dls.aliyuncs.com/ --dest oss://bucketname.region.oss-dls.aliyuncs.com/ --hadoopConf fs.oss.accessKeyId=yourkey --hadoopConf fs.oss.accessKeySecret=yoursecret --parallelism 10

    参数及选项说明如下:

    参数及选项

    说明

    示例

    --src

    待迁移或拷贝的OSS-HDFS服务中源Bucket的完整路径。

    oss://srcbucket.cn-hangzhou.oss-dls.aliyuncs.com/

    --dest

    OSS-HDFS中存放迁移或拷贝数据的目标Bucket的完整路径。

    oss://destbucket.cn-hangzhou.oss-dls.aliyuncs.com/

    --hadoopConf

    访问OSS-HDFS服务的AccessKey IDAccessKey Secret。

    • AccessKey ID

      LTAI********
    • AccessKey Secret

      KZo1********

    --parallelism

    根据集群资源调整任务并发数。

    10

  • 使用示例

    使用相同的AccessKey将华东1(杭州)地域下srcbucket的数据迁移至destbucket。

    hadoop jar jindo-distcp-tool-4.4.0.jar --src oss://srcbucket.cn-hangzhou.oss-dls.aliyuncs.com/ --dest oss://destbucket.cn-hangzhou.oss-dls.aliyuncs.com/ --hadoopConf fs.oss.accessKeyId=LTAI******** --hadoopConf fs.oss.accessKeySecret=KZo1******** --parallelism 10

跨 Region 迁移

当源 Bucket 与目标 Bucket 位于不同地域时,--src--dest 需分别指定不同 Region 的 OSS-HDFS Endpoint。以下示例将华东 1(杭州)srcbucket 的数据迁移至华东 2(上海)destbucket:

hadoop jar jindo-distcp-tool-4.4.0.jar --src oss://srcbucket.cn-hangzhou.oss-dls.aliyuncs.com/ --dest oss://destbucket.cn-shanghai.oss-dls.aliyuncs.com/ --hadoopConf fs.oss.accessKeyId=LTAI******** --hadoopConf fs.oss.accessKeySecret=KZo1******** --parallelism 10

(可选)在OSS-HDFS服务不同Bucket之间增量迁移数据

如果您仅希望拷贝在上一次全量迁移或拷贝后源路径下新增的数据,此时您可以结合--update选项完成数据的增量迁移或拷贝。

例如,您需要使用相同的AccessKey将华东1(杭州)地域下srcbucket的数据增量迁移至destbucket。

hadoop jar jindo-distcp-tool-4.4.0.jar --src oss://srcbucket.cn-hangzhou.oss-dls.aliyuncs.com/ --dest oss://destbucket.cn-hangzhou.oss-dls.aliyuncs.com/ --hadoopConf fs.oss.accessKeyId=LTAI******** --hadoopConf fs.oss.accessKeySecret=KZo1******** --update --parallelism 10

--update 选项同样适用于跨 Region 的增量迁移场景:仅复制源端有变更的文件,适用于多次迁移或增量备份。以下示例将华东 1(杭州)srcbucket 的数据增量迁移至华东 2(上海)destbucket:

hadoop jar jindo-distcp-tool-4.4.0.jar --src oss://srcbucket.cn-hangzhou.oss-dls.aliyuncs.com/ --dest oss://destbucket.cn-shanghai.oss-dls.aliyuncs.com/ --hadoopConf fs.oss.accessKeyId=LTAI******** --hadoopConf fs.oss.accessKeySecret=KZo1******** --update --parallelism 10

跨区域容灾说明

在 OSS-HDFS 功能支持列表中,跨区域复制(CRR)标注为不适用。CRR 在 Object 层执行复制,而 OSS-HDFS 元数据存储在 .dlsdata 路径下的系统文件中,CRR 无法保证 HDFS 元数据层与 Object 层的一致性。因此,跨 Region 容灾场景请使用本文介绍的 Jindo DistCp 迁移数据,不建议依赖 CRR。

使用限制

  • 一次 Jindo DistCp 命令仅支持指定一个 --src 和一个 --dest,不支持一对多同步。如果在同一条命令中指定多个 --dest,命令仍会执行成功,但数据仅写入最后一个 --dest 指定的目标,其余目标不会更新。

  • 如需将同一份数据同步到多个目标 Bucket,需多次执行 DistCp 命令,每次指定不同的 --dest

  • --disableChecksum:在命令中添加该选项可关闭 Checksum 校验,用于加速数据同步。

更多参考

关于Jindo DistCp的其他使用场景,请参见Jindo DistCp使用说明