【问题标题】:Apache Pig: java.lang.OutOfMemoryError: Java heap spaceApache Pig:java.lang.OutOfMemoryError:Java 堆空间
【发布时间】:2018-07-16 16:42:29
【问题描述】:

所以我正在尝试加入两个猪的关系。

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 脚本中加载关系 1 并进行过滤即可。有人可以建议我如何解决这个问题吗?谢谢!

【问题讨论】:

    标签: hadoop apache-pig avro


    【解决方案1】:

    由于您提到其中一个关系比另一个小得多,您可能需要优化您的 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;
    

    (您可以尝试使用不同的推荐设置在谷歌上搜索错误,从而找到许多其他问题/答案。)

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 1970-01-01
      • 2015-07-06
      • 2014-11-21
      • 2017-07-18
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多