Apache Pig: java.lang.OutOfMemoryError: Java heap space

Apache Pig: java.lang.OutOfMemoryError: Java heap space

所以我正在尝试连接两只猪的关系。

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

它似乎在抱怨没有足够的堆 space。在我的例子中,relation1 相对较大,例如 ~1000GB,relation2 很小。只需在 pig 脚本中加载 relation1 并执行过滤器即可。有人可以建议我如何解决这个问题吗?谢谢!

既然你提到你的一个关系比另一个小得多,你可能想优化你的 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';

此外,您可以在连接到 select 之前使用 FOREACH 语句,只使用您需要的变量,这样就可以减少需要移动的数据。另外,在加入之前进行任何过滤。

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

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

(还有许多其他 questions/answers 通过谷歌搜索您可以尝试的不同推荐设置的错误。)