DistCp(distributed copy)是用于大型内部/集群内复制的工具。它使用 MapReduce 来实现其分发、错误处理和恢复、报告的功能。它将文件和目录的列表扩展为映射任务的输入,每个任务将复制源列表中指定的文件的分区。DistCp 是 Hadoop 自带的文件迁移工具。
在迁移数据的过程中,如果单个目录下数据量较大那么使用 distcp 直接同步整个目录,则会有同步时间长、同步报错的问题。这种情况建议是将这个目录进行拆分再进行同步。
如下脚本用于将数据目录拆分后的同步。其中使用的是hadoop用户提交任务;默认最大discp任务并行个数为 10;distcp同步日志在当前目录下的logs目录下。
#!/bin/bash
if [ ! -n "$1" ] ;then
echo "you have not input a file!"
else
echo "the file you input is $1"
fi
dataline=$(cat $1 | awk -F "," '{print $1}')
# 源集群的schema
sourceCluster=hdfs://172.16.77.187:4007
# 目标集群的schema
targetCluster=hdfs://172.16.77.128:4007
#最大discp任务并行个数
runningnum=10
export HADOOP_USER_NAME=hadoop
num=0
for line in $dataline
do
num=$[$num+1]
echo "source Cluster files:" ${sourceCluster}${line}
echo "target Cluster files:" ${targetCluster}${line}
echo "The number of discp tasks: $num "
task_name=`echo $line | awk -F"/" '{print $NF}'`
echo "discp task name: $task_name "
runningapp=$(ps -ef | grep distcp |wc -l)
echo "The number of discp tasks running in the cluster:" $runningapp
while [ $runningapp -ge $runningnum ]
do
runningapp=$(ps -ef | grep distcp |wc -l)
echo "yarn正在执行的 distcp 任务数:"$runningapp",sleep 5秒...."
sleep 5
done
dir=`dirname $1`
cd $dir
fullPath=`pwd -P`
mkdir ${fullPath}/logs &>>/dev/null
#可按照具体的情况调整
#使用-update -delete 进行同步
nohup hadoop distcp -Dmapreduce.job.name=$task_name -Dmapreduce.map.memory.mb=4096 -pbugpt -i -strategy dynamic -skipcrccheck -update -delete -numListstatusThreads 30 -bandwidth 100 -m 10 ${sourceCluster}${line} ${targetCluster}${line} > ${fullPath}/logs/${task_name}.log 2>&1 &
#使用 -overwrite 进行同步
#nohup hadoop distcp -Dmapreduce.job.name=$task_name -Dmapreduce.map.memory.mb=4096 -pbugpt -i -strategy dynamic -skipcrccheck -overwrite -numListstatusThreads 30 -bandwidth 100 -m 10 ${sourceCluster}${line} ${targetCluster}${line} > ${fullPath}/logs/${task_name}.log 2>&1 &
sleep 0.1
done
wait
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。