java - 在 Hadoop 中重用静态变量

标签 java hadoop mapreduce distributed-cache

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

编辑: 看这个帖子:http://mail-archives.apache.org/mod_mbox/hadoop-mapreduce-user/201206.mbox/%3COFC497A21A.62B05EC6-ON85257A14.006F8FF6-85257A14.006FE8C7@freddiemac.com%3E

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

相关文章:

java - 在启动 Ubuntu 时运行程序

python - 经过快速启动后,在访问 hadoop 时遇到一些问题

java - 在 Spring 中将服务 bean Autowiring 到 XML 定义的 bean 中

java - Liferay Json Web服务参数输入

java - 如何传递授权参数?

linux - 在构建面向性能的 linux 服务器以运行不同的应用程序时如何选择硬件?

hadoop - 如何在 Apache Hadoop 2 中使用 HDFS Intra-DataNode 磁盘平衡器?

java - 如何在 hadoop 中将 reducer 输出作为 xml 格式

java - 无法在hadoop3.1.3中运行jar文件

hadoop - 寻找对 Hadoop 的整体评论