java在hadoop中重用静态变量

zaqlnxep  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(420)

我试图在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线程安全。这是一个好的选择吗?

mu0hgdu0

mu0hgdu01#

我猜您有多个线程没有看到变量更新。你为什么不直接把它声明为内联的,并使它成为最终的呢?此外,chm可能更合适:

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

相关问题