几个关键点
在 Hadoop-2.7.2 和 Hadoop-2.8.5 中
-
Hadoop RPC 版本一致,都为9,因此基础通信 OK
RpcConstants.CURRENT_VERSION = 9 -
Hadoop 自身提供保证:高版本中各组件的 protocol 向下兼容,即:RPC 调用的参数、语义等保证向下兼容
-
NameNode、DataNode、JournalNode 的存储 layout 相同,因此 fsimage、editlog、block/meta 文件的格式、布局均一致,详细如下:
-
Hadoop-2.7.2
HdfsConstants.NAMENODE_LAYOUT_VERSION = -63
HdfsConstants.DATANODE_LAYOUT_VERSION = -57
JournalNodeLayOutVersion = HdfsConstants.NAMENODE_LAYOUT_VERSION = -63 -
Hadoop-2.8.5
HdfsServerConstants.NAMENODE_LAYOUT_VERSION = -63
HdfsServerConstants.DATANODE_LAYOUT_VERSION = -57
JournalNodeLayOutVersion = HdfsConstants.NAMENODE_LAYOUT_VERSION = -63
-
-
不存在兼容性 gap
NN 和 DN 之间有一个特殊的兼容性 gap: 2.8.5的 NN 能向下兼容的最小 DN 版本是 2.1.0-beta。除此之外,没有其它特殊的兼容性gap。
dfs.namenode.min.supported.datanode.version = 2.1.0-beta
结论
- 在这种情况下,不需要滚动升级这么麻烦,天然支持热升级,直接替换新版本,然后重启进程就可以了,如果中途出现任何问题,也都可以替换老版本,再重启进程进行回退。
- 按照先升 server 后升 client 的原则,升级顺序如下,升级时务必顺序升级,回退时务必逆向回退:
- JN
- NN
- DN
跨版本访问 HDFS
用 2.7.2 的 HDFS client 访问 2.8.5 的集群时,由于满足下面两个条件,所以没什么问题:
- Hadoop RPC 版本一致,基础通信 OK。
- Hadoop 2.8.5 中各组件的 protocol 向下兼容 2.7.2。
禁止事项
不要出现 2.7.2 NN + 2.8.5 DN 的组合
在 2.8.5 中, DataNode 的 DatanodeProtocol.sendHeartbeat() 接口中新增了一个 optional 的 bool 类型参数,控制是否需要进行 blockReport,而 2.7.2 的 NN 不认识这个参数,这会导致 DN 永远不能 blockReport(必须手动触发),最终导致 NameNode 无法从 SafeMode 中退出。











网友评论