我正在尝试使用Yelp的MrJob工具进行EMR的CombineFileInputFormat
课程。工作流是使用hadoop流创建的,MrJob的文档表明CombineFileInputFormat
类必须捆绑在自定义的hadoop-streaming.jar
中。
有关背景信息,请按此question。
具体来说,我的问题是:具体课程CombinedInputFormat.class
应该在hadoop-streaming.jar
中捆绑或引用?
我尝试通过将CombinedInputFormat.class
添加到目录org/apache/hadoop/streaming
并执行:
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!
我得到的错误是:
NoClassDefFoundError
我应该如何捆绑CombinedInputFormat.class以便正确使用它并解决{{1}}错误?
答案 0 :(得分:2)
课程CombinedInputFormat
解释here扩展CombineFileInputFormat
并且没有移植hadoop。所以你需要做的是,在你有mapper / reducer作业类的同一个包中,你必须创建一个类并在前面的问题中说明代码。然后创建jar,它应该正常运行。
所以基本上,你需要编写自己的CombineFileInputFormat
实现(我是为你做的),你可以将它命名为你想要的任何名称,比如说ABCClass
而不是CombinedInputFormat
我把它命名了。
答案 1 :(得分:0)
这是我发现的另一种简单方法,可以在hadoop local或EMR中构建并运行自定义jar http://www.applams.com/2014/05/using-custom-streaming-jar-using-custom.html