我试图通过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
错误? 最佳答案
解释here的CombinedInputFormat
类扩展了CombineFileInputFormat
,并且未与hadoop一起移植。因此,您需要做的是,在具有Mapper / Reducer作业类的同一个程序包中,您必须创建一个类,并具有先前版本中所述的代码。然后创建jar,它应该可以正常运行。
因此,基本上,您需要编写自己的CombineFileInputFormat
实现(我为您完成了此操作),并且您可以随意命名,说ABCClass
而不是我命名的CombinedInputFormat
。