gpt4 book ai didi

java - 在 Hadoop 中重用静态变量

转载 作者:可可西里 更新时间:2023-11-01 14:58:08 26 4
gpt4 key购买 nike

我正在尝试在 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 。但是每个映射器都在记录:Hashmap 已分配!

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

编辑:看这个帖子: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<>();

关于java - 在 Hadoop 中重用静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32142517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com