我们都知道Hadoop在内部各个节点通信的时候, 必须保证两者版本是一致的(0.19是这样, 0.20以上的不知道). 也就是说JobTracker和TaskTracker必须使用相同的编译版本, 如果不一致, 可能会出现如下错误:
大家看到build version包括了版本, svn revision, 编译者, 编译日期. 如果其中有一个不一致, hadoop就认为是不同的Hadoop版本, 两种禁止进行通信.
但实际情况是, Hadoop集群运行过程中master节点是很少重启的, 而少数几个slave节点重启不会影响到集群的可用性. 有时候, 我们只是修改了TaskTracker的几行代码, JobTracker代码不变, 这些代码并不影响到TT和JT之间的通信. 但是当我们改完代码, 重新编译, 产生的hadoop包却被认为是一个新的版本. 所以如果你想让这个更新生效, 你必须把新生成的包分发到集群所有的节点(包括master), 并重启JT和TT. 甚至你还需要重启NameNode和DataNode, 因为DataNode和TaskTracker一般是在同一台机器上的, 并且使用同一份代码, 所以TT的代码修改还影响到了HDFS的可用性.
其实我们是有办法绕过这个限制的, 方法就是修改Hadoop的编译脚本. 步骤如下:
1. 先用ant编译一下
2. 编辑生成的 build/src/org/apache/hadoop/package-info.java 文件, version, user, date等变量随便填(只要填的和上次编译时的变量一致)
3. 编辑 src/saveVersion.sh 文件, 把最后几行注释掉:
4. 再次用ant编译, 这样你会发现新生成的jar包就能和老的jar包通信了.
本实验只在0.19版本下测试通过, 请谨慎使用. 如果造成数据不兼容, 集群崩溃, 后果自负.
2010-06-07 23:24:10,863 ERROR org.apache.hadoop.mapred.TaskTracker: Shutting down. Incompatible buildVersion.
JobTracker's: 0.19.1-tmp from 79483 by dangyuan on Mon Jan 25 10:49:47 CST 2010
TaskTracker's: 0.19.1-tmp from 79483 by dangyuan on Mon Jan 25 10:50:12 CST 2010大家看到build version包括了版本, svn revision, 编译者, 编译日期. 如果其中有一个不一致, hadoop就认为是不同的Hadoop版本, 两种禁止进行通信.
但实际情况是, Hadoop集群运行过程中master节点是很少重启的, 而少数几个slave节点重启不会影响到集群的可用性. 有时候, 我们只是修改了TaskTracker的几行代码, JobTracker代码不变, 这些代码并不影响到TT和JT之间的通信. 但是当我们改完代码, 重新编译, 产生的hadoop包却被认为是一个新的版本. 所以如果你想让这个更新生效, 你必须把新生成的包分发到集群所有的节点(包括master), 并重启JT和TT. 甚至你还需要重启NameNode和DataNode, 因为DataNode和TaskTracker一般是在同一台机器上的, 并且使用同一份代码, 所以TT的代码修改还影响到了HDFS的可用性.
其实我们是有办法绕过这个限制的, 方法就是修改Hadoop的编译脚本. 步骤如下:
1. 先用ant编译一下
2. 编辑生成的 build/src/org/apache/hadoop/package-info.java 文件, version, user, date等变量随便填(只要填的和上次编译时的变量一致)
/*
* Generated by src/saveVersion.sh
*/
@HadoopVersionAnnotation(version="0.19.1-tmp", revision="79483",
user="dangyuan", date="Mon Jan 25 10:49:47 CST 2010", url="http://svn.dangyuan.com/repos/trunk/hadoop-core")
package org.apache.hadoop;3. 编辑 src/saveVersion.sh 文件, 把最后几行注释掉:
...
mkdir -p build/src/org/apache/hadoop
#cat << EOF | \
# sed -e "s/VERSION/$version/" -e "s/USER/$user/" -e "s/DATE/$date/" \
# -e "s|URL|$url|" -e "s/REV/$revision/" \
# > build/src/org/apache/hadoop/package-info.java
#/*
# * Generated by src/saveVersion.sh
# */
#@HadoopVersionAnnotation(version="VERSION", revision="REV",
# user="USER", date="DATE", url="URL")
#package org.apache.hadoop;
#EOF4. 再次用ant编译, 这样你会发现新生成的jar包就能和老的jar包通信了.
本实验只在0.19版本下测试通过, 请谨慎使用. 如果造成数据不兼容, 集群崩溃, 后果自负.
本文介绍了一种方法绕过Hadoop版本不一致导致的JobTracker和TaskTracker无法通信的问题,通过修改编译脚本来生成兼容版本的jar包。
7097

被折叠的 条评论
为什么被折叠?



