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