嗨我有一个Map Reduce任务说AverageScoreCalculator有mapper和reducer。 问题是我静态初始化AverageScoreCalculator中的几个字段是否可以映射到mapper和reducer?
答案 0 :(得分:2)
默认情况下,每个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
并且在给定节点上只有一个mapper / reducer运行并且JVM重用,并且在所有映射器完成处理之前,reducers不会启动。
需要注意的事项
上述方法适用于MapReduce 1x版本,不是一种有效的方法。
MapReduce 2x版本不支持JVM重用。
答案 1 :(得分:1)
如果静态字段在map或reduce程序中动态更新,则会产生问题。独立和伪分布式模式适用于初学者,只有在学习Hadoop时才能使用。这些模式在处理大量数据时无济于事,这是地图的主要目标 - 减少编程实践。
当作业分布在节点上时,静态信息将丢失。重新考虑使用静态变量。
如果可以,粘贴地图并减少程序和静态字段的需要,我们可以为此提供更好的解决方案。
答案 2 :(得分:0)
您应该首先知道您的工作将在哪个配置/模式下运行。
例如,如果您以本地(独立)模式运行,则只有一个JVM运行您的作业。 如果以伪分布式模式运行,则将使用计算机上的多个JVM运行作业。 如果以分布式模式运行它们,它们将在不同的机器上运行,当然还有不同的JVM(使用JVM重用)