我们有许多 distcp 作业将数据从主集群复制到备份集群。 这些作业全天运行,并复制关键数据库的几乎所有表。我们在这里使用webhdfs。
其中一些作业运行数小时(对于表(ORC格式的)是巨大的。有什么方法可以优化两个集群之间的 distcp 操作。欢迎任何建议。
我们尝试使用带宽来加快速度。 以下是我们脚本的摘录。
PROP="-Dmapreduce.task.timeout=300000 -Dmapred.job.queue.name=$YARN_QUEUE -Dmapred.job.name="cpy-${jobName}" -bandwidth 800 "
hadoop distcp ${PROP} $1 WEBHDFS://$DESTNAMENODE$2>> $3 2>&1
在调整 distcp 性能时,我通常会看三件事;
- 用于 distcp 操作的映射器数
"-m"选项将允许您指定使用的地图任务数量,可以说是同时复制的最大数量。尝试运行副本几次,然后逐渐增加此数字,以查看最适合你的方案的方法。
- 战略动态
您可以使用"-strategy dynamic"标志运行 DistCp 作业,该标志将"动态"调整地图大小,使速度更快或响应速度更快的节点能够复制比速度较慢或繁忙的节点更多的数据。您可以在 DistCp 手册中阅读有关此内容的更多信息。
- 带宽
看起来您已经尝试了"带宽"选项,但我想在这里提及它,因为它绝对是一个重要因素。如果您的网络允许,请尝试进一步增加此值。