【Hadoop-CosDistcp-Distcp】通过命令方式将Cos中的数据迁移至HDFS,再将HDFS数据迁移至S3
1)Shell 脚本
注意:此 Shell 脚本内置了按照 sample_date 循环、并发执行的功能,实际使用根据需求调整并发或去除并发即可。
cosDbName=${cosDbName}
x8vDbName=${x8vDbName}
x5lTableName=${x5lTableName}
x8vTableName=${x8vTableName}
sampleDateFile=${sampleDateFile}
parallelism=${parallelism}
start_time=`date +%s` #定义脚本运行的开始时间
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1 #创建有名管道
exec 3<>/tmp/fd1 #创建文件描述符,以可读(<)可写(>)的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性
rm -rf /tmp/fd1 #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
for ((i=1;i<=${parallelism};i++))
do
echo >&3 #&3代表引用文件描述符3,这条命令代表往管道里面放入了一个"令牌"
done
for date in `cat /opt/corns/${sampleDateFile}`
do
read -u3
{
kinit -kt /opt/conf/x9e.keytab xxx@TEST.XXX.COM
yarn jar /opt/corns/cos-distcp-1.12-3.1.0.jar -libjars /opt/corns/cos_api-bundle-5.6.69.jar,/opt/corns/hadoop-cos-3.1.0-8.1.7.jar \
-Dfs.cosn.credentials.provider=org.apache.hadoop.fs.auth.SimpleCredentialProvider \
-Dfs.cosn.userinfo.secretId=******************************** \
-Dfs.cosn.userinfo.secretKey=******************************** \
-Dfs.cosn.bucket.region=ap-guangzhou \
-Dfs.cosn.impl=org.apache.hadoop.fs.CosFileSystem \
-Dfs.AbstractFileSystem.cosn.impl=org.apache.hadoop.fs.CosN \
-Dmapred.job.queue.name=*** \
--bandWidth=50 \
--taskNumber=10 \
--workerNumber=1 \
--jobName=cos2hdfs-${x5lTableName}-${date} \
--skipMode=length \
--checkMode=length \
--src cosn://buckets-name/user/x5l/hive/${cosDbName}/${x5lTableName}/sample_date=${date}/ \
--dest hdfs://prdns/warehouse/tablespace/external/hive/${x8vDbName}.db/${x8vTableName}/sample_date=${date}/
hadoop distcp \
-D mapred.task.timeout=60000000 \
-D mapreduce.job.name=hdfs2s3-${x8vTableName}-${date} \
-Dmapred.job.queue.name=x9e \
-Dfs.s3a.access.key=******************* \
-Dfs.s3a.secret.key=************************************** \
-Dfs.s3a.endpoint=test01obs.gaccloud.com.cn \
-Dfs.s3a.connection.ssl.enabled=true \
-Dfs.s3a.signing-algorithm=S3SignerType \
-Dfs.s3a.ssl.channel.mode=default_jsse_with_gcm \
-direct \
-bandwidth=150 \
-m=20 \
-numListstatusThreads=40 \
hdfs://prdns/warehouse/tablespace/external/hive/${x8vDbName}.db/${x8vTableName}/sample_date=${date}/* \
s3a://buckets-name/prd/data/${x8vDbName}/${x8vTableName}/sample_date=${date}/
if [ $? -eq 0 ]; then
echo ${date}": succeed"
else
break
fi
echo >&3
} &
done
wait
stop_time=`date +%s` #定义脚本运行的结束时间
echo "TIME:`expr $stop_time - $start_time`"
exec 3<&- #关闭文件描述符的读
exec 3>&- #关闭文件描述符的写
2)参数说明
Cos2HDFS:
-Dmapred.job.queue.name
:任务在 Yarn 中的队列名称--bandWidth
:带宽--taskNumber
:相当于map数量--workerNumber
:并行执行的worker数量--jobName
:任务名称--skipMode
:数据校验方式--checkMode
:数据校验方式--src
:源路径--dest
:目标路径
详细说明请参考:【Hadoop-CosDistcp】通过CosDistcp的方式迁移Cos中的数据至HDFS
HDFS2S3:
-Dmapred.job.queue.name
:任务在 Yarn 中的队列名称-direct
:用于构建文件清单的线程数(最多40个),当文件目录结构复杂时应该适当增大该值-bandwidth
:以MB/second为单位指定每个map的带宽-m
:限制同步启动的map数,默认每个文件对应一个map,每台机器最多启动20个map
详细说明请参考:【Hadoop-Distcp】工具简介及参数说明