我正在管理一个由多个用户共享的 Hadoop 集群。我们经常使用极慢的映射器运行作业。例如,我们可能有一个 32 GB 的句子文件(每行一个句子),我们想要对其进行 NLP 解析(比如每个句子需要 100 毫秒)。如果 block 大小为 128 MB,则为 250 个映射器。这会填满我们相当小的集群(9 个节点乘以每个节点 12 个映射器是 108 个映射器),但每个映射器需要很长时间才能完成(数小时)。
问题是如果集群是空的并且启动了这样的作业,它会使用集群上的所有映射器。然后,如果其他人想要做一份空头工作,它就会被封锁数小时。我知道较新版本的 Hadoop 支持 Fair Scheduler 中的抢占(我们正在使用 Capacity Scheduler),但较新版本也不稳定(我正在焦急地等待下一个版本)。
以前有specifying the number of mappers的选项但是现在JobConf已弃用(奇怪的是,它是 not deprecated in 0.20.205 )。这将缓解这个问题,因为有了更多的映射器,每个映射任务将在更小的数据集上工作,从而更快地完成。
在 0.20.203 中有解决这个问题的方法吗?我是否需要继承我的 InputFormat(在本例中为 TextInputFormat)?如果是这样,我到底需要指定什么?
最佳答案
我相信您应该能够增加这些文件的 block 大小:如果您这样做,那么您的应用程序自然会使用更少的映射器。
还请记住,作业配置中有 map.input.length 参数。这会增加拆分,因此您实际上拥有更少的映射器和更大的输入。
关于java - Hadoop 作业调度以及 0.20.203 中映射器较慢的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8156316/