java - Mapper 类是在每个作业的基础上初始化的吗?

标签 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");
    }
}

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

最佳答案

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

这个属性是 mapred.job.reuse.jvm.num.tasks for v2 hadoop 和 mapreduce.job.jvm.numtasks for v2 onwards

关于java - Mapper 类是在每个作业的基础上初始化的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20101235/

相关文章:

java - 当大多数类并发时,如何找出java中的争用问题

java - 当抛出 StackOverflowError 时,Java 堆栈会发生什么?

java - hadoop eclipse插件未将代码部署到hadoop集群

scala - 使用hadoop parquet处理大数据到CSV输出

java - Hadoop Map Reduce For Google web graph

java - HADOOP - 无法初始化 MapOutputCollector org.apache.hadoop.mapred.MapTask$MapOutputBuffer java.lang.ClassCastException : class java. lang.Double

java - android studio 生成Javadoc失败

java - 遍历 HashMap 中的 ArrayList 时出错

java - 在 apache hadoop 中执行 helloworld.java

hadoop负载均衡