在Hadoop中重用静态变量

时间:2015-08-21 14:11:05

标签: java hadoop mapreduce distributed-cache

我正在尝试在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。

修改 看看这篇文章:http://mail-archives.apache.org/mod_mbox/hadoop-mapreduce-user/201206.mbox/%3COFC497A21A.62B05EC6-ON85257A14.006F8FF6-85257A14.006FE8C7@freddiemac.com%3E

&#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线程安全。这是一个不错的选择吗?

1 个答案:

答案 0 :(得分:0)

我猜你有多个线程没有看到变量更新。为什么不直接宣布内联并使其成为最终版?另外CHM可能更合适:

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