今天写MR程序,原来用TextInputFormat改为用KeyValueTextInputFormat类提交到hadoop上一直提示ClassNotFoundException的异常。
百思不得其解,后来查看源码时发现没有KeyValueTextInputFormat的源代码。
这时候我注意到我的集群上hadoop版本号是1.0.0,Win7上的jar包和源代码都是1.0.0.
记得刚开始配机群环境时,由于win7提交到hadoop时 源码有bug导致会导致权限的异常,我曾经把core包换成了1.0.4-modified.jar的包。
应该是这个原因,希望能提供给遇到同样问题的朋友提供一种解决思路,很可能是jar包版本的问题!
还有一种情况是 要在集群上运行程序是一定要选择 “Run on Hadoop”这一项!
比如我自己在本地运行时将下面这条语句注释了以后,程序是在本地跑的:conf.set("mapred.job.tracker", "10.103.240.160:9001");
后来为了在集群上跑又将这条语句恢复了,但是我运行的时候却是点的上面那个绿色的小按钮,并没有选择“Run on Hadoop”这一选项。
于是报了Class not found 的异常。
原因应该是如果点了Run on hadoop 以后,Myeclipse会重新打包上传该程序。
而如果点绿色小三角按钮,程序还是跑在本地,只不过是通过JobClient对象与服务器进行通信了而已,并没有重新打包上传到集群上。