我正在尝试在hadoop作业中的setup方法中重用静态哈希。
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!
还有其他要设置的参数吗? mappers任务正在消耗许多CPU来分配/填充hashmap。
&#34;如果我理解正确, 然后,如果我在setup()和何时初始化静态变量(比如var) mapper在同一个JVM上第二次启动,那个var就是 在调用setup()之前已经初始化,即它保留了它的值 从以前运行的映射器。 是这样的吗?&#34;
修改 mapred.job.reuse.jvm.num.tasks:不再支持JVM重用 mapreduce.job.jvm.numtasks:不再支持JVM重用
修改 Hadoop 2.x不支持JVM重用。所以我的第一个选择是使用:MultiThreadedMapper。我将使我的HashMap线程安全。这是一个不错的选择吗?
答案 0 :(得分:0)
我猜你有多个线程没有看到变量更新。为什么不直接宣布内联并使其成为最终版?另外CHM可能更合适:
private static final Map<Long,String> amostraTable = new ConcurrentHashMap<>();