You need to enable JavaScript to run this app.
导航
Distcp从OSS拷贝数据到TOS
最近更新时间:2024.07.11 11:44:52首次发布时间:2024.07.11 11:44:52

DistCp是用于大规模集群间/集群内数据拷贝的工具,实现了不同文件系统间的数据拷贝,本文将介绍如何使用DistCp从OSS中将数据拷贝到TOS

1 HDFS集成Proton访问TOS

请参考Proton访问TOS配置

2 HDFS集成Jindo访问OSS

2.1 Jindosdk准备

  1. 下载并解压最新版本的jindosdk-${version}.tar.gz。下载地址
  2. 对于集群任一节点,将jindo-core-${version}.jar、jindosdk-${version}.jar添加到hadoop的classpath下
tar zxvf jindosdk-x.x.x-linux.tar.gz

# add link
ln -sf jindo-core-${version}.jar $HADOOP_HOME/share/hadoop/hdfs/lib/
ln -sf jindosdk-${version}.jar $HADOOP_HOME/share/hadoop/hdfs/lib/

2.2. 配置文件修改

在core-site.xml中添加对象存储的FileSystem实现类,以OSS为例

<configuration>
    <property>
        <name>fs.AbstractFileSystem.oss.impl</name>
        <value>com.aliyun.jindodata.oss.OSS</value>
    </property>
    <property>
        <name>fs.oss.impl</name>
        <value>com.aliyun.jindodata.oss.JindoOssFileSystem</value>
    </property>
</configuration>

访问对象存储需要region、认证信息,可以通过core-site.xml方式进行配置:

  • core-site.xml
<configuration>
    <property>
        <name>fs.oss.accessKeyId</name>
        <value>********</value>
    </property>

    <property>
        <name>fs.oss.accessKeySecret</name>
        <value>********</value>
    </property>

    <property>
        <name>fs.oss.endpoint</name>
        <!-- 阿里云ECS环境下推荐使用内网OSS Endpoint,即oss-cn-xxx-internal.aliyuncs.com -->
        <value>oss-cn-xxx.aliyuncs.com</value>
    </property>
</configuration>

2.3. 验证配置访问OSS的连通性

# 确定可以通过hdfs命令查看到OSS桶里的文件,需要集群的每个节点都能访问到OSS桶里的文件
hdfs dfs -ls oss://test-bucket/ 

3 使用DistCp命令进行数据迁移

# 构造 DistCp命令将HDFS数据拷贝到TOS
 hadoop distcp \
 -Dmapreduce.job.queuename=default \
 -Dmapreduce.job.name=oss->tos  \
 -i  \
 -update \
 -delete  \
 -direct \
 -m 50 \
 -bandwidth 50 \
 -numListstatusThreads=40 \
 -skipcrccheck \
 oss://bucket-name/source_path \
 tos://bucket-name/my_target_path  

参数配置:

参数

说明

-m

最大的拷贝并行度,对应的是DistCp作业中最大的map数量

-bandwidth

每个map能使用的最大带宽,单位是MB/s。通过-m和-bandwidth参数来控制distcp作业的拷贝限速,速度上限=map数量 * bandwidth

-numListstatusThreads

从namenode中获取元数据信息的线程数

-update

把src存在target不存在 & src与target都存在但内容不同的文件拷贝到target

-delete

src不存在但target存在的文件,从target删除

-useiterator

使用iterator来构建CopyListing,避免OOM

-i

忽略DistCp过程中报错

-direct

Distcp默认会先写一个临时文件再rename为target文件,使用-direct后会直接将数据写到target

-atomic

会把所有文件拷贝到一个临时目录,待全部拷贝完成后统一rename到target下,在TOS场景下不要使用。