hadoop下跑mapreduce程序报错

mapreduce真的是门学问,遇到的问题逼着我把它从MRv1摸索到MRv2,从年前就牵挂在心里,连过年回家的旅途上都是心情凝重,今天终于在eclipse控制台看到了job completed successfully,当时的兴奋难以形容,都有些不敢相信自己的眼睛,压抑住激动的心情再试了一遍,特么真的跑通了,喜极而泣。

总结起来就是两处

1.报错Class not found 或者 No job jar file set

这是由于及集群中没有我们提交的jar包,所以namenode不知道怎么执行我们的job任务,所以就会报空指针异常错误,所以要自己打jar提交给集群。

解决方法: 所以先给自己的mapreduce程序打成jar包,然后放到工程的根目录下,然后在代码中添加JobConf conf=new JobConf();conf.setJar("hope.jar");这样就可以了。

引用参考资料4里面的解释:

虽然网上各种说是job.setJarByClass("WordCount.class")既可以解决,但实际上job.setJarByClass(WordCountTest.class)这个语句设置作业Jar包并没有成功。这是为什么呢?因为这个方法使用了WordCount.class的类加载器来寻找包含该类的Jar包,然后设置该Jar包为作业所用的Jar包。但是我们的作业 Jar包是在程序运行时才打包的,而WordCount.class的类加载器是AppClassLoader,运行后我们无法改变它的搜索路径,所以使用setJarByClass是无法设置作业Jar包的。我们必须使用JobConf里的setJar来直接设置作业Jar包。

2.cannot init cluster,无法启动集群

由于我们环境用的是CDH4.5.0所以包含了MRv1和MRv2,而我程序用的是MRv2的写法,MRv2引入Resource Manager就没有了job tracker的概念,所以在mapred-site.xml的文件里把如下配置注释掉

<property>

  <name>mapred.job.tracker</name>

  <value>master:8021</value>

</property>

<property>

  <name>mapred.job.tracker.http.address</name>

  <value>0.0.0.0:50030</value>

</property>

如果你的程序没有问题,基本你就要从MRv1和MRv2的区别上入手去解决问题了,由于本人技术水平有限,还是个菜鸟,虽然二者的区别,理论我学习了很多,可是实际中eclipse一跑起来,我还真不知道到底能从哪里看出来当前跑的环境是1还是2。本人程序是继承新接口的MRv2,所以在mapred-site.xml的文件里添加如下配置

<property>

  <name>mapreduce.framework.name</name>

  <value>yarn</value>

</property>

设置mapreduce程序跑在Yarn上。

此时不仅Mapreduce程序能跑,sqoop程序也能跑了,欢喜之至。

sqoop程序当时报错,cannot  init cluster

如果你也遇到这样的问题,请查看你的mapreduce跑的框架配置。

3.上面搞完了之后mapreduce倒是能跑了,但是之前好好的hive不能跑了,shell下hive语句都还能正常执行,但是java程序里面的hive调用就不能跑了。

修改hive/conf下hive-site.xml文件,在底部添加如下内容:

<property>

<name>hive.aux.jars.path</name><value>file:///opt/cloudera/parcels/CDH/lib/hive/lib/hive-hbase-handler-0.10.0-cdh4.5.0.jar,file:///opt/cloudera/parcels/CDH/lib/hbase/hbase-0.94.6-cdh4.5.0-security.jar,file:///opt/cloudera/parcels/CDH/lib/zookeeper/zookeeper-3.4.5-cdh4.5.0.jar</value>

</property>

此处切记, <value> </value>中间的内容一定不能加换行或者空格,就因为犯此弱智问题,在<value>后,</value>前手欠加了换行,就报找不到jar包的问题,还以为我把hive环境搞坏了,害我苦苦查找了两天。

参考资料:

1. 新旧hadoop MapReduce实例解析  http://blog.csdn.net/liuxiaochen123/article/details/8786715

2. ClassNotFoundException: Job$Mapper问题及解决  http://hi.baidu.com/yangls06/item/a17251b6a447d77f244b0928

3. MapReduce提交作业常见问题 http://yu06206.iteye.com/blog/1402084

4. Hadoop作业提交分析(五)http://www.cnblogs.com/spork/archive/2010/04/21/1717592.html

上一篇:cmd命令行编译和运行java程序报错 NoClassDefFoundError


下一篇:在VC++空工程中使用MFC类,采用Unicode字符集后,运行工程程序报错的解决方案