繁体   English   中英

在Hadoop中重用静态变量

[英]Reuse static variable in Hadoop

我正在尝试在hadoop作业中的设置方法内重用静态哈希。

    private static Map<Long,String> amostraTable = null; //class variable

    protected void setup(Context context) throws IOException,
            InterruptedException {

    if (amostraTable == null){
                amostraTable = new HashMap<Long,String>();
                System.out.println("Hashmap allocated!");
            } else{
                System.out.println("Hashmap reused");
                return ;
            }
}

我设置mapreduce.job.jvm.numtasks=-1我只想重用哈希图。 但是每个映射器都在记录日志:已分配Hashmap!

还有其他参数要设置吗? 映射器任务正在消耗许多CPU来分配/填充哈希图。

编辑:看这篇文章: http : //mail-archives.apache.org/mod_mbox/hadoop-mapreduce-user/201206.mbox/%3COFC497A21A.62B05EC6-ON85257A14.006F8FF6-85257A14.006FE8C7@freddiemac.com%3E

“如果我理解正确,那么如果我在setup()中初始化一个静态变量(例如var),并且当在相同的JVM上第二次启动映射器时,该var将在调用setup()之前已经被初始化,即保留以前运行的映射器的值。这样吗?”

编辑 mapred.job.reuse.jvm.num.tasks:不再支持JVM重用mapreduce.job.jvm.numtasks:不再支持JVM重用

编辑 Hadoop 2.x不支持JVM重用。 所以我的第一个选择是使用:MultiThreadedMapper。 我将使我的HashMap线程安全。 这是一个好选择吗?

我猜你有多个线程没有看到变量更新。 您为什么不直接内联声明并使其最终化呢? CHM也可能更合适:

private static final Map<Long,String> amostraTable = new ConcurrentHashMap<>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM