版本:hadoop cdh5.4

传输文件

接收方  nc -l <span class="hljs-number">19999</span> <span class="hljs-string">| tar zxvf -</span>
发送方 tar czvf - ./current <span class="hljs-string">| nc serverip 19999</span>

迁移方案

采用修改/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_*
  • 把元数据传到新机器
<span class="hljs-preprocessor"># 在新机器执行</span>
mkdir -p /home/cloudera/<span class="hljs-keyword">var</span>/dfs/nn/current
chown -R hdfs:hdfs /home/cloudera/<span class="hljs-keyword">var</span>/dfs

<span class="hljs-preprocessor"># 传输文件(要注意nc的版本)</span> <span class="hljs-preprocessor">#接收方 </span> nc -l <span class="hljs-number">19999</span> | tar zxvf - <span class="hljs-preprocessor">#传送方</span> tar czvf - ./fsimage_0000000000006460983* seen_txid <span class="hljs-constant"> VERSION </span>edits_* | nc serverip <span class="hljs-number">19999</span>

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
<span class="hljs-keyword">list</span>
desc <span class="hljs-string">"gjtt_uid"</span>
scan <span class="hljs-string">'gjtt_uid'</span>,{LIMIT =><span class="hljs-number">2</span>}

hadoop

hadoop jar /home/cloudera/parcels/CDH/lib/hadoop<span class="hljs-attribute">-mapreduce</span>/hadoop<span class="hljs-attribute">-mapreduce</span><span class="hljs-attribute">-examples</span><span class="hljs-built_in">.</span>jar pi <span class="hljs-number">1</span> <span class="hljs-number">10</span>

spark
spark-shell

val input = sc<span class="hljs-preprocessor">.textFile</span>(<span class="hljs-string">"/tmp/issue"</span>)
input<span class="hljs-preprocessor">.flatMap</span>(_<span class="hljs-preprocessor">.split</span>(<span class="hljs-string">" "</span>))<span class="hljs-preprocessor">.map</span>((_, <span class="hljs-number">1</span>))<span class="hljs-preprocessor">.reduceByKey</span>(_ + _)<span class="hljs-preprocessor">.foreach</span>(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 ,但可能不是重要的问题,也没人提交补丁。因为涉及比较基础的类,影响比较大,也不打算修改,采取重启的方式。
也尝试了一些奇怪的方法,但是没有很好的解决问题,还是选择重启服务。