减速机的堆内存不足

时间:2012-01-02 22:20:45

标签: hadoop mapreduce apache-pig

所以我有一些Pig脚本在那里继续死亡,减少了Java堆堆空间不足的错误。到目前为止,我唯一的解决方案是增加减速机数量,但这似乎并没有让我在任何地方可靠。现在,部分原因可能只是我们获得的数据大幅增长,但无法确定。

我已经考虑过更改溢出阈值设置,无法调用设置,但不确定它们是否可以帮助任何设置,或者只是减慢设置速度。我还可以考虑做些什么来解决这个问题?

另一方面,当这种情况开始发生时,我也会得到关于bash无法获取内存的错误,因为我认为是溢出操作。这会是Hadoop节点耗尽的内存吗?如果是这样,只需将这些盒子上的堆大小调低就可以了吗?

编辑1
1)猪0.8.1
2)唯一的UDF是一个eval udf,它只查看没有包或地图的单行 3)我没有注意到有任何热点坏密钥分配。我一直在使用素数量表来减少这个问题。

编辑2
这是有问题的错误:
2012-01-04 09:58:11,179 FATAL org.apache.hadoop.mapred.TaskRunner: attempt_201112070707_75699_r_000054_1 : Map output copy failure : java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1508) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1408) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1261) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1195)

以下是我不断得到的bash错误:
java.io.IOException: Task: attempt_201112070707_75699_r_000054_0 - The reduce copier failed at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:380) at org.apache.hadoop.mapred.Child.main(Child.java:170) Caused by: java.io.IOException: Cannot run program "bash": java.io.IOException: error=12, Cannot allocate memory at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) at org.apache.hadoop.util.Shell.runCommand(Shell.java:149) at org.apache.hadoop.util.Shell.run(Shell.java:134) at org.apache.hadoop.fs.DF.getAvailable(DF.java:73) at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:329) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:124) at org.apache.hadoop.mapred.MapOutputFile.getInputFileForWrite(MapOutputFile.java:160) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.doInMemMerge(ReduceTask.java:2537) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.run(ReduceTask.java:2501)

2 个答案:

答案 0 :(得分:3)

显然你的某个地方已经没钱了。增加减速器的数量实际上是非常合理的。查看JobTracker Web GUI上的统计信息,查看映射器中有多少字节。除以减少任务的数量,这是每个减速器得到的相当粗略的估计。不幸的是,如果您的密钥均匀分布,这只能在长期运行。

在某些情况下,JOIN(尤其是复制类型)会导致此类问题。当您拥有特定密钥的“热点”时会发生这种情况。例如,假设您正在进行某种连接,其中一个键显示50%的时间。无论什么减速机能够幸运地处理这把钥匙都会被破坏。您可能想要调查哪些键导致热点并相应地处理它们。在我的数据中,通常这些热点无论如何都是无用的。要了解什么是热点,只需执行GROUP BYCOUNT并找出显示出来的内容。然后,如果它没用,只需FILTER即可。

此问题的另一个原因是Java UDF聚合了太多数据。例如,如果您有一个通过数据包的UDF并将记录收集到某种列表数据结构中,那么您可能会使用热点值来记忆。

我发现较新版本的Pig(特别是.8和.9)的内存问题要少得多。在.7中我有很多用完堆的实例。这些版本有更好的溢出到磁盘检测,所以如果它即将吹出堆,它足够智能溢出到磁盘。


为了让我更有帮助,您可以发布您的Pig脚本,并提及您正在使用的Pig版本。

答案 1 :(得分:1)

我不是一位经验丰富的用户或其他任何人,但在VM上运行Pig作业时遇到了类似的问题。

我的特殊问题是,VM没有配置交换空间,最终会耗尽内存。我猜你是在正确的linux配置中尝试这个,但做一个:free -m并看看你得到的结果可能没什么坏处,可能问题是由于你配置的交换内存太少。

只是一个想法,让我知道它是否有帮助。祝你好运!