如果输入的大小很小或者是硬件空闲的一部分,那么映射任务的数量是否由hadoop中的节点数决定?

时间:2013-07-17 14:17:40

标签: hadoop mapreduce

我有一个基本的mapreduce问题。 我的输入包含许多小文件,我设计了一个自定义的CombinedFileInputFormat(它正常工作)。

所有文件的大小只相当于20 000个文件的100 Mb,但处理单个文件需要几分钟(这是一个很重要的索引问题),因此我希望尽可能多的地图任务。将hadoop照顾到这个还是我必须强制执行它以及如何执行它?在后一种情况下,我的第一个猜测是操纵最大分割大小,但我不确定我是否在正确的轨道上。任何帮助非常感谢! (关于如何在后一种情况下最好地设置分割大小的建议也很有帮助)

更清楚的一些额外信息:

然而,另一个原因是我想要为每个任务处理多个文件,这就是我希望能够使用组合器。单个任务的输出仅生成唯一键,但在多个文件之间可能存在大量重叠。通过使用相同的映射任务处理多个文件,我可以实现组合器或使用映射器内组合。这肯定会限制IO的数量。事实是,尽管单个文件的大小为几千字节,但该文件的输出大约为30 * 10 ^ 6个键值对,这很容易导致几千兆字节。 如果每个maptask只有一个文件,我认为还有另一种允许组合(或映射器内组合)的方法吗?

问候,迪特尔

1 个答案:

答案 0 :(得分:1)

为了充分利用长时间运行的地图任务,您可能希望每个文件都在其自己的任务中运行,而不是使用CombineInputFormat的实现。

当您拥有快速处理的小文件时,通常建议使用组合输入格式,因为实例化映射任务(jvm,config等)需要的时间比处理文件本身要长。您可以通过配置“JVM重用”来缓解这种情况,但仍然针对CPU绑定任务(而不是IO绑定任务),您只需要为每个输入文件运行映射任务。

但是,您需要为Job Tracker分配一大块内存,以便它可以管理和跟踪创建的20k地图任务。

编辑:为了回答您的更新问题,如果您想使用组合输入格式,则需要为每个节点/机架设置最小/最大尺寸的配置属性。 Hadoop将无法做任何比在同一地图任务中保持数据本地或机架本地文件更易理解的事情。