3

嗨,我有一个 Map Reduce 任务,比如 AverageScoreCalculator,它有映射器和减速器。问题是我静态初始化 AverageScoreCalculator 中的几个字段对 mapper 和 reducer 都可用?

4

3 回答 3

3

默认情况下,每个 map 和 reduce 任务在不同的 JVM 中运行,并且可以在节点上的任何特定实例上运行多个 JVM。

设置以下属性

mapred.job.reuse.jvm.num.tasks = -1
mapreduce.tasktracker.map.tasks.maximum = 1
mapreduce.tasktracker.reduce.tasks.maximum = 1
mapreduce.job.reduce.slowstart.completedmaps = 1

并且只有一个映射器/减速器在给定节点上运行,并具有 JVM 重用,并且在所有映射器完成处理之前,减速器不会启动。

需要注意的几件事

  1. 上述方法适用于 MapReduce 1x 版本,并不是一种有效的方法

  2. MapReduce 2x 版本不支持 JVM 重用。

于 2012-07-16T04:51:36.923 回答
1

如果静态字段在 map 或 reduce 程序中动态更新,则会产生问题。独立和伪分布式模式适用于初学者,只有在学习 Hadoop 时才应使用。这些模式在处理大量数据时无济于事,这是地图的主要目标 - 减少编程实践。

当作业分布在节点上时,静态信息将丢失。重新考虑使用静态变量。

如果可以的话,粘贴map和reduce程序以及需要静态字段,我们可以有更好的解决方案。

于 2012-07-16T09:05:38.637 回答
0

您应该首先知道您的工作将在哪种配置/模式下运行。

例如,如果您在本地(独立)模式下运行,那么将只有一个 JVM 运行您的作业。如果您以伪分布式模式运行它,该作业将使用您机器上的多个 JVM 运行。如果您以分布式模式运行它,它们将在不同的机器上运行,当然还有不同的 JVM(使用 JVM 重用)

于 2012-07-16T07:45:20.283 回答