猪错误:未处理的内部错误。找到了接口 org.apache.hadoop.mapreduce.TaskAttemptContext,但是需要类

Posted

技术标签:

【中文标题】猪错误:未处理的内部错误。找到了接口 org.apache.hadoop.mapreduce.TaskAttemptContext,但是需要类【英文标题】:Pig Error: Unhandled internal error. Found interface org.apache.hadoop.mapreduce.TaskAttemptContext, but class was expected 【发布时间】:2014-08-11 06:05:50 【问题描述】:

我刚刚在 Hortonworks HDP 2.1 上将 Pig 0.12.0 升级到 0.13.0 版本

当我尝试在我的脚本中使用 XMLLoader 时出现以下错误,即使我已经注册了 piggybank。

脚本:

 A = load 'EPAXMLDownload.xml' using org.apache.pig.piggybank.storage.XMLLoader('Document') as (x:chararray);

错误:

dump A
2014-08-10 23:08:56,494 [main] INFO  org.apache.hadoop.conf.Configuration.deprecation - io.bytes.per.checksum is deprecated. Instead, use dfs.bytes-per-checksum
2014-08-10 23:08:56,496 [main] INFO  org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS
2014-08-10 23:08:56,651 [main] INFO  org.apache.pig.tools.pigstats.ScriptState - Pig features used in the script: UNKNOWN
2014-08-10 23:08:56,727 [main] INFO  org.apache.pig.newplan.logical.optimizer.LogicalPlanOptimizer - RULES_ENABLED=[AddForEach, ColumnMapKeyPrune, GroupByConstParallelSetter, LimitOptimizer, LoadTypeCastInserter, MergeFilter, MergeForEach, PartitionFilterOptimizer, PushDownForEachFlatten, PushUpFilter, SplitFilter, StreamTypeCastInserter], RULES_DISABLED=[FilterLogicExpressionSimplifier]
2014-08-10 23:08:57,191 [main] INFO  org.apache.hadoop.conf.Configuration.deprecation - io.bytes.per.checksum is deprecated. Instead, use dfs.bytes-per-checksum
2014-08-10 23:08:57,199 [main] INFO  org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS
2014-08-10 23:08:57,214 [main] INFO  org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1
2014-08-10 23:08:57,223 [main] INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1
2014-08-10 23:08:57,247 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2998: Unhandled internal error. Found interface org.apache.hadoop.mapreduce.TaskAttemptContext, but class was expected

【问题讨论】:

只检查注册的jar是否有接口和/或类。错误说 Pig 期待 Class,但它找到了一个接口。 【参考方案1】:

请注意,pig 根据您设置的上下文变量决定 hadoop 版本 HADOOP_HOME -> v1 HADOOP_PREFIX -> v2

如果使用hadoop2,需要重新编译piggybank(默认为hadoop1编译)

    转到 pig/contrib/piggybank/java $ ant -Dhadoopversion=23 然后将该 jar 复制到 pig/lib/piggybank.jar 上

【讨论】:

这对我不起作用。我仍然遇到同样的错误。 +1 for HADOOP_HOME -> v1 HADOOP_PREFIX -> v2 我在 pig 文档和 pig bash 脚本中都没有看到【参考方案2】:

更多细节,因为其他答案对我不起作用:

    git克隆猪的git镜像https://github.com/apache/pig cd 进入克隆目录

    如果你过去已经在这个目录中构建了 pig,你应该运行一个 clean

    ant clean
    

    为 hadoop 2 构建猪

    ant -Dhadoopversion=23
    

    cd 到存钱罐里

    cd contrib/piggybank/java
    

    同样,如果您之前构建过 piggybank,请务必清除旧的构建文件

    ant clean
    

    为 hadoop 2 构建 piggybank(相同的命令,不同的目录)

    ant -Dhadoopversion=23
    

如果你不先构建 pig,piggybank 会在编译时抛出一堆“找不到符号”异常。此外,由于我之前为 Hadoop 1 构建了 pig(不小心),没有运行 clean,我遇到了运行时错误。

【讨论】:

【参考方案3】:

安装 Pig 后有时您可能会遇到如下问题:-

java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected
 at org.apache.hcatalog.common.HCatUtil.checkJobContextIfRunningFromBackend(HCatUtil.java:88)
 at org.apache.hcatalog.pig.HCatLoader.setLocation(HCatLoader.java:162)
 at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler.getJob(JobControlCompiler.java:540)
 at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler.compile(JobControlCompiler.java:322)
 at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher.launchPig(MapReduceLauncher.java:199)
 at org.apache.pig.backend.hadoop.executionengine.HExecutionEngine.launchPig(HExecutionEngine.java:277)
 at org.apache.pig.PigServer.launchPlan(PigServer.java:1367)
 at org.apache.pig.PigServer.executeCompiledLogicalPlan(PigServer.java:1352)
 at org.apache.pig.PigServer.execute(PigServer.java:1341)

很多博客建议你通过执行命令重新编译Pig:

ant clean jar-all -Dhadoopversion=23

或通过执行以下步骤重新编译 piggybank.jar

cd contrib/piggybank/java

ant clean

ant -Dhadoopversion=23

但这可能无法解决您的问题。这里的实际原因与HCatalog有关。试试更新吧!!就我而言,我使用的是 Hive0.13 和 Pig.0.13。我使用的是 Hive0.13 提供的 HCatalog。

然后我将 Pig 更新为 0.15 并使用单独的 hive-hcatalog-0.13.0.2.1.1.0-385 库 jar。问题就解决了……

因为后来我发现不是 Pig 造成了问题,而是 Hive-HCatalog 库。希望这可能会有所帮助。

【讨论】:

【参考方案4】:

即使我在使用 Hadoop 版本 2.2.0 时也遇到了同样的错误。 解决方法是,我们必须使用 grunt shell 注册以下 jar 文件。

我要在下面粘贴的路径将根据 hadoop-2.2.0 版本。请根据您的版本找到罐子。

/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar

/hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar

使用 REGISTER 命令,我们必须将这些 jar 与 piggybank 一起注册。

现在运行 pig 脚本/命令,如果遇到任何问题,请恢复。

【讨论】:

以上是关于猪错误:未处理的内部错误。找到了接口 org.apache.hadoop.mapreduce.TaskAttemptContext,但是需要类的主要内容,如果未能解决你的问题,请参考以下文章

Pig ERROR 2998:未处理的内部错误(错误名称 MY_CLASS_NAME)

柯南从容器内部失败,出现“sudo:未找到”错误

致命错误:未找到接口“Psr\Container\ContainerInterface”

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

内部处理程序中的 Gorilla Mux 路由器仅工作一次,然后给出 404 页面未找到

调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法