1

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

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

一些额外的信息更清楚:

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

问候,迪特

4

1 回答 1

1

为了获得长期运行的地图任务的最佳利用率,您可能希望每个文件在其自己的任务中运行,而不是使用您的 CombineInputFormat 实现。

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

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

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

于 2013-07-18T02:02:20.957 回答