hbase集群之间数据迁移_hbase数据迁移到另一集群上
通常我們都會有將hbase表數據遷到另一個hbase表中業務需要,這種不要著急,我選擇一種最適合的方式,因為每種方式處理的數據量、對集群的壓力都是有差異的
總的劃分可以分為命令行和API兩種方式,本人記錄以下幾種命令方式,有錯誤之處請指正,本篇也僅是自己一些行為記錄
hbase數據 導出 導入;
----------------------使用命令-------------------------1
從一個HBase上把數據export到HDFS生產文件a,再把這個文件a上傳到要導入的集群上,使用import導入到數據庫中,注意數據庫中的表名是否存在
hbase org.apache.hadoop.hbase.mapreduce.Driver export t_gps_std_20190225 hdfs:///tmp/zyr/t_gps_std_20190225
hbase org.apache.hadoop.hbase.mapreduce.Driver import t_gps_std_20190225 hdfs:///tmp/hbasedatabak/part-m-00000
--------------帶參數的方式--------------------------2
-D hbase.mapreduce.scan.row.start=
-D hbase.mapreduce.scan.row.stop=
Export [-D ]* [ [ []] [^[regex pattern] or [Prefix] to filter]]
hbase org.apache.hadoop.hbase.mapreduce.Driver export -D hbase.mapreduce.scan.row.start=0 -D hbase.mapreduce.scan.row.stop=1000?* t_gps_sq_20190424 hdfs:///tmp/zyr/t_gps_sq_20190424_
hbase org.apache.hadoop.hbase.mapreduce.Driver export -D hbase.mapreduce.scan.row.start=\xAD\x5C\xAC\xF6w -D hbase.mapreduce.scan.row.stop=\xAD\x5C\xAD1\xFF?* t_gps_sq_20190424 hdfs:///tmp/zyr/t_gps_sq_20190424___
HBase表快照
--------------HBase表快照功能--------------------------3
HBase快照允許管理員不拷貝數據,而直接克隆一張表,這對域服務器產生的影響最小。將快照導出至其他集群不會直接影響到任何服務器
1.開啟快照功能,在hbase-site.xml文件中添加如下配置項:
hbase.snapshot.enabled
true
2.命令操作
在hbase shell中使用 clone_snapshot,delete_snapshot, list_snapshots, restore_snapshot, snapshot命令。
snapshot:?為某表創建快照 ,例如?snapshot ‘harve_role’,'20180108-harve_role'
list_snapshots:查看快照列表
list_snapshots 'map.*' : 查找以map開頭的snapshot
delete_snapshot:刪除快照,例如?delete_snapshot?'20180108-harve_role'
clone_snapshot:基于快照,clone一個新表。例如?clone_snapshot '20180108-harve_role', ‘harve_role2’
restore_snapshot:基于快照恢復表? 例如:disable ‘harve_role’? ??restore_snapshot '20180108-harve_role'
工具ExportSnapshot:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t_fault_20200327 -copy-to hdfs://mine:8020/hbase/ -mappers 16
執行該命令后,在mine:9000的hdfs中會把t_fault_20200327文件夾copy到/hbase/.hbase-snapshot文件下,進入mine這個hbase集群,執行list_snapshots會看到有一個快照:t_fault_20200327,通過命令clone_snapshot可以把該快照copy成一個新的表,不用提前創建表,新表的region個數等信息完全與快照保持一致。
在使用snapshot把一個集群的數據copy到新集群后,應用程序開啟雙寫,然后可以使用Export工具把快照與雙寫之間的數據導入到新集群,從而實現數據遷移,為保障數據不丟失,Export導出時指定的時間范圍可以適當放寬。
具體操作如下:
(1)創建snapshot
snapshot 'tableName',?‘snapshotName'
(2)遷移snapshot
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot snapshot_src_table \
-mappers 20 \
-bandwidth 1024
這種方式用于將快照表遷移到另外一個集群的時候使用,使用MR進行數據的拷貝,速度很快,使用的時候記得設置好bandwidth參數,以免由于網絡打滿導致的線上業務故障。
(3)恢復snapshot
restore_snapshot ‘snapshotName’
備注:這種方式需要對表進行過disable才能進行restore_snapshot的操作,如果這個還在寫入數據,則需要采用bulkload的方式導入。
(4)將snapshot使用bulkload的方式導入
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
-Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 \
備注1:這種方式需要將所有的文件進行遍歷并全部通過bulkload導入,上面的只是一個文件的導入,這種方式不需要disable表。
備注2:上面的操作1、3、4都是在hbase shell中執行。
Hbase數據遷移之bulkload
與HBase原生Client API和Mapreduce任務(快照、導入命令都基于MR)相比,“Bulk Loading”方法直接生成HFile算是一種比較高效便捷的方法。
BulkLoad將數據批量導入HBase中。支持通過命令行和API兩種操作方式,下面注意記錄本人使用命令方式
1、數據準備
準備StoreFile存儲格式的文件,通過下面任意一個方式都可得到,
1)自己Mapreduce得到
2)如果測試可以copy一個hbase表的文件
操作步驟:
需要導入hbase表的數據保存到hdfs文件系統中,文件 --> hdfs
在hbase中建表,create 'tablename','familyname'
2、導入數據到hbase表里
ImportTsv命令,該命令是把tsv文件轉成hfile文件再導入表中,通常在使用該命令時注意列族,文件大小劃分等參數設置,
直接導入表中:
hadoop jar/opt/cloudera/parcels/CDH/jars/hbase-server-1.0.0-cdh5.4.0.jar importtsv
\-Dimporttsv.separator=","\-Dhbase.hregion.max.filesize=20971520\-Dimporttsv.columns=HBASE_ROW_KEY,familyname:cellname tablename
\/test/test.cvs
或者
導入到hfile文件中
export HBASE_HOME=/opt/hbase
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath`
${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-1.0.0-cdh5.4.0.jar importtsv
\-Dimporttsv.separator=","\-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age tablename
\-Dimporttsv.bulk.output=/test/bulkload/outputdir
\/test/bulkload/simple1.cvs
CompleteBulkLoad命令,該命令將importtsv或HFileOutputFormat的結果文件導入到某張表中
示例:
hadoop jar hbase-VERSION.jar completebulkload [-c /path/to/hbase/config/hbase-site.xml] /myfile mytable
實例:
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles-Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=64 /file tablename
或者
sudo-u hbase hadoop jar $HBASE_HOME/hbase-server-1.2.0-cdh5.15.1.jar completebulkload -Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024 /file tablename
使用中出現錯誤記錄
(1)找不到jar包時處理:導入環境
export HBASE_HOME=/opt/hbase
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath`
或者CDH版本使用
export HADOOP_CLASSPATH=/opt/cloudera/parcels/CDH/lib/hbase/lib/*
(2)目錄結構
保存目錄格式符合 **/列族名/hfile 規則,僅僅適合一次對單列族組織成HFile文件
(3)文件權限
sudo hdfs hdfs dfs chown hbase:hbase /test/hfile/f0
hdfs dfs chmod711 /test/hfile/f0
(4)文件個數太多
錯誤:Trying to load more than 32 hfiles to one family of one region
執行命令時帶參數一次性導入多個文件,默認是32個-Dhbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily=1024
3、查看導入的數據
scan 't1', {COLUMNS => ['f0'], LIMIT => 10}
4、小結
importtsv工具的使用場景較為廣泛,適應于用戶有時希望自己編程生成數據,或以其它格式導入數據,importtsv須要在導入前確定每條數據column維度。須要對工具改造時查看ImportTsv.java和HFileOutputFormat的javaDoc文檔。
completebulkload工具同樣可以編程化實現,需要查看LoadIncrementalHFiles類
總結
以上是生活随笔為你收集整理的hbase集群之间数据迁移_hbase数据迁移到另一集群上的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android的Surface的创建
- 下一篇: Linux如何查看进程、杀死进程、启动进