使用tez的aws emr上的猪脚本偶尔会因OutOfMemoryException而失败

时间:2018-01-25 07:34:51

标签: apache-pig emr tez

我使用自定义UDF在emr集群(emr-5.4.0)上运行了一个pig脚本。 UDF用于查找某些维度数据,并为其输入(稍微)大量的文本数据。

在pig脚本中,UDF使用如下:

DEFINE LookupInteger com.ourcompany.LookupInteger(<some parameters>);

UDF将一些数据存储在Map<Integer, Integer>

在某些输入数据上,聚合失败,异常如下

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.lang.String.split(String.java:2377)
    at java.lang.String.split(String.java:2422)
    [...]
    at com.ourcompany.LocalFileUtil.toMap(LocalFileUtil.java:71)
    at com.ourcompany.LookupInteger.exec(LookupInteger.java:46)
    at com.ourcompany.LookupInteger.exec(LookupInteger.java:19)
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POUserFunc.getNext(POUserFunc.java:330)
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POUserFunc.getNextInteger(POUserFunc.java:379)
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.getNext(PhysicalOperator.java:347)
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POBinCond.genericGetNext(POBinCond.java:76)
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POBinCond.getNextInteger(POBinCond.java:118)
    at org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.getNext(PhysicalOperator.java:347)

使用mapreduce运行Pig聚合时不会发生这种情况,因此我们的解决方法是将pig -t tez替换为pig -t mapreduce

由于我是amazon emr的新手,还有tez的猪,我对如何分析或调试问题有一些提示。

修改 在tez堆栈上运行pig脚本时,它看起来像一个奇怪的运行时行为。

请注意猪脚本正在使用

  • 复制连接(要连接的较小关系需要适合内存)和
  • 已经提到的UDF,它正在初始化产生上述OutOfMemoryError的Map<Integer, Interger>

1 个答案:

答案 0 :(得分:0)

我们发现了使用tez后端的另一种解决方法。使用mapreduce.map.memory.mbmapreduce.map.java.opts的增加值(mapreduce.map.memory.mb的0.8倍)。这些值绑定到ec2实例类型,通常是固定值(请参阅aws emr task config)。

通过(临时)加倍值,我们能够使猪脚本成功。

为m3.xlarge核心实例设置了以下值,该实例具有默认值:

  • mapreduce.map.java.opts:= -Xmx1152m
  • mapreduce.map.memory.mb:= 1440

猪启动命令

pig -Dmapreduce.map.java.opts=-Xmx2304m \
    -Dmapreduce.map.memory.mb=2880 -stop_on_failure -x tez ... script.pig

修改

一位同事想出了以下想法:

OutOfMemory: GC overhead limit exceeded的另一种解决方法可能是为有问题的关系添加显式STORELOAD语句,这会使tez将数据刷新到存储。这也有助于调试问题,因为可以使用其他猪脚本观察(临时,中间)数据。