http://www.cnblogs.com/kaizhangzhang/p/3495438.html
在win7下運行hadoop-1.1.2 worldcount代碼的時候出現下面的錯誤,折騰了差不多一天的時間,才明白導致http://www.cnblogs.com/kaizhangzhang/p/3494753.html這個錯誤的原因,一下是錯誤的完整信息:
eclipse顯示:
13/12/28 15:44:00 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
13/12/28 15:44:00 INFO input.FileInputFormat: Total input paths to process : 1
13/12/28 15:44:00 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/12/28 15:44:00 WARN snappy.LoadSnappy: Snappy native library not loaded
13/12/28 15:44:00 INFO mapred.JobClient: Running job: job_201312281229_0013
13/12/28 15:44:01 INFO mapred.JobClient: map 0% reduce 0%
13/12/28 15:44:07 INFO mapred.JobClient: Task Id : attempt_201312281229_0013_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: com.kai.hadoop.MyMapreduce$MyMap
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:849)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:719)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
查看了job的輸出日志,顯示錯誤:
java.lang.RuntimeException: java.lang.ClassNotFoundException:
com.kai.hadoop.WordCount$TokenizerMapper at
org.apache.hadoop.conf.Configuration.getClass(Configuration.java:849) at
org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199) at
org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:719) at
org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) at
org.apache.hadoop.mapred.Child$4.run(Child.java:255) at
java.security.AccessController.doPrivileged(Native Method) at
javax.security.auth.Subject.doAs(Subject.java:415) at
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149)
at org.apache.hadoop.mapred.Child.main(Child.java:249) Caused by:
java.lang.ClassNotFoundException: com.kai.hadoop.WordCount$TokenizerMapper at
java.net.URLClassLoader$1.run(URLClassLoader.java:366) at
java.net.URLClassLoader$1.run(URLClassLoader.java:355) at
java.security.AccessController.doPrivileged(Native Method) at
java.net.URLClassLoader.findClass(URLClassLoader.java:354) at
java.lang.ClassLoader.loadClass(ClassLoader.java:425) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at
java.lang.ClassLoader.loadClass(ClassLoader.java:358) at
java.lang.Class.forName0(Native Method) at
java.lang.Class.forName(Class.java:270) at
org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:802) at
org.apache.hadoop.conf.Configuration.getClass(Configuration.java:847) ... 8 more
我把這個WorldCount程序打成jar包在ubuntu上是可以正常運行,由於自己個人非常懶,是在不想換開發平台,依然堅持在windows上開發,在網上找了種種方案,最后終於解決了,網上說的也含含糊糊的,東平西湊的理解在一起總結:
1、網上好多說要設置這job.setJarByClass(WordCount.class);但是hadoop-1.1.2的worldcount源碼是有job.setJarByClass(WordCount.class);我們找到conf所在的位置,加conf.set("mapred.jar", "C:\\Users\\win7\\Desktop\\mapreduce.jar"); 注意:"mapred.jar"不能改,后面是你導出jar的路徑
2、把工程打成xx.jar就是上面的mapreduce.jar,(右擊工程->選擇Export->選擇要輸出的package),我放在"C:\\Users\\win7\\Desktop",一般最好放工程里面,默認路徑下
最后運行就可以了,然后就可以正常運行了,哈哈....雖然還是有點麻煩,要打jar包還要每次設置conf.set(),但是至少目前不用換環境了,比起每次上傳到ubuntu再運行方便了一點點,對於初學的我來說已經是很好的開始,我覺得自己肯定是哪還沒有配置好,應該還可以繼續改進,繼續研究...希望有知道的大神留下寶貴的意見!!