所以我有一些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)
答案 0 :(得分:3)
显然你的某个地方已经没钱了。增加减速器的数量实际上是非常合理的。查看JobTracker Web GUI上的统计信息,查看映射器中有多少字节。除以减少任务的数量,这是每个减速器得到的相当粗略的估计。不幸的是,如果您的密钥均匀分布,这只能在长期运行。
在某些情况下,JOIN
(尤其是复制类型)会导致此类问题。当您拥有特定密钥的“热点”时会发生这种情况。例如,假设您正在进行某种连接,其中一个键显示50%的时间。无论什么减速机能够幸运地处理这把钥匙都会被破坏。您可能想要调查哪些键导致热点并相应地处理它们。在我的数据中,通常这些热点无论如何都是无用的。要了解什么是热点,只需执行GROUP BY
和COUNT
并找出显示出来的内容。然后,如果它没用,只需FILTER
即可。
此问题的另一个原因是Java UDF聚合了太多数据。例如,如果您有一个通过数据包的UDF并将记录收集到某种列表数据结构中,那么您可能会使用热点值来记忆。
我发现较新版本的Pig(特别是.8和.9)的内存问题要少得多。在.7中我有很多用完堆的实例。这些版本有更好的溢出到磁盘检测,所以如果它即将吹出堆,它足够智能溢出到磁盘。
为了让我更有帮助,您可以发布您的Pig脚本,并提及您正在使用的Pig版本。
答案 1 :(得分:1)
我不是一位经验丰富的用户或其他任何人,但在VM上运行Pig作业时遇到了类似的问题。
我的特殊问题是,VM没有配置交换空间,最终会耗尽内存。我猜你是在正确的linux配置中尝试这个,但做一个:free -m
并看看你得到的结果可能没什么坏处,可能问题是由于你配置的交换内存太少。
只是一个想法,让我知道它是否有帮助。祝你好运!