我使用的是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任务都会初始化Map器。我担心的是Map器类本身被初始化一次,然后在两个作业之间保持初始化状态。因此,如果我运行job1,myvar将被设置为“myopt1”,然后我运行job2,myvar将保持为“myopt1”,即使我传入了“myopt2”。这种恐惧是没有根据的吗?谢谢。
2条答案
按热度按时间niknxzdl1#
这是没有根据的。对于每项工作
TaskTracker
将启动一个新的jvm示例来运行作业。6rqinv9w2#
如果您将jvm重用配置为大于1的值,那么tasktracker可能会将jvm重新用于计划在该任务跟踪器上运行的后续作业任务(因此jvm重用值为5,其中10个任务最终计划在任务跟踪器上运行,这意味着将生成一个jvm,它将依次运行前5个任务,jvm将被停止,然后第二个jvm将被生成以按顺序运行最后5个任务)。在这种情况下,静态变量将保留值,而jvm对于每个后续的map任务保持活动状态。
此属性是
mapred.job.reuse.jvm.num.tasks
对于v2之前的hadoop和mapreduce.job.jvm.numtasks
对于v2以后的版本