map 和 reduce 作业可以在不同的机器上吗?

can map and reduce jobs be on different machines?

我正在研究一个非常独特的计算卸载解决方案,我可以使用 c++/java 中的自定义编程很好地做到这一点,但我正在寻找可以在 hadoop 中完成的相同方法或任何其他框架?我搜索了很多,但没有找到任何有价值的东西。

正如我们所知,正常的 hadoop 作业由 MapReduce 阶段完成,其中两者都 运行ning 在机器上具有几乎相同的功率,对于映射阶段我们不需要功率并且可以将其卸载到像 RaspberryPI 这样的廉价商品硬件上,而在强大的机器上减少应该 运行。

那么是否可以隔离这两个阶段并让它们具有机器感知能力?

在每个节点上,您可以创建一个 mapred-site.xml 文件来覆盖任何默认设置。这些设置将仅适用于此节点(任务跟踪器)。

然后可以为每个节点指定值

  1. mapreduce.tasktracker.reduce.tasks.maximum
  2. mapreduce.tasktracker.map.tasks.maximum

在您只想 运行 减少任务的节点上,将最大映射任务设置为 0,反之亦然。

这是list of configuration options

Reducer 作业可以 运行 在不同的节点上,但是在强大的机器上 运行ning Reducer 作业有什么优势?

您可以对 Map 和 Reduce 节点使用相同的商用硬件配置。

微调 Map reduce 作业是比较棘手的部分,具体取决于

1) 您的输入尺寸

2) Mapper 完成 Map 作业所花费的时间

3) 设置 Map & Reducer 作业数

等等

除了 Gerhard 建议的配置更改外,请查看一些微调性能的技巧 Job

关于适当调整 map 和 reduce 任务数量的提示

Diagnostics/symptoms:

1) 每个 map 或 reduce 任务在 30-40 秒内完成。

2) 大型作业没有利用集群中的所有可用插槽。

3) 在大多数映射器或缩减器被调度后,一两个仍然处于待处理状态,然后 运行s 单独存在。

调整作业的 map 和 reduce 任务的数量很重要。一些小技巧。

1) 如果每个任务花费的时间少于 30-40 秒,则减少任务的数量。

2)如果一个作业的输入超过1TB,可以考虑将输入数据集的块大小增加到256M甚至512M,这样任务的数量就会变少。

3) 只要每个任务 运行s 至少 30-40 秒,将映射器任务的数量增加到集群中映射器插槽数量的某个倍数。

4) 不要安排太多的 reduce 任务——对于大多数工作。 reduce 任务的数量应等于或略小于集群中 reduce 插槽的数量。

如果你还想有不同的配置,看看这个question and Wiki link

编辑:

在1.x中配置mapred.map.tasks(或在2.x版本中配置mapreduce.job.maps) & [= 1.x 中的 71=](或 2.x 版本中的 mapreduce.job.reduces) 根据硬件配置相应地在您的节点中。在更好的硬件节点上配置更多的 reducer。但在配置这些参数之前,请确保您已经处理好 INPUT 大小、地图处理时间等