Hadoop 减速器';内存不足

Hadoop 减速器';内存不足,hadoop,mapreduce,apache-pig,Hadoop,Mapreduce,Apache Pig,因此,我有一些Pig脚本,它们在作业的缩减阶段不断消亡,并出现Java堆不断耗尽空间的错误。到目前为止,我唯一的解决办法是增加减速机的数量,但这似乎并不能使我获得任何可靠的结果。现在,部分原因可能是我们所获得的数据的巨大增长,但不能确定 我曾考虑过更改溢出阈值设置,但回忆不起该设置,但不确定他们是否会有所帮助或只是将其减慢。我还可以考虑做些什么来解决这个问题 顺便说一句,当这种情况偶尔发生时,我也会收到关于bash无法获取内存的错误,我认为这是溢出操作。这是内存不足的Hadoop节点吗?如果是这

因此,我有一些Pig脚本,它们在作业的缩减阶段不断消亡,并出现Java堆不断耗尽空间的错误。到目前为止,我唯一的解决办法是增加减速机的数量,但这似乎并不能使我获得任何可靠的结果。现在,部分原因可能是我们所获得的数据的巨大增长,但不能确定

我曾考虑过更改溢出阈值设置,但回忆不起该设置,但不确定他们是否会有所帮助或只是将其减慢。我还可以考虑做些什么来解决这个问题

顺便说一句,当这种情况偶尔发生时,我也会收到关于bash无法获取内存的错误,我认为这是溢出操作。这是内存不足的Hadoop节点吗?如果是这样的话,只需降低这些盒子上的堆大小就可以了吗

编辑1
1) 清管器0.8.1
2) 唯一的自定义项是评估自定义项,它只查看没有行李或地图的单行。
3) 我没有注意到存在任何密钥分发不正确的热点。我一直在使用素数尺度来减少这个问题

编辑2
下面是有问题的错误:

2012-01-04 09:58:11179 FATAL org.apache.hadoop.mapred.TaskRunner:尝试\u 2011120707\u 75699\u r\u 000054\u 1:映射输出复制失败:java.lang.OutOfMemoryError:java堆空间
在org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory上(ReduceTask.java:1508)
在org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1408)
位于org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1261)
在org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run上(ReduceTask.java:1195)

下面是我一直得到的bash错误:

java.io.IOException:任务:尝试\u 2011120707\u 75699\u r\u 000054\u 0-还原复印机失败
位于org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:380)
位于org.apache.hadoop.mapred.Child.main(Child.java:170)
原因:java.io.IOException:无法运行程序“bash”:java.io.IOException:错误=12,无法分配内存
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
位于org.apache.hadoop.util.Shell.runCommand(Shell.java:149)
位于org.apache.hadoop.util.Shell.run(Shell.java:134)
位于org.apache.hadoop.fs.DF.getAvailable(DF.java:73)
位于org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:329)
位于org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:124)
位于org.apache.hadoop.mapred.MapOutputFile.getInputFileForWrite(MapOutputFile.java:160)
位于org.apache.hadoop.mapred.ReduceTask$reduceComposer$InMemFSMergeThread.doInMemMerge(ReduceTask.java:2537)
在org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.run(ReduceTask.java:2501)上

显然,您的某个地方内存不足。增加减速器的数量实际上是相当合理的。看看JobTracker Web GUI上的统计数据,看看映射器中有多少字节被占用。除以reduce任务的数量,这是对每个reducer得到的结果的粗略估计。不幸的是,只有在密钥分布均匀的情况下,这种方法才能长期有效

在某些情况下,
JOIN
(尤其是复制类型)会导致此类问题。当您有一个特定键的“热点”时,就会发生这种情况。例如,假设您正在进行某种连接,其中一个键显示了50%的时间。不管什么减速器幸运地处理了那把钥匙,都会被撞坏的。您可能需要调查哪些键导致热点,并相应地处理它们。在我的数据中,通常这些热点无论如何都是无用的。要想知道什么是热门,只需做一个
分组
计数
,然后找出经常出现的内容。然后,如果它没有用,就过滤掉它

这个问题的另一个根源是Java UDF聚合了太多的数据。例如,如果您有一个UDF,它通过一个数据包将记录收集到某种列表数据结构中,那么您可能会用一个热点值耗尽内存

我发现较新版本的Pig(尤其是.8和.9)的内存问题要少得多。我有相当多的例子,在堆中用完了。7。这些版本具有更好的溢出到磁盘检测功能,因此,如果它即将耗尽堆,那么它足够聪明,可以溢出到磁盘



为了让我能提供更多帮助,你可以发布你的Pig脚本,还可以提到你正在使用的Pig版本。

显然你的内存在某处用完了。增加减速器的数量实际上是相当合理的。看看JobTracker Web GUI上的统计数据,看看映射器中有多少字节被占用。除以reduce任务的数量,这是对每个reducer得到的结果的粗略估计。不幸的是,只有在密钥分布均匀的情况下,这种方法才能长期有效

在某些情况下,
JOIN
(尤其是复制类型)会导致此类问题。当您有一个特定键的“热点”时,就会发生这种情况。例如,假设您正在进行某种连接,其中一个键显示了50%的时间。不管什么减速器幸运地处理了那把钥匙,都会被撞坏的。您可能需要调查哪些键导致热点,并相应地处理它们。在我的数据中,通常这些热点无论如何都是无用的。要想知道什么是热门,只需做一个
分组
计数
,然后找出经常出现的内容。然后,如果它没有用,就过滤掉它

这个问题的另一个根源是Java UDF聚合了太多的数据。例如,如果您有一个通过数据包的UDF