Pig 处理多个文件错误:错误 0:在 [] 处执行 ForEach 时出错

Posted

技术标签:

【中文标题】Pig 处理多个文件错误:错误 0:在 [] 处执行 ForEach 时出错【英文标题】:Pig process multiple file error: ERROR 0: Error while executing ForEach at [] 【发布时间】:2014-07-22 03:07:08 【问题描述】:

我在HDFS的/user/bizlog/cpc目录下有4个文件A、B、C、D,记录如下: 87465422^C376832^C27786^C21161214^Ckey

这是我的猪脚本:

cpc_all = load '/user/bizlog/cpc' using PigStorage('\u0003') as (cpcid, accountid, cpcplanid, cpcgrpid, key);
cpc = foreach cpc_all generate accountid, key;
account_group = group cpc by accountid;
account_sort = order account_group by group;
account_key = foreach account_sort generate group, BagToTuple(cpc.key);
store account_key into 'last' using PigStorage('\u0003');

它会得到如下结果: 376832^Ckey1^Ckey2

上面的脚本假设要处理所有 4 个文件,但我得到了这个错误:

Backend error message
---------------------
org.apache.pig.backend.executionengine.ExecException: ERROR 0: Exception while executing (Name: account_key: New For Each(false,false)[bag] - scope-18 Operator Key: scope-18): org.apache.pig.backend.executionengine.ExecException: ERROR 0: Error while executing ForEach at []
        at org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.processInput(PhysicalOperator.java:289)
        at org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POForEach.getNextTuple(POForEach.java:242)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapReduce$Reduce.runPipeline(PigGenericMapReduce.java:464)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapReduce$Reduce.processOnePackageOutput(PigGenericMapReduce.java:432)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapReduce$Reduce.reduce(PigGenericMapReduce.java:412)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapReduce$Reduce.

Pig Stack Trace
---------------
ERROR 0: Exception while executing (Name: account_key: New For Each(false,false)[bag] - scope-18 Operator Key: scope-18): org.apache.pig.backend.executionengine.ExecException: ERROR 0: Error while executing ForEach at []

org.apache.pig.backend.executionengine.ExecException: ERROR 0: Exception while executing (Name: account_key: New For Each(false,false)[bag] - scope-18 Operator Key: scope-18): org.apache.pig.backend.executionengine.ExecException: ERROR 0: Error while executing ForEach at []
        at org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.processInput(PhysicalOperator.java:289)
        at org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POForEach.getNextTuple(POForEach.java:242)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapReduce$Reduce.runPipeline(PigGenericMapReduce.java:464)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapReduce$Reduce.processOnePackageOutput(PigGenericMapReduce.java:432)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapReduce$Reduce.reduce(PigGenericMapReduce.java:412)
================================================================================

奇怪的是,如果我加载一个文件,例如 load '/user/bizlog/cpc/A',那么脚本就会成功。

如果我先加载每个文件然后合并它们,它也可以正常工作。

如果我把排序步骤放在最后并且错误消失了

hadoop 版本是 0.20.2,pig 版本是 0.12.1,不胜感激

【问题讨论】:

还有一件事,如果我先加载每个文件然后合并它们,它也可以正常工作。 A、B、C、D 的数据类型是否相同? 是的,它们的数据类型相同 奇怪的是,我把排序步骤放在最后,错误就消失了 【参考方案1】:

如 cmets 中所述:

我把排序步骤放在最后,错误就消失了

虽然我没有找到太多关于该主题的内容,但猪似乎不喜欢重新排列组本身。

因此,“解决方案”是重新排列为组生成的输出,而不是对组本身进行排序。

【讨论】:

以上是关于Pig 处理多个文件错误:错误 0:在 [] 处执行 ForEach 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Pig 0.13 错误 2998:未处理的内部错误。 org/apache/hadoop/mapreduce/task/JobContextImpl

Pig 0.7.0 错误 2118:无法在 Hadoop 1.2.1 上创建输入拆分

使用冒号加载标签时出现 Pig xmlloader 错误

Pig 安装错误:错误 pig.Main:错误 2998:未处理的内部错误

Pig 无法处理大文件

Hadoop 2.7.2 上的 Pig-0.16.0 - 错误 1002:无法存储别名