【发布时间】:2012-01-02 22:20:45
【问题描述】:
所以我有一些 Pig 脚本在那里不断死去,减少了作业的阶段,错误是 Java 堆不断耗尽空间。到目前为止,我唯一的解决方案是增加 Reducer 的数量,但这似乎并没有让我有任何可靠的地方。现在,其中一部分可能只是我们获得的数据的大量增长,但不能确定。
我考虑过更改溢出阈值设置,但不记得该设置,但不确定它们是否会有所帮助或只是减慢速度。我还可以采取哪些其他措施来解决此问题?
附带说明一下,当这种情况开始发生时,我也会收到关于 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)
【问题讨论】:
-
因此,经过进一步研究,我发现了一个部分解决方法,这似乎有助于解决问题,还有一些错误报告称该问题的某些变体已在 Hadoop 0.20.2 中得到解决。解决方法是将以下行添加到您的 pig 脚本或将其添加到您的 pig.properties 文件中。默认值为 0.70 或 70%。 "设置 mapred.job.shuffle.input.buffer.percent 0.50;"
标签: hadoop mapreduce apache-pig