优化策略
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 执行完成!