Mapper类是基于每个作业初始化的吗?

时间:2013-11-20 16:20:27

标签: java hadoop mapreduce

我正在使用Hadoop,我想使用静态变量来减少我必须进行的方法调用次数。以下是我使用静力学的方法:

public class Mapper<Types...> extends Mapper <Types...> {
    protected static volatile String myVar;

    @Override
    public final void setup(Context context) {
        if (myVar == null)
            myVar = context.getConfiguration().get("myOpt");
    }
}

我知道每个地图任务都会初始化一个Mapper。我担心的是Mapper类本身被初始化一次,然后在作业之间保持初始化。因此,如果我运行job1,myVar将被设置为“myOpt1”,然后我运行job2,myVar将保持“myOpt1”,即使我传入了“myOpt2”。这种担心是否毫无根据?感谢。

2 个答案:

答案 0 :(得分:2)

如果将JVM重用配置为大于1的值,那么TaskTracker将重新使用JVM用于计划在该任务跟踪器上运行的后续作业任务(因此jvm重用值为5,包含10个任务)是合理的最终计划在任务跟踪器上运行意味着将生成一个JVM,它将按顺序运行前5个任务,JVM将停止,然后将生成第二个JVM以按顺序运行最后5个任务)。在这种情况下,静态变量将保留值,而JVM在每个后续映射任务中保持活动状态。

对于v2 hadoop,此属性为mapred.job.reuse.jvm.num.tasks,对于v2向前,此属性为mapreduce.job.jvm.numtasks

答案 1 :(得分:1)

没有根据。对于每个作业,TaskTracker将启动一个新的JVM实例来运行该作业。