使用Hadoop Streaming时通过脚本运行Java应用程序:java.lang.NoClassDefFoundError
我使用Hadoop Streaming在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.
我已经尝试了各种建议,比如设置Hadoops -libjars
参数,但这没有帮助。
在使用Hadoop Streaming时,如何通过脚本运行Java应用程序?
我认为问题是你的jar没有被复制到分布式缓存。 尝试通过-files
选项将jar与shell脚本一起发送。 例如:
hadoop jar /home/user/hadoop-distrib/lib/hadoop-streaming.jar \ -files runjava.sh,hadooptest.jar \ -D mapreduce.job.reduces=0 \ -D mapred.job.name=TestJob \ -input /user/hadoop/test \ -output /user/hadoop/test/res \ -mapper 'runjava.sh'
我假设您正在从存储hadooptest.jar
和runjava.sh
的目录中运行流式传输作业。
runjava.sh:
java -cp /home/user/test/hadooptest.jar:/home/user/hadoop-distrib/lib/* com.example.hadooptest.StreamTest
StreamTest.java:
... public class StreamTest { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String s = null; while ((s = in.readLine()) != null && s.length() != 0) { System.out.println(s); } } }
此示例在版本0.20-append-r1056497上正常工作。
- 为什么LongWritable(key)没有在Mapper类中使用?
- 不使用JobConf运行Hadoop作业
- 如何以csv格式输出hadoop结果
- 写入HDFS只能复制到0个节点而不是minReplication(= 1)
- 在OOZIE-4.1.0中运行多个工作流时出错
- 如何在下面的代码中生成对象?
- Hbase客户端ConnectionLoss for / hbase错误
- 线程“main”中的exceptionjava.lang.NoClassDefFoundError:org / apache / hadoop / hbase / HBaseConfiguration
- 线程“main”中的exceptionjava.lang.UnsupportedClassVersionError,不支持的major.minor版本52.0