您的位置:首页 > 运维架构

Hadoop1.x 源码修改编译执行

2013-07-25 17:36 495 查看
以rpm方式安装的hadoop-1.1.2为例:

1.cmd进入到$HADOOP_HOME目录中运行ant命令,就可以编译成功了,他会在$HADOOP_HOME目录下生成一个build目录,build目录下会生成新的jar包。

2.将该jar包覆盖掉所有节点上的/usr/share/hadoop/(如果是tar.gz直接解压的话,目录是$HADOOP_HOME/)目录下的hadoop-*-1.1.2.jar,这里有一个过程特别注意,再做这一步的时候一定要把原开启的hadoop全部关掉(stop-all.sh),然后再做替换!替换后在重新开启(start-all.sh),更改conf中core-site.xml,hdfs-site.xml,mapred-site.xml最好也是先关掉,改了后再重启。

常见问题:

1.编译的时候报错:“java.lang.NoSuchMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext……”

解决方法:

遇到过几次这个异常了,导致这个异常的原因是 jar 包冲突,例如:jsp-api-2.0.jar 和 servlet-api-2.4.jar

通常是项目发布到 Tomcat 后,上面 2 个 jar 包,同时存在于项目资源和 Tomcat 中,删掉项目资源中 jar 包即可。

在编译的时候classpath路径下,不必要的jar包先去掉

2.替换后启动时报错:“binary operator expecte”

问题描述:

[root@namenode1 hadoop]# start-dfs.sh

starting namenode, logging to /var/log/hadoop/root/hadoop-root-namenode-namenode1.out

/usr/libexec/../bin/hadoop: line 155: [: /usr/libexec/../share/hadoop/hadoop-core-1.1.2.jar: binary operator expected

Error: Could not find or load main class org.apache.hadoop.util.PlatformName

Error: Could not find or load main class org.apache.hadoop.hdfs.server.namenode.NameNode

datanode2: starting datanode, logging to /var/log/hadoop/root/hadoop-root-datanode-datanode2.out

datanode1: ssh: connect to host datanode1 port 55667: Connection refused

datanode2: /usr/libexec/../bin/hadoop: line 155: [: /usr/libexec/../share/hadoop/hadoop-core-1.1.2.jar: binary operator expected

datanode2: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/util/PlatformName

datanode2: Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.util.PlatformName

datanode2:      at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

datanode2:      at java.security.AccessController.doPrivileged(Native Method)

datanode2:      at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

datanode2:      at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

datanode2:      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

datanode2:      at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

datanode2: Could not find the main class: org.apache.hadoop.util.PlatformName.  Program will exit.

namenode1: starting secondarynamenode, logging to /var/log/hadoop/root/hadoop-root-secondarynamenode-namenode1.out

namenode1: /usr/libexec/../bin/hadoop: line 155: [: /usr/libexec/../share/hadoop/hadoop-core-1.1.2.jar: binary operator expected

namenode1: Error: Could not find or load main class org.apache.hadoop.util.PlatformName

namenode1: Error: Could not find or load main class org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode

解决方法:

在hadoop的Lib目录下多拷贝了一下名称前缀相同的Jar文件(或者之前的文件备份在当前目录下且与新jar文件名前缀相同),导致hadoop脚本中if语句判断出错,删除多余的jar包后,解决。网上找到的原因

thats because/myfilelocationpath/temp/bingofile* will return more than one file name and ifcan't test all at once.. so its better go for forloop..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: