java - Hadoop上下文中Java的内存问题

标签 java hadoop garbage-collection heap

我想在Hadoop框架中计算多路联接。当每个关系的记录从阈值开始变得更大时,我面临两个内存问题,

1)错误:超出了GC开销限制,

2)错误:Java堆空间。

对于链联接和星形联接,阈值是1.000.000 /关系。

在联接计算中,我使用一些哈希表,即

Hashtable< V, LinkedList< K>> ht = new Hashtable< V, LinkedList< K>>( someSize, o.75F);

当我对输入记录进行哈希处理时(仅此刻),会发生这些错误。在散列过程中,我有很多for循环,它们会产生许多临时对象。因此,我得到了1)问题。因此,我通过设置K = StringBuilder(这是最后一类)解决了1)问题。换句话说,我减少了临时对象的数量,只保留了一些其值,内容改变的对象,而没有改变它们本身。

现在,我正在处理2)问题。我通过在文件$ HADOOP_HOME / hadoop / conf / hadoop-env.sh中设置适当的变量来增加群集中每个节点的堆空间。问题仍然存在。我使用VisualVM对堆进行了非常基本的监视。我仅监视主节点,尤其是JobTracker和本地TaskTracker守护程序。在此监视期间,我没有发现任何堆溢出。 PermGen空间也没有溢出。

所以目前,在宣言中,
Hashtable< V, LinkedList< K>> ht = new Hashtable< V, LinkedList< K>>( someSize, o.75F);

我正在考虑设置V = SomeFinalClass。 SomeFinalClass可以帮助我将对象数量保持在较低水平,从而减少内存使用量。当然,默认情况下,SomeFinalClass对象将具有与其内容无关的相同哈希码。因此,我将无法将此SomeFinalClass用作上面的哈希表中的键。为了解决此问题,我正在考虑重写默认的hashCode()方法,并通过类似的String.hashCode()方法重写。此方法将基于SomeFinalClass对象的内容生成哈希码。

您对上述问题和解决方案有何看法?你会怎么做?

我还应该监视DataNode守护程序吗?上面的两个错误是TaskTracker错误,DataNode错误还是两者都存在?

最后,上述解决方案是否可以解决任意数量的记录/关系的问题?还是迟早我会再次遇到相同的问题?

最佳答案

使用ArrayList而不是链表,它将使用更少的内存。
我也建议使用HashMap代替Hash Table,因为后者是旧类。

关于java - Hadoop上下文中Java的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18949658/

相关文章:

java - 如何确定 JNI 全局引用内存泄漏的原因?

C#:垃圾收集器

java - 当一个方法已经被另一个线程执行时跳过该方法

java - 从文件夹中读取所有日志文件

hadoop - 在hbase中有效扫描复合行键

python - 如何在hadoop分布式文件系统(hdfs)上执行python文件(.py)

java - 从 Java 和 Python 调用 native 库时如何释放内存?

java - 撒克逊解析器实现的类未找到异常

Java,静态变量不会从类外部初始化

hadoop - 将数据发送到HDFS中,但出现字符问题