带有 tez 的 aws emr 上的 Pig 脚本偶尔会因 OutOfMemoryException 而失败
Pig script on aws emr with tez occasionally fails with OutOfMemoryException
我在使用自定义 UDF 的 emr 集群 (emr-5.4.0) 上有一个 pig 脚本 运行ning。 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 堆栈上 运行ning 猪脚本时,这看起来像是一个奇怪的 运行time 行为。
请注意 pig 脚本正在使用
- 复制连接(要连接的较小关系需要装入内存)和
- 已经提到的 UDF,正在初始化
Map<Integer, Interger>
产生上述 OutOfMemoryError。
我们发现了另一个使用 tez 后端的解决方法。使用 mapreduce.map.memory.mb
和 mapreduce.map.java.opts
的增加值(mapreduce.map.memory.mb
的 0.8 倍)。这些值绑定到 ec2 实例类型,通常是固定值(参见 aws emr task config)。
通过(暂时)将值加倍,我们能够使 pig 脚本成功。
为具有默认值的 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
的另一种解决方法可能是为有问题的关系添加显式 STORE
和 LOAD
语句,这将使 tez 将数据刷新到存储中。这也有助于调试问题,因为可以使用其他 pig 脚本观察(临时、中间)数据。
我在使用自定义 UDF 的 emr 集群 (emr-5.4.0) 上有一个 pig 脚本 运行ning。 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 堆栈上 运行ning 猪脚本时,这看起来像是一个奇怪的 运行time 行为。
请注意 pig 脚本正在使用
- 复制连接(要连接的较小关系需要装入内存)和
- 已经提到的 UDF,正在初始化
Map<Integer, Interger>
产生上述 OutOfMemoryError。
我们发现了另一个使用 tez 后端的解决方法。使用 mapreduce.map.memory.mb
和 mapreduce.map.java.opts
的增加值(mapreduce.map.memory.mb
的 0.8 倍)。这些值绑定到 ec2 实例类型,通常是固定值(参见 aws emr task config)。
通过(暂时)将值加倍,我们能够使 pig 脚本成功。
为具有默认值的 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
的另一种解决方法可能是为有问题的关系添加显式 STORE
和 LOAD
语句,这将使 tez 将数据刷新到存储中。这也有助于调试问题,因为可以使用其他 pig 脚本观察(临时、中间)数据。