我在远程计算机(具有超线程的四核)上安装了Hadoop 1.2.1,并且正在测试1GB文件(一个文件,未压缩)的MR性能。

当我将分割大小设置为大约250MB时,我有四个映射器。在输出文件(_logs / history / job ....)中,我看到它说TOTAL MAP TASKS = 4
但是,当我将分割大小设置为1GB / 8以便使用8个内核时,我看到日志显示TOTAL MAP TASKS = 7。当拆分大小为1GB / 16时,看看会发生什么,日志显示TOTAL MAP TASKS = 14。这是因为一个核心被指定给jobtracker而无法使用吗?

最佳答案

不幸的是,大多数可能影响 map task 数量的参数比硬性规则和快速规则更接近“建议”。由InputFormat决定它紧跟这些参数的程度。例如,FileInputFormat执行以下操作:

它基于Math.max(minSize, Math.min(maxSize, blockSize))计算splitSize。对于每个文件,它计算将覆盖该大小的拆分数。例如,如果拆分大小为1 GB,并且您有两个大小分别为1.5 GB和2.5 GB的文件,则将获得2 + 3 = 5个拆分。但是,在接近文件末尾时,有时会将这些拆分最多扩展10%。例如,5.1 GB文件上的1 GB拆分大小将使用5个拆分。基于特定的子类实现,还有更多注意事项。

我的意思是,正在发生一些欺骗,但这通常是合理的行为。您应该考虑要设置的参数作为准则,并相信所使用的InputFormat在确定要运行的映射器数量时做的合理。

不,它与内核数量或任务插槽数量无关。这可能会影响可以同时运行的映射器数量,但不会影响映射任务的总数。

关于hadoop - Hadoop:MR启动的映射器少于指定的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20382515/

10-12 19:06