Apache Pig:java.lang.OutOfMemoryError:Java堆空间

时间:2018-07-16 16:42:30

标签: hadoop apache-pig avro

所以我想加入两只猪的关系。

RELATION1 = LOAD '$path' USING AvroStorage();
RELATION2 = LOAD '$path' USING AvroStorage();
RELATION3 = JOIN RELATION1 BY field, JOIN RELATION2 BY field;
STORE RELATION3 INTO '$PATH' USING AvroStorage();

但是我遇到以下错误:

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.OutOfMemoryError: Java heap space

似乎在抱怨堆空间不足。就我而言,relation1相对较大,例如〜1000GB,relation2小。只需在Pig脚本中加载Relation1并进行过滤即可。有人可以建议我如何解决这个问题吗?谢谢!

1 个答案:

答案 0 :(得分:3)

由于您提到一个关系比另一个关系小得多,因此您可能需要优化Pig脚本。具体来说,如果您的一种关系小于另一种关系,则应首先使用较小的关系,以便更有效地执行联接(read more here):

RELATION3 = JOIN RELATION2 BY field, RELATION1 BY field;

如果您的一个关系是如此之小以至于它可以放入内存中,则可以执行复制联接(read more here)。请注意,顺序与上面的相反:

RELATION3 = JOIN RELATION1 BY field, RELATION2 BY field USING 'replicated';

此外,可以在联接之前使用FOREACH语句来仅选择所需的变量,从而减少了数据的移动。另外,在加入之前进行任何过滤。

如果通过这些修改仍然出现Java内存错误,则可以更改mapreduce设置。例如,this other Stack Overflow answer推荐

SET mapreduce.map.memory.mb 4096;
SET mapreduce.reduce.memory.mb 6144;

(通过使用不同的推荐设置来搜索错误,您还可以找到许多其他问题/答案。)