前言
由於項目數據安全的需要,這段時間看了下hadoop的distcp的命令使用,不斷的糾結的問度娘,度娘告訴我的結果也讓我很糾結,都是抄來抄去,
還好在犧牲大量的時間的基礎上還終於搞出來了,順便寫這個隨筆,記錄下。
環境
目前我們是兩套同版本的CDH集群,集群內的節點通信使用的私網,提供浮動ip對外通信,也就是說,兩個集群間的私網是不互通的,只能通過浮動ip
進行通信。
操作
使用hadoop提供的distcp命令進行數據遷移 (數據源集群source和目標集群target版本相同)
遷移hdfs的文件
1)、將source的hosts配置復制到target的hosts中 , 注意使用source的節點的浮動ip
2)、由於集群的節點是以私網的方式通信,如果是這種情況,必須開啟namenode和datanode都綁定到了0.0.0.0 ,不然會報連接拒絕的異常
2)、在target的namenode中進入hdfs用戶 (為的是避免寫hdfs出現 權限問題 )
3)、在tartget的namenode中使用命令 hadoop distcp -overwrite -i webhdfs://sourceNN:50070/solr webhdfs://targetNN:50070/
(說明: 中間的參數 不明白 ,可以問度娘或自己看官方文檔,
sourceNN source集群的NameNode, 由於不能使用私網通信,所以只能選擇 webhdfs, 端口是cdh默認的端口50070)
遷移hbase 推薦使用方案二 簡單 效率高
方案1
4)、直接使用HBASE提供的exort和import工具,這些工具包含在HBASE的jar包中。他們使用MAPREDUCE進行導入導出操作,可以將部分或全部表寫入到HDFS文件中。
hadoop jar hbase-0.94.10.jar export -Dhbase.client.scanner.caching=100 weather_data /weather_data
export命令后面,用戶必須從左到右指定參數,不能省略這中間任何一個參數。
5)、使用distcp命令將導出的文件復制到目標集群以后再使用導入命令進行導入。
6)、HBASE數據導入
hadoop jar hbase-0.94.10.jar import weather_data /weather_data
方案2:
7)、在tartget的namenode中執行 hadoop distcp webhdfs://sourceNN:50070/hbase/data/default hdfs://targetNN:50070/hbase/data/ 遷移hbase中命名空間是default的所有的表
8)、遷移完成之后,啟動hbase集群服務,並執行如下的兩個命令,恢復元數據,否則hbase集群不會識別新遷移過來的表:
hbase hbck -fix
hbase hbck -repairHoles
(注意 : 可能會有權限問題, 通過提升權限或換用戶解決)
總結
1)、出現異常,根據異常問度娘,有條件最好問谷歌, 多看官方文檔,檢查是否參數使用正確。
2)、假如distcp一個目錄時出現 file not exist 異常,有可能是目錄過大導致的,可以試着減少distcp的文件目錄數量,假如還報異常,那還是檢查下是不是參數有問題。
3)、認真分析自己使用distcp碰到的問題, 不可盲從百度出的結果。
