如何在 mapreduce 作业中获得适当大小的输入拆分

How to get appropriate size of input split in mapreduce job

我正在基于 Hortonworks 的 Microsoft HDInsight 中处理 Map-Only MR 作业。我的输入数据约为 1GB,块大小为 128MB。

当我运行我的工作没有设置分割大小时,我的输入数据被分成2个分割,地图任务的数量也是2。这需要很长时间,所以我想通过增加地图任务的数量来加快这个过程。

我通过设置mapreduce.input.fileinputformat.split.minsizemapreduce.input.fileinputformat.split.minsize的值来设置分割数。

首先,我将拆分次数设置为8,此作业耗时为35分钟。然后我设置为16和64,耗时分别是21分钟和16分钟

但是当我将拆分设置为 128 时,这项工作消耗的时间从 16 分钟增加到 18 分钟。

我的问题:

1:为什么地图任务越多时间越长?我知道实例化地图需要一些时间 class,但还有其他原因吗?

2:有没有办法决定最合适的拆分大小?

谢谢 PS: 我的输入文件是没有“.txt”的文本文件。

  1. 时间增加的原因是由于您提到的更多地图任务。映射器的数量和输入分割大小之间总是存在权衡。

在您的情况下,在您的 JVM 中实例化一个 Mapper class 可能比您在 Mapper 中的逻辑花费更多的时间。还有一个原因可能是集群中的资源无法启动 Mapper。其中一些将等到您当前的 tasks/Mappers 完成,然后它们将被实例化。

  1. 我建议通过在 TextInputFormat 中将 reducer 的数量设置为 0 来通过 Mappers 发出数据。然后它写入 x 个文件,每个文件的输入分割大小。