我需要从java应用程序调用mapreduce作业。 我用
ToolRunner.run(new Validation(), pathsMoveToFinal.toArray(new String[pathsMoveToFinal.size()]));
如果我没有设置conf的mapred.job.jobtracker,它会像永远一样运行。地图任务变为100%然后返回到其他百分比。如果我设置了mapred.job.jobtracker,则会抱怨无法找到mapper类:
java.lang.RuntimeException: java.lang.ClassNotFoundException: utils.DataValidationExtractorMapper
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:809)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:157)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:569)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
at org.apache.hadoop.mapred.Child.main(Child.java:170)
Caused by: java.lang.ClassNotFoundException: utils.DataValidationExtractorMapper
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:762)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:807)
... 4 more
任何人都可以给我一些提示。谢谢你,周末愉快。
答案 0 :(得分:1)
由于您使用的是Maven,我强烈推荐baking your dependencies statically into your JAR。
发生这种情况的原因是Mapper和Reducer JRE没有客户端类路径的预先存在的上下文。在依赖项中进行烘焙是面向未来且稳定的,Hadoop应该非常愉快地使用这个JAR。
答案 1 :(得分:1)
请在此处查看我之前的回答(和其他答案):
How to make a monolithic jar.file?
然后用hadoop jar运行。
在共享/非拥有框上设置类路径可能是一个大问题,因为必须将jar文件复制到所有任务服务器。添加一个服务器,忘记设置类路径,哎哟,我在某个任务机器上的作业中断,但在其他任务机器上运行。当你有100个盒子时尝试调试!整体jar将允许您将所有依赖项封装到一个可分发的大jar中。
答案 2 :(得分:1)
Sovled。这不是因为maven的事情。当我尝试从java代码启动mapreduce作业时,我必须在一个jar中打包mapreduce作业。因为hadoop试图将jar复制到不同的任务jvms。感谢您的所有建议!