最近做hadoop集群试验,用的hadoop1.0.2,遇到这么个问题,将写好的jar包,放到linux上后,执行hadoop jar hadoopTest.jar test.XXXCount input output 后,
运行时,会报下面的警告
WARN mapred.JobClient: No job jar file set.
User classes may not be found. See JobConf(Class)or JobConf#setJar(String).
之后就会报错:
java.lang.RuntimeException: java.lang.ClassNotFoundException: xxxxMapper
虽然从网上查了很多,基本都是写需要在声明job时,加上
job.setJarByClass(WordCount.class); 但是我加上之后还是运行不对,之后看源码后才发现,有一个判断,是判断"jar".equals(url.getProtocol())但是,这个永远是在我debug后得知,url.getProtocol()永远是“file”,不是“jar”,原因我想可能是hadoop jar的流程(详见下面转的hadoop jar流程)中,这条命令,会将jar解压到/home/hadoop/hadoop-fs/dfs/temp/hadoop- unjarxxxxxx这样的目录下,所以程序执行时,通过class名称,根本找不到jar包。当然也可能是这个1.0.2的版本有bug,或者我使用的方法不对。