我正在尝试在 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 。
“如果我没理解错的话, 然后如果我在 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/