迁移Hadoop NameNode

版本:hadoop cdh5.4

传输文件

接收方  nc -l 19999 | tar zxvf -
发送方 tar czvf - ./current | nc serverip 19999

迁移方案

采用修改/etc/hosts的方式,把原hostname指向新的IP,新机器更改hostname

迁移前准备

  • 迁移旧namenode机器上的其他服务,只保留HDFS Failover Controller、HDFS JournalNode、HDFS NameNode、ZooKeeper(如有)
  • 在hdfs配置中找出元数据存放目录(dfs.name.dir):/home/cloudera/var/dfs/nn
  • 在新NameNode机器建立好用户和组(否则权限不正确)
  • 如果要迁移Hive Metastore,要注意mysql-connector.jar是否部署好(放在 /usr/share/java/mysql-connector-java.jar)
  • 更改/etc/hosts准备
  • 在新机器部署cloudera

开始迁移

1.备份元数据

  • 让备机NameNode进入安全模式
  • 保存Namespace
  • 进入元数据目录,新建目录,备份fsimage_*(最新的一份)、fsimage_*.md5、seen_txid、VERSION、edits_*
  • 把元数据传到新机器
# 在新机器执行
mkdir -p /home/cloudera/var/dfs/nn/current
chown -R hdfs:hdfs /home/cloudera/var/dfs

# 传输文件(要注意nc的版本)
#接收方 
nc -l 19999 | tar zxvf -
#传送方
tar czvf - ./fsimage_0000000000006460983*  seen_txid  VERSION edits_* | nc serverip 19999  

2.停止NameNode备机服务

  • 把这台机器的所有服务停止,并且删除掉(停止前记录一下上面有哪些服务)
  • 停止两个HDFS Failover Controller
  • 停止旧机器的agent /etc/init.d/cloudera-scm-agent stop
  • 从主机中删除旧机器

3.修改IP和Hostname

  • 修改所有机器的旧hostname指向新IP
  • 修改旧机器的hostname为其他名称(可以不操作)
  • 修改新机器的hostname为旧机器hostname,注意/etc/hosts里面本机的原有hostname/IP注释掉
  • 重启新机器的cloudera agent:/etc/init.d/cloudera-scm-agent restart
  • 重启完成检查主机名称是否变更
  • 重启agent后要重新部署CDH

4.重新添加回服务

  • 添加ZooKeeper
  • 添加Hive Metastore
  • 添加NameNode、JournalNode、Failover Controller,需要改nameservice,先启动NameNode
  • 等namenode汇报完块后

5.重启

  • 重启zookeeper(全部重启)
  • 重启hbase
  • 重启impala
  • 重启nodemanager、history server
  • 重启spark
  • 重启所有用了hdfs常驻型的程序

等新机器NameNode正常后,切换为主NameNode

错误处理

namenode (osg13-vm05) 在其主机上不具备自动故障转移所必需的 Failover Controller。
没有添加Failover Controller,添加一个

检查

hdfs:hdfs dfs -ls /tmp
hive:show tables;
impala
show tables; desc xxx; select
hbase

hbase shell
list
desc "gjtt_uid"
scan 'gjtt_uid',{LIMIT =>2}

hadoop

hadoop jar /home/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar pi 1 10

spark
spark-shell

val input = sc.textFile("/tmp/issue")
input.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).foreach(println)

回滚

把hosts改回去,namenode切换回去

做不到不影响服务的原因

一开始以为是java缓存了host/IP,但测试之后发现java只缓存30秒。
原因是DfsClient在建立rpcProxy对象的时候,已经把namenode两台机器的host解析出来,并且放在ConnectionId里,这个对象会一直使用。
补丁HADOOP-7472 只解决了在没有HA的场景,不过也让datanode可以不用重启。
在HA场景下,恰好让上面的补丁失效了。
在社区找了一下新的ISSUE https://issues.apache.org/jira/browse/HADOOP-12125 ,但可能不是重要的问题,也没人提交补丁。因为涉及比较基础的类,影响比较大,也不打算修改,采取重启的方式。
也尝试了一些奇怪的方法,但是没有很好的解决问题,还是选择重启服务。




fatkun

折腾一下又不会死~