1

我正在尝试CombineFileInputFormat使用 Yelp 的 MrJob 用于 EMR 工具的课程。作业流是使用 hadoop 流创建的,MrJob 的文档表明CombineFileInputFormat该类必须捆绑在自定义的hadoop-streaming.jar.

有关上下文,请遵循此问题

具体来说,我的问题是:具体类应该在哪里CombinedInputFormat.class捆绑或引用hadoop-streaming.jar

我尝试CombinedInputFormat.class通过将其添加到目录org/apache/hadoop/streaming并执行来捆绑:

jar uvf my-hadoop-streaming.jar org/apache/hadoop/streaming

如果我这样做,则流式作业流程将启动,并选择-inputformat CombinedInputFormatJob 开始第一步并中断,并出现错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/streaming/CombinedInputFormat (wrong name: CombinedInputFormat)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        ...

如果我只是尝试将其设置在根路径中:

jar uvf my-hadoop-streaming.jar CombinedInputFormat.class

我得到的错误是:

-inputformat : class not found : CombinedInputFormat
Streaming Job Failed!

我应该如何捆绑 CombinedInputFormat.class 以便正确获取并解决NoClassDefFoundError错误?

4

2 回答 2

2

这里CombinedInputFormat解释的类扩展并且不与 hadoop 一起移植。因此,您需要做的是,在您拥有映射器/减速器作业类的同一个包中,您必须创建一个类并拥有上一期中所述的代码。然后创建jar,它应该可以正常运行。CombineFileInputFormat

所以基本上,你需要编写你自己的实现CombineFileInputFormat(我为你做了),你可以随意命名它,ABCClass而不是CombinedInputFormat像我命名的那样。

于 2013-01-11T20:49:42.013 回答
0

这是我发现在 hadoop 本地或 EMR http://www.applams.com/2014/05/using-custom-streaming-jar-using-custom.html中构建和运行自定义 jar 的另一种简单方法

于 2014-05-20T02:29:35.603 回答