错误:ClassNotFoundException:com.cloudera.sqoop.mapreduce.RawKeyTextOutputFormat 解决方法

java.lang.RuntimeException: java.lang.ClassNotFoundException: com.cloudera.sqoop.mapreduce.RawKeyTextOutputFormat at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:996) at org.apache.hadoop.mapreduce.JobContext.getOutputFormatClass(JobContext.java:248) at org.apache.hadoop.mapred.Task.initialize(Task.java:486) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305) at org.apache.hadoop.mapred.Child$4.run(Child.java:240) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1115) at org.apache.hadoop.mapred.Child.main(Child.java:234)
这是我在通过Sqoop从关系型数据库导数据到Hadoop中所触发,刚碰到这个异常时很奇怪,因为我明明是在Eclipse上跑Sqoop源码,怎么会报找不到sqoop自己的类的异常.
后来调试Sqoop源码后才知道这是一个Hadoop常识,大概原理如下: Sqoop生成一个Job通过MapReduce进行并行导入.而Job所依赖的资源,如jar,配置文件,输入输出等则会复制到HDFS上使得每个运行task的节点都可以使用,从而执行任务.而通过Eclipse运行时,并不会将这些打包成jar,也就是com.cloudera.sqoop.mapreduce.RawKeyTextOutputFormat没有打包到jar中,而使得运行任务的节点没有得到这些资源,所以Hadoop触发了这个异常。
虽然我自己运行的也是伪分布式,但原理一样.解决的办法很简单,只要将sqoop源码打包成一个Jar放到你的$HADOOP_HOME/lib下即可