DistCp是用于大规模集群间/集群内数据拷贝的工具,实现了不同文件系统间的数据拷贝,本文将介绍如何使用DistCp从OSS中将数据拷贝到TOS
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/
在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方式进行配置:
<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>
# 确定可以通过hdfs命令查看到OSS桶里的文件,需要集群的每个节点都能访问到OSS桶里的文件 hdfs dfs -ls oss://test-bucket/
# 构造 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场景下不要使用。 |