我有一个使用自定义 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)
当 pig 聚合运行时不会发生这种情况mapreduce
,因此我们的解决方法是替换pig -t tez
为pig -t mapreduce
。
由于我是 amazon emr 的新手,并且是 tez 的猪,因此我会很感激有关如何分析或调试问题的一些提示。
编辑: 在 tez 堆栈上运行 pig 脚本时,它看起来像一个奇怪的运行时行为。
请注意,猪脚本正在使用
- 复制连接(要连接的较小关系需要放入内存中)和
- 已经提到的 UDF,它正在初始化
Map<Integer, Interger>
产生上述 OutOfMemoryError。