apache pig:java.lang.outofmemoryerror:java堆空间

bkkx9g8r  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(463)

所以我想把两只Pig的关系连接起来。

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并进行筛选就可以了。有人能建议我如何解决这个问题吗?谢谢!

pjngdqdw

pjngdqdw1#

既然您提到您的一个关系比另一个小得多,那么您可能需要优化pig脚本。具体地说,如果一个关系比另一个小,那么应该先使用较小的关系,以便更有效地执行联接(请参阅此处的更多内容):

RELATION3 = JOIN RELATION2 BY field, RELATION1 BY field;

如果其中一个关系非常小,可以放入内存,那么可以执行复制连接(请参阅此处的更多内容)。请注意,顺序与上述相反:

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

此外,您可以使用 FOREACH 语句只选择所需的变量,这样就可以移动较少的数据。另外,在连接之前进行任何过滤。
如果这些修改仍然导致java内存错误,可以更改mapreduce设置。例如,另一个堆栈溢出答案建议

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

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

相关问题