我使用hadoop流来执行tcsh中的脚本文件:
-- First copy the jar files to the Hadoop filesystem,
so that they are next to inputdir and outputdir. --
cp App/* /hadoop/jardir/
-- Run Hadoop --
hadoop jar /usr/lib/hadoop/contrib/streaming/hadoop-streaming-0.20.2-cdh3u4.jar \\
-D mapred.task.timeout=120000000 \\
-input "/hadoop/inputdir/" -output "/hadoop/outputdir/" \\
-mapper script.sh -reducer script.sh -file script.sh \\
-jobconf mapred.map.tasks=1 -jobconf mapred.reduce.tasks=0 >>& log.txt
此脚本文件调用java的方式如下:
java -cp /hadoop/jardir/SomeJavaApp.jar:/hadoop/jardir/* some.JavaApplication
尽管我明确告诉java类路径,但运行它失败的原因是:
Exception in thread "main" java.lang.NoClassDefFoundError: some/JavaApplication
Caused by: java.lang.ClassNotFoundException: some.JavaApplication
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)
Could not find the main class: some.JavaApplication. Program will exit.
我已经尝试过各种建议,比如设置hadoop -libjars
参数,但那没用。
使用hadoop流时,如何通过脚本运行java应用程序?
1条答案
按热度按时间f2uvfpb91#
我认为问题是jar没有被复制到分布式缓存。尝试通过
-files
选项。例如:我假设您是从
hadooptest.jar
以及runjava.sh
被储存。运行java.sh:
streamtest.java文件:
此示例在版本0.20-append-r1056497上运行良好。