DistCp 性能优化

1,550 阅读1分钟

优化策略

1.小文件同步使用 local 模式,不走 yarn
2.distcp 任务启用 -direct 参数,不生成中间文件,直接写结果文件,减少 rpc 调用次数
3.修改 distcp 源码,在指定 -direct 参数情况下,不需要删除 .distcp.tmp. 文件(HADOOP-16872)

详细分析

问题发现

针对,优化策略中的第 3 点进行详细分析。 首先,按照优化思路 1 执行 distcp,发现同步某个文件的时候,总会有 10分钟左右的等待,如下图所示 查看文件大小 39.1k,目录大小, 96W

源码分析

通过分析 distcp 相关代码,发现是卡在了删除临时文件的逻辑上。该逻辑中的 targetFS.globStatus 是根据模式匹配 targetWorkPath 路径下的所有子路径,找到满足条件的 .distcp.tmp. 路径,最后批量删除。

优化

所以,当 distcp 指定 -direct 参数时候(不会生产中间文件),这块逻辑就无需触发了,因此加上判断,如果指定了 -direct 参数,那么直接返回即可

性能测试:

代码优化后,重新测试 distcp,没有卡住的现象发生,执行时间从原来的 10min 以上, 缩减为 29s 执行完成!