在分布式计算过程中,我们有专门的名词来定义不同task处理数据量的差异,叫做data skew(数据倾斜)。在DistCp任务中,对应的情况就是其内部map task需要处理(拷贝)的数据量差异比较大。
在笔者内部测试的一个例子中,笔者打算拷贝300w量级的文件目录,最后发现将近200w的目录分布到了一个map task内,然后造成DistCp的结束不了的情况。后来经过进一步分析,才知道原来是DistCp默认按照数据拷贝大小来均分输入数据到各个map内。这种策略在拥有大规模目录的情况下不见得是适用的,因为目录是没有size的,可理解为其size为0。这样就可能出现目录扎堆聚集的情况。
在上面这种情况下,一种更为妥善的办法是根据数据输入文件数来做均衡,我们确保每个map task需要拷贝相同的一个文件数。不过这里可能又有人会说了,我们怎么保证这些文件中个别文件是超大文件的情况,DistCp拷贝这个超大文件耗时比一般的文件要多很长时间怎么办?
上面说的这种情况是有可能出现的,DistCp采用事前打散输入文件path的方式,来减小这种事情发生的概率,避免大size文件聚集在一个map task内的情况。然后再将打散后的文件按照先后顺序写成split文件后供map task处理。
此过程图如下所示:
上面Seq File内部存储的一对对的K-V对,代表DistCp需要拷贝的目录/文件 path以及在目标FileSystem的全路径名。
上图左边显示的是基于固定文件总Size的Split处理,上图右边的则是基于文件数的Split处理。
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2018 群英 版权所有 茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号-36 粤公网安备 44090202000006号 粤工商备P091701000595