目前大部分使用的hadoop集群都是2.x版本的了,这个版本比 hadoop 1.0 添加了namenode 的HA ,解决了namenode单点的问题。但是还是会有紧急情况发生 【比如 两个互为主备的namenode 节点中的某一个节点硬件损坏了】本文描述的过程就是如何把一个datanode节点变成namenode节点在不关掉集群的情况下。【eplacing a name node in an existing HA cluster .[DateNode to NameNode】
DataNode 退役
1.1节点退役 Decommission Datanode
Decommission Datanode就是把Datanode从HDFS集群中移除掉。
Datanode是存储实际数据的,因此在Decommission Datanode的时候需要把Datanode上的数据迁移到别的机器上。下线的时候Datanode会有以下操作,1:计算块信息 2:删除块 3:copy块 4:校验块信息操作步骤如下:
- 在Namenode上,把需要Decommission的Datanode的机器名加入到dfs.hosts.exclude(该配置项在hdfs-site.xml)所指定文件中,也就是告诉Namenode哪些Datanode要被Decommission。
如果hdfs-site.xml没有找到dfs.hosts.exclude,那么就手动把下面内容加入到hdfs-site.xml中,然后把需要Decommission的机器写到文件/etc/hadoop/conf/dfs.exclude中去。
<property>
<name>dfs.hosts.exclude</name>
<value>/etc/hadoop/conf/dfs.exclude</value>
</property>exclude 例子: datanode1
启动Decommission:
hdfs dfsadmin -refreshNodes
- 刷新后在hfs页面可以看见 Decommission In Progress 的节点
- 如果加速下线 可以把块的复制个数减少
停止要迁移的namenode上面的所有进程
[NameNode,ResourceManager,FailOverControl,JournalNode]等等
scp namenode上的配置信息给datanode *-site.xml 等
- scp editlogs/FSimage to datanode
- 修改 /etc/hosts 把 datanode hostname 和 namenode hostname对换掉
- 在新的namenode节点上启动服务
例如:
hadoop-daemon.sh start namenode
yarn-daemon.sh start resourcemanager
hadoop-daemon.sh start zkfc
yarn rmadmin -getServiceState rm1 # for checking
hdfs haadmin -getServiceState namenode2
journalnode 的迁移
当你想添加或者修改一个journalnode在一个HA 集群中,请参考以下步骤:
- 配置这个新的journalnode 参照已经存在的journalnode节点
- 把dfs.journalnode.edits.dir scp到这个新的节点 进行初始化
- 启动journalnode进程
- 把配置信息同步给namenodes,更新 dfs.namenode.shared.edits.dir 信息加入新的journalnode节点
- 重启 standby namenode
- 当确认standby namenode 重启完成并且没有报错后,重启active namenode
如果是新添加一个journalnode 可以
停止 NameNode, 然后运行命令
hdfs namenode -initializeSharedEdits