我试图通过Yelp的MrJob工具为EMR使用CombineFileInputFormat类。作业流是使用hadoop流创建的,MrJob的文档指出CombineFileInputFormat类必须 bundle 在自定义的hadoop-streaming.jar中。

对于上下文,请遵循此question

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

我尝试通过将CombinedInputFormat.class添加到目录org/apache/hadoop/streaming并执行以下操作来 bundle 它:

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

如果我这样做,则流作业流程开始,并使用-inputformat CombinedInputFormat选项,作业开始第一步并中断,并显示错误:
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!

我应该如何 bundle CombinedInputFormat.class以便正确使用它并解决NoClassDefFoundError错误?

最佳答案

解释hereCombinedInputFormat类扩展了CombineFileInputFormat,并且未与hadoop一起移植。因此,您需要做的是,在具有Mapper / Reducer作业类的同一个程序包中,您必须创建一个类,并具有先前版本中所述的代码。然后创建jar,它应该可以正常运行。

因此,基本上,您需要编写自己的CombineFileInputFormat实现(我为您完成了此操作),并且您可以随意命名,说ABCClass而不是我命名的CombinedInputFormat

07-26 02:20