hadoop1.x 升级到hadoop2.2
本文参考了博客:http://blog.csdn.net/ajax_jquery/article/details/27311671,对一些地方做了修改,并详细做了说明
HDFS升级,是hadoop集群升级到2.0的关键,而hdfs升级,最重要的是namenode的升级。
首先声明:hadoop1.x不能直接升级到 HA 模式下,namenode是不能升级成功的,这里也借助hadoop2.x兼容hadoop1.x的配置文件来升级。
如果直接升级hadoop2.x HA模式可能会出现如下错误
FATAL org.apache.hadoop.hdfs.server.namenode.NameNode: Exception in namenode join
org.apache.hadoop.HadoopIllegalArgumentException: Invalid startup option. Cannot perform DFS upgrade with HA enabled
下面是升级hadoop2.x HA 模式的流程,具体为什么要选用HA而不采用HA+Federation 的方式,不是这里要说的问题
先在hadoop1.x模式下将namenode的元数据升级:
step 1: 做下saveNamespace操作,停掉集群,并备份下 HDFS 的 Metadata,操作如下:
1.1 namenode进入safe mode状态
$ bin/hadoop dfsadmin -safemode enter
1.2 执行saveNamespace操作
$ bin/hadoop dfsadmin -saveNamespace
1.3 离开安全模式
$ bin/hadoop dfsadmin -safemode leave
1.4 stop 集群
1.5 备份 dfs.name.dir 下面的元数据
cp -r name /data/zhoulei/bak.name.20140916
step2:
2.1 将集群中hadoop环境换成2.2(注意:这是配置文件必须选用hadoop1.x中/conf/ 中的配置文件。否则会报上面的错误),执行如下升级namenode命令:
hadoop-daemon.sh start namenode -upgrade
step3:
namenode升级完成后,将datanode启动,datanode会自动升级到与namenode相同版本
hadoop-daemons.sh start datanode 此时注意,要启动所有的datanode, 不然也不会出现多大问题,但是其它节点的datanode 却不会自动升级。
3.1 关闭集群
sbin/stop-dfs.sh
3.2 将配置文件升级为2的配置
此时将配置文件全部替换为hadoop2.2的配置文件
3.3 将升级完的namenode元数据一些参数修改一下,改成ha模式:
这时需要将journalnode的元文件的VERSION文件的参数修改,改成与namenode的元数据相同或者使用命令:
I、 先启动 journalnode:sbin/hadoop-daemon.sh start journalnode 此时要注意,所有的Journalnode 都要启动否则下面步骤报错
II、 给namenode安装journalnode共享目录bin/hdfs namenode -initializeSharedEdits 、
如果上面一步没有全部启动,则出现如下错误
14/09/17 10:13:06 ERROR namenode.NameNode: Could not initialize shared edits dirorg.apache.hadoop.hdfs.qjournal.client.QuorumException: Unable to check
if JNs are ready for formatting. 1 successful responses
III、 启动namenode:sbin/hadoop-daemon.sh start namenode
IV、 启动datanode:sbin/hadoop-daemons.sh start datanode 启动所有datanode 节点,或者逐个节点分别启动
此时注意 并没有 active namenode 或是 standby 节点的区别,只有一个节点。
3.4 将active namenode的 {dfs.namenode.name.dir} 目录的内容复制到 standby namenode的{dfs.namenode.name.dir} 目录下然后启动 standby namenode
或者使用命令:
在另外一个 namenode 节点下下执行bin/hdfs namenode -bootstrapStandby 作用与直接拷贝元数据类似
3.5 格式化ZK(在hadoop01上执行即可):bin/hdfs zkfc -formatZK
3.6 重新启动hdfs:sbin/start-dfs.sh(一定要重新启动,否则会出现两个namenode同时都是standby的状态)
此时发现即使重启dfs 但是两个namnode 都为standby 的状态,这是因为 zkfc 并没有启动,此时我们需要做的两个动作
1)分别为每个zookeeper 节点 启动 QuorumPeerMain
zookeeper-3.4.5/bin/zkServer.sh start
2) 在主节点启动zkfc(不一定是主节点)
sbin/hadoop-daemon.sh start zkfc
此时再看两个namenode 守护进程的状态 就会出现一个 active ,一个standby 的状态。
3.7 升级完毕后,namenode和datanode的${ dfs.data.dir}/目录下会多出一个文件夹previous/,这是升级之前数据的备份。
如果确定升级成功,可以使用:bin/hadoop dfsadmin -finalizeUpgrade(要在active的namenode上执行) 最终提交升级