我正在管理一个在多个用户之间共享的 Hadoop 集群。我们经常使用极其缓慢的映射器运行作业。例如,我们可能有一个 32 GB 的句子文件(每行一个句子),我们想要 NLP 解析(每个句子需要 100 毫秒)。如果块大小为 128 MB,则为 250 个映射器。这填满了我们相当小的集群(每个节点 9 个节点乘以 12 个映射器是 108 个映射器),但每个映射器需要很长时间才能完成(小时)。
问题是,如果集群是空的并且启动了这样的作业,它会使用集群上的所有映射器。然后,如果其他人想要做一个短期工作,它会被阻止几个小时。我知道新版本的 Hadoop 支持公平调度器中的抢占(我们使用的是容量调度器),但新版本也不稳定(我焦急地等待下一个版本)。
曾经有指定映射器数量的选项,但现在JobConf已被弃用(奇怪的是,它在 0.20.205 中没有被弃用)。这将缓解这个问题,因为有了更多的映射器,每个映射任务将在更小的数据集上工作,从而更快地完成。
在 0.20.203 中有没有办法解决这个问题?我是否需要子类化我的 InputFormat(在本例中为 TextInputFormat)?如果是这样,我究竟需要指定什么?