【问题标题】:Can hadoop map/reduce be speeded up by splitting data size?可以通过拆分数据大小来加速 hadoop map/reduce 吗?
【发布时间】:2016-01-19 09:57:29
【问题描述】:

我可以通过将输入数据分成更小的块来增加我的 hadoop map/reduce 作业的执行时间吗?

第一个问题: 例如,我有 1GB 的输入文件用于映射任务。我的默认块大小是 250MB。所以只有 4 个映射器将被分配来完成这项工作。如果我将数据分成 10 块,每块将是 100MB,那么我有 10 个映射器来完成这项工作。但是每个分割块会在存储中占用 1 个块,这意味着每个分割数据块将浪费 150MB。如果我不想更改存储的块大小,在这种情况下应该怎么做?

第二个问题:如果我在映射作业之前拆分输入数据,它可以提高映射作业的性能。因此,如果我想对减少工作做同样的事情,我应该要求 mapper 在将数据提供给 reducer 之前拆分数据还是应该让 reducer 来做?

非常感谢。如果我也误解了什么,请纠正我。 Hadoop对我来说很新。因此,我们将不胜感激。

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    当您将块大小更改为 100 MB 时,150 MB 不会浪费。它仍然是系统可用的内存。

    如果增加Mappers,并不代表一定会提高性能。因为这取决于您拥有的数据节点的数量。例如,如果你有 10 个 DataNode -> 10 个 Mapper,那就很划算了。但是如果你有 4 个数据节点 -> 10 个映射器,显然所有映射器不能同时运行。所以如果你有 4 个数据节点,最好有 4 个块(块大小为 250MB)。

    Reducer 类似于所有映射器输出的合并,您不能要求 Mapper 拆分数据。相反,您可以通过定义Combiner 来要求 Mapper 执行 mini-reduce。组合器只不过是在执行映射器的同一节点中的一个减速器,在发送到实际的减速器之前运行。因此 I/O 将被最小化,实际 reducer 的工作也是如此。引入组合器将是提高性能的更好选择

    祝 Hadoop 好运!!

    【讨论】:

    • 嗨@Thanga,所以这意味着1个数据节点一次只能执行1个映射任务?
    • 它实际上不是数据节点。执行此映射器任务的是 TaskTracker。此任务跟踪器一次处理一个映射器
    【解决方案2】:

    根据节点中可用的映射槽数,可以在一个节点中为同一个作业运行多个并行映射器。所以,制作更小的输入片段应该会给你更多的并行映射器并加快进程。(如何将所有片段作为单个输入输入? - 将它们全部放在一个目录中并添加作为输入路径)

    在 reducer 方面,您可以组合多个输出文件进行后处理,您可以设置更多的 reducer,并且运行的最大并行 reducer 可能是集群中可用的 reduce shot 的数量。这应该会提高集群利用率并加快归约阶段。

    如果可能,您也可以使用组合器来减少磁盘和网络 I/O 开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多