hadoop提交作业报ClassNotFoundException错误

之前讲课时老师演示的提交作业都没有包,参数直接跟的主类名,我这次作业有包了但是我加了包名,提交作业时提示我找到不包Exception in thread "main" java.lang.ClassNotFoundException: cn.chinahadoop.test
无标题.png

我提交的命令是hadoop jar /mnt/hbase.jar cn.chinahadoop.test WordCount /test1/input2/* /test1/output2
 

27℃生活

赞同来自: fish wangxiaolei

问题解决了,总结一下:hbase的编程环境最好依赖mven然后mven的配置文件要写正确,如果不是单机测试,eclipse书写MR的时候要记得配上zookeeper的位置和端口。

wangxiaolei

赞同来自: fish

修改hadoop-env.sh文件和yarn-site.xml两个文件,方法是可行的。 关于hbase的jar包依赖问题,刘俊宏老师在录播课程中讲到的, 只需要修改一个配置文件即可,课程有详细操作: http://www.chinahadoop.cn/course/436 第五周第二课《HBase进阶》——小象训练营三期 课时6 练手——基于Java API的DDL与DML操作(必修,与董老师的课程略有重复) hbase直播课理论内容较深,可以先不去看。把录播课老师讲的hbase的api操作和编程,操作一边。 实际操作中会涉及很多mvn,java,shell,的知识,建议多练习。 刘俊宏老师的方案是直接修改hadoop配置文件:/usr/lib/hadoop/libexec/hadoop-config.sh 先使用命令 hadoop classpath 可检查出当前hadoop依赖那些jar,然后在文件最后追加:
if [ -d "/etc/hbase/conf" ]; then
    CLASSPATH=${CLASSPATH}:/etc/hbase/conf;
fi

if [ -d "/usr/lib/hbase" ]; then
    for f in /usr/lib/hbase/hbase*.jar; do
        CLASSPATH=${CLASSPATH}:$f;
    done
fi

if [ -d "/usr/lib/hbase/lib" ]; then
    CLASSPATH=${CLASSPATH}:/usr/lib/hbase/lib/*;
fi

再次使用命令 hadoop classpath 是否看到hbase相关依赖。 不管是那种方式修改都离不开/etc/hbase/conf  /usr/lib/hbase  /usr/lib/hbase/lib 可以思考下为什么只修改这一个配置文件?  

fish - Hadooper

赞同来自:

得是主类名cn.chinahadoop.test.WordCount,命令里面cn.chinahadoop.test跟WordCount之间怎么是空格呢?

fish - Hadooper

赞同来自:

你也可以在小象问答中搜索错误,其他同学之前也遇到类似的问题。 Java中出现NoClassDefFoundError,是因为虚拟机找不到需要的类。 需要使的HBase的jar能被hadoop识别到。于是有两个方法: 1. 在集群中将HBase的Jar包手动拷贝到hadoop的lib目录下。 2. 在Hadoop的配置中,在classpath加上HBase的jar包以及conf所在的位置(为了识别hbase-site.xml)。   第一种方法最直接,直接手动拷贝就行了,但当集群升级或者版本变化时,很容易遗忘之前的修改导致版本冲突。   第二种方法,需要修改的地方:1) 在/etc/hadoop/conf/hadoop-env.sh中,寻找HADOOP_CLASSPATH定义的地方,修改成(其实就是添加HBase的依赖包):export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/usr/lib/hbase/lib/hbase-client-1.0.0-cdh5.4.0.jar:/usr/lib/hbase/lib/hbase-common-1.0.0-cdh5.4.0.jar:/usr/lib/hbase/hbase-protocol-1.0.0-cdh5.4.0.jar:/usr/lib/hbase/lib/htrace-core-3.0.4.jar 2) 在yarn-site.xml的配置项yarn.application.classpath配置中,添加/etc/hbase/conf,/usr/lib/hbase/hbase-common.jar。

27℃生活

赞同来自:

1.png
原本在hadoop-env.sh中的HADOOP_CLASSPATH使用#注释的,我修改成了这样
2.png
这个是yarn-site.xml中的参数 我把配置文件分发到集群中各个节点了,重启了namenode,但是还是提示之前的内个错误

wangxiaolei

赞同来自:

你确定配置的jar包在本地能找到? 老师给你提供的样例,你参照下。需要用自己云主机上对应的hbase有关的jar包。

27℃生活

赞同来自:

要所有的都+进去啊。。。

fish - Hadooper

赞同来自:

请确保修改所涉及的这些jar包在你的机器上实际存在,修改配置时可以尝试理解一下配置的意义。 如果是希望将某个目录下的所有文件加入classpath,可以使用<dir>/*。

fish - Hadooper

赞同来自:

之前的问题已经解决,这是另外一个问题。 告诉我你的机器登录方式,以及你执行任务的目录和命令,我直接上你机器看吧。   接下来要经过yarn logs -applicationId <app_id>查看log,检查yarn配置中关于内存等任务的配置是否正确几步,在问答社区里查询一下以往的问题会看到相关线索,现在关键是你需要掌握自己寻找线索的方法。

fish - Hadooper

赞同来自:

10396 -- process information unavailable 默认情况下,java pid存放在/tmp目录下,由于linux的/tmp目录中的内容会被清理,就会出现jps查看不到进程名字的情况。   但,如果使用的cdh的hadoop安装,并用service脚本启动的服务,其pid不是存放在/tmp目录中。 出现这个问题,有可能与jdk版本,目录权限等其他原因有关,比如http://wenda.chinahadoop.cn/question/123​ 等几个帖子都问起过。   不过,出现10396 -- process information unavailable不影响任务的执行,ps aux | fgrep 10396 看看进程是否存在,如果存在,不会因为这个信息工作不正常。

fish - Hadooper

赞同来自:

你所要提交的是hbase相关的任务么?我看SY-1机器上HMaster没有启动,你先把HBase服务都启动好看看?

fish - Hadooper

赞同来自:

嗨,我在你的机器上执行yarn logs -applicationId application_1452760760943_0005,能看到任务失败时的异常信息: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.hbase.mapreduce.TableOutputFormat not found         at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$1.call(MRAppMaster.java:472)         at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$1.call(MRAppMaster.java:452)         at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.callWithJobClassLoader(MRAppMaster.java:1541)         at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.createOutputCommitter(MRAppMaster.java:452)         at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.serviceInit(MRAppMaster.java:371)         at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)         at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$4.run(MRAppMaster.java:1499)         at java.security.AccessController.doPrivileged(Native Method)         at javax.security.auth.Subject.doAs(Subject.java:415)   你之前查log是如何操作的?

fish - Hadooper

赞同来自:

在SY-1上执行jps,可以看到jobhistory。 TableOutputFormat没有找到,是因为在map/reduce任务的classpath中没有找到hbase的类。   做以下两件事情: 1. 在hadoop-env.sh中,将HADOOP_CLASSPATH定义成export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/usr/lib/hbase/lib/hbase-client-1.0.0-cdh5.4.0.jar:/usr/lib/hbase/lib/hbase-common-1.0.0-cdh5.4.0.jar:/usr/lib/hbase/hbase-protocol-1.0.0-cdh5.4.0.jar:/usr/lib/hbase/lib/htrace-core-3.0.4.jar 2.在yarn-site.xml的yarn.application.classpath配置项中,加上hbase jar包文件名以及配置文件所在目录,比如加上:/usr/lib/hbase/*,/usr/lib/hbase/lib/*,/etc/hbase/conf 。

wangxiaolei

赞同来自:

配置文件修改好后,剩下的就是编程环境了。 使用mvn 构建的hbase编程环境,一定要和当前hadoop集群版本保持一致。 训练营自动搭建的cdh版的mvn依赖,可以参考: http://wenda.chinahadoop.cn/question/2129 hadoop的依赖配置:    <dependency>       <groupId>org.apache.hadoop</groupId>       <artifactId>hadoop-client</artifactId>       <version>2.6.0-cdh5.x.x</version>     </dependency> version的值就是,在云主机上执行 hadoop verison 看到的值,对应自己机器上的版本填写。 hbase 的也是一样。 当前依赖的源是https://repository.cloudera.co ... epos/ 需要连接国外的网,在mvn编译的时候可能有些慢。  

wangxiaolei

赞同来自:

注意:1、配置文件修改正确,2、hbase编程环境依赖和当前hadoop集群版本一致。 在执行hadoop jar命令是才可以运行成功。  

要回复问题请先登录注册