hadoop - 在输入量较小或者部分硬件空闲的情况下,map任务的数量是由hadoop中的节点数量决定的吗?

标签 hadoop mapreduce

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

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

一些额外的信息更清楚:

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

问候,迪特尔

最佳答案

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

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

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

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

关于hadoop - 在输入量较小或者部分硬件空闲的情况下,map任务的数量是由hadoop中的节点数量决定的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17702264/

相关文章:

sql - 添加具有从配置单元中现有列连接的值的新列

java - 在使用 hadoop 从原始日志中捕获异常时,一个完整的异常将被拆分为 2 个映射

hadoop - Hive(0.12.0)-使用分区,存储桶和附加索引将数据加载到表中

Mongodb_Hadoop MapReduce

java - 如何使用 Oozie 运行 MapReduce ToolRunner 作业?

java - 如何连接三张 table ?

hadoop - MapReduce不会减少?

hadoop - 如果输入数据源在 HDFS 中不断增加,MapReduce 作业会发生什么情况?

hadoop - 如何在 Hive Web 界面中编写查询

ubuntu - 在vmWare中关闭计算机后,Hadoop连接拒绝错误,我该如何解决?