我试图在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。但是每个Map程序都在记录:hashmap分配!
还有其他参数要设置吗?mappers任务消耗大量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),并且当Map器在同一个jvm上第二次启动时,在调用setup()之前,该var就已经被初始化了,也就是说,它从以前运行的Map器中保留了它的值。是这条路吗?”
编辑mapred.job.reuse.jvm.num.tasks:不再支持jvm重用mapreduce.job.jvm.numtasks:不再支持jvm重用
EditHadoop2.x不支持jvm重用。所以我的第一个选择是使用:multi-threadedmapper。我将使我的hashmap线程安全。这是一个好的选择吗?
1条答案
按热度按时间mu0hgdu01#
我猜您有多个线程没有看到变量更新。你为什么不直接把它声明为内联的,并使它成为最终的呢?此外,chm可能更合适: