[How to]HBase集羣備份方法

1.簡介html

  當HBase數據庫中存在很是重要的業務數據的時候爲了保護數據的能夠對數據進行備份處理。對於HBase來講從備份操做來看可分爲離線備份和在線備份。java

 

2. 前準備node

  在測試環境上準備有哦兩套HBase集羣,資源有限緣由他們共享一個hdfs集羣和zookeeper,經過配置不一樣node路徑和數據路徑來區別開。ios

    

    

  其中xufeng-1上的集羣中沒有任何數據,xufeng-3集羣上存在一些表和數據:算法

     

 

3.離線備份數據庫

 

    離線備份顧名思義,在作備份的時候須要將集羣中止,而後將集羣在hdfs上的數據文件夾完整的拷貝到其餘目錄或者其餘hdfs上,以後可使用讓其餘集羣或本集羣從新加載這些數據從而達到備份的目的。之因此須要中止集羣,由於若是集羣處於服務狀態的話,若是拷貝過程當中,有數據正在插入或者表正在被建立等就會形成備份的數據的內部衝突。apache

  3.1需求api

    對於上述前準備的兩個集羣,咱們將xufeng-3這個集羣上的數據備份出來,而後將這些數據直接拷貝到xufeng-1這個集羣的對應的hdfs目中去。啓動集羣xufeng-1檢查數據備份是否成功。app

  3.2 實現步驟:框架

  步驟1:中止兩個集羣

  步驟2:刪除目標目錄文件夾

hadoop fs -rmr /hbase_backup

 

  步驟3:因爲在測試中實在同一個hdfs集羣上拷貝數據的,因此這裏簡單地使用了hadoop fs -cp 命令將xufeng-3集羣對應的/hbase目錄下的全部內容拷貝到xufeng-1集羣對應的/hbase_backup目錄中去。

hadoop fs -cp /hbase /hbase_backup

  步驟4:啓動xufeng-1集羣檢查結果:

hbase(main):001:0> list
TABLE                                                                                                                                                                                
bulkload_test                                                                                                                                                                        
bulkload_text                                                                                                                                                                        
coprocessor_table                                                                                                                                                                    
mr_secondindex_resouce                                                                                                                                                               
mr_secondindex_resource                                                                                                                                                              
mr_secondindex_result                                                                                                                                                                
mr_secondindex_test                                                                                                                                                                  
usertable                                                                                                                                                                            
8 row(s) in 0.4480 seconds

=> ["bulkload_test", "bulkload_text", "coprocessor_table", "mr_secondindex_resouce", "mr_secondindex_resource", "mr_secondindex_result", "mr_secondindex_test", "usertable"]
hbase(main):003:0> scan 'bulkload_test'
ROW                                            COLUMN+CELL                                                                                                                           
 rowKey10                                      column=f1:a, timestamp=1469912957257, value=a_10                                                                                      
 rowKey10                                      column=f2:b, timestamp=1469912957257, value=b_10                                                                                      
 rowKey6                                       column=f1:a, timestamp=1469912957257, value=a_6                                                                                       
 rowKey6                                       column=f2:b, timestamp=1469912957257, value=b_6                                                                                       
 rowKey7                                       column=f1:a, timestamp=1469912957257, value=a_7                                                                                       
 rowKey7                                       column=f2:b, timestamp=1469912957257, value=b_7                                                                                       
 rowKey8                                       column=f1:a, timestamp=1469912957257, value=a_8                                                                                       
 rowKey8                                       column=f2:b, timestamp=1469912957257, value=b_8                                                                                       
 rowKey9                                       column=f1:a, timestamp=1469912957257, value=a_9                                                                                       
 rowKey9                                       column=f2:b, timestamp=1469912957257, value=b_9                                                                                       
5 row(s) in 0.3340 seconds

 

  3.3 離線備份總結

    經過上述方式讓一個新集羣接收備份數據的前提是,這個集羣必須是新建的純淨的,不管在zookeeper上都不能有垃圾數據。另外更加可靠的作法就是你能夠先去備份數據,而後在創建hbase集羣,在配置文件中將其目錄指定到備份文件的目錄便可。此種備份方法能夠定時執行,由於並非是實時備份,因此存在丟失數據的風險。

 

4. 在線備份

  在線備份的意思是指不中止集羣,將數據備份到同一個集羣或者不一樣集羣。好處顯而易見,業務不會中止。

在線備份的方法通常有三種:

  1. copyTable
  2. export and import
  3. replication

  

1.copyTable使用方法

  這種方式經過MR計算框架將數據從源表中讀取出來,在將這些數據插入到目標集羣的目標表中。讀取和插入都是走API 客戶端的。

  1. 首先咱們在兩個集羣中創建兩張表,在xufeng-3的backup_test_copytable_source做爲備份源表,在xufeng-1集羣上的backup_test_copytable_dest表做爲備份目標表。

   須要注意的是: 兩個表的結構須要保持一致。

backup_test_copytable_source表結構:

hbase(main):003:0> describe 'backup_test_copytable_source'
Table backup_test_copytable_source is ENABLED                                                
backup_test_copytable_source                                                                 
COLUMN FAMILIES DESCRIPTION                                                                  
{NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0',
 VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_
CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}          
{NAME => 'f2', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0',
 VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_
CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}          
2 row(s) in 0.0450 seconds

 

backup_test_copytable_dest表結構:

hbase(main):019:0> describe 'backup_test_copytable_dest'
Table backup_test_copytable_dest is ENABLED                                             
backup_test_copytable_dest                                                              
COLUMN FAMILIES DESCRIPTION                                                             
{NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE =>
 '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEE
P_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 't
rue'}                                                                                   
{NAME => 'f2', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE =>
 '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEE
P_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 't
rue'}                                                                                   
{NAME => 'f3', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE =>
 '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEE
P_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 't
rue'}   

  

  2.保持backup_test_copytable_dest表爲空。咱們在backup_test_copytable_source中插入測試數據,其中在f1列族和f2列族上都插入數據:

hbase(main):002:0> scan 'backup_test_copytable_source'
ROW                      COLUMN+CELL                                                         
 row1                    column=f1:a, timestamp=1469925544667, value=f1aValue                
 row1                    column=f1:b, timestamp=1469925535422, value=f1bValue                
 row1                    column=f2:a, timestamp=1469925564187, value=f2aValue                
 row1                    column=f2:b, timestamp=1469925573770, value=f2bValue                
 row2                    column=f1:a, timestamp=1469925646986, value=f1aValue                
 row2                    column=f1:b, timestamp=1469925653872, value=f1bValue                
 row2                    column=f2:a, timestamp=1469925662058, value=f2aValue                
 row2                    column=f2:b, timestamp=1469925667362, value=f2bValue 

 

   3.需求:咱們須要將backup_test_copytable_source的f1列族下的數據備份到backup_test_copytable_dest的f1列族中:

  在xufeng-3備份源集羣上執行:

HADOOP_CLASSPATH=`/opt/hadoop/hbase/bin/hbase classpath` hadoop jar hbase-server-1.0.0-cdh5.4.2.jar copytable --families=f1 --peer.adr=xufeng-1:2181:/hbase_backup --new.name=backup_test_copytable_dest backup_test_copytable_source

  其中: 

    --families:須要備份的列族信息

    --peer.adr:目標集羣在zookeeper的根節點信息,也就指明瞭目標集羣的訪問地址

    --new.name:備份目標表名

  最後執行備份源表名要將backup_test_copytable_source的f1列族

  

  4.上述命令會執行MR任務,最後會將數據拷貝的目標表中:

hbase(main):021:0> scan 'backup_test_copytable_dest'
ROW                     COLUMN+CELL                                                     
 row1                   column=f1:a, timestamp=1469925544667, value=f1aValue            
 row1                   column=f1:b, timestamp=1469925535422, value=f1bValue            
 row2                   column=f1:a, timestamp=1469925646986, value=f1aValue            
 row2                   column=f1:b, timestamp=1469925653872, value=f1bValue            
2 row(s) in 0.1820 seconds

  

  5. 除了上述參數外,也能夠經過starttime和endtime參數來指定備份的時間段,這樣咱們能夠進行增量備份。可是因爲數據的timestamp用戶插入數據的時候能夠指定的,因此根據starttime/endtime來進行增量備份的時候須要業務配合,插入數據的時候不要指定timestamp值,或者插入的timestamp值有增量的特色。

具體的copytable使用方法能夠參考:

[hadoop@xufeng-3 lib]$ HADOOP_CLASSPATH=`/opt/hadoop/hbase/bin/hbase classpath` hadoop jar hbase-server-1.0.0-cdh5.4.2.jar copytable
Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] <tablename>

Options:
 rs.class     hbase.regionserver.class of the peer cluster
              specify if different from current cluster
 rs.impl      hbase.regionserver.impl of the peer cluster
 startrow     the start row
 stoprow      the stop row
 starttime    beginning of the time range (unixtime in millis)
              without endtime means from starttime to forever
 endtime      end of the time range.  Ignored if no starttime specified.
 versions     number of cell versions to copy
 new.name     new table's name
 peer.adr     Address of the peer cluster given in the format
              hbase.zookeeer.quorum:hbase.zookeeper.client.port:zookeeper.znode.parent
 families     comma-separated list of families to copy
              To copy from cf1 to cf2, give sourceCfName:destCfName. 
              To keep the same name, just give "cfName"
 all.cells    also copy delete markers and deleted cells
 bulkload     Write input into HFiles and bulk load to the destination table

Args:
 tablename    Name of the table to copy

Examples:
 To copy 'TestTable' to a cluster that uses replication for a 1 hour window:
 $ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable 
For performance consider the following general option:
  It is recommended that you set the following to >=100. A higher value uses more memory but
  decreases the round trip time to the server and may increase performance.
    -Dhbase.client.scanner.caching=100
  The following should always be set to false, to prevent writing data twice, which may produce 
  inaccurate results.
    -Dmapreduce.map.speculative=false

  6.copyTable備份總結:

    此方法使得在兩個集羣同時online的時候進行備份,與離線備份同樣,因爲須要週期性的執行,也會存在數據丟失的風險。

    經過copytable方法是針對單個表的備份操做,若是須要進行多個表的備份須要分別處理。

    另外因爲是經過api的方式讀取備份源表的數據,因此勢必會形成備份源數據的性能降低。

 

2.export and import

  這種方法經過export工具執行MR任務讀取HBase表數據(經過HBase 客戶端)dump到相同集羣的hdfs上,文件的格式是sequence格式的,在dump的時候能夠指定MR的參數來進行壓縮。

後續若是須要restore數據的時候經過import將dump下來的文件經過MR任務進行數據插入(經過HBase客戶端)。

  1. 在xufeng-3備份源集羣上建立以下表並插入數據:

hbase(main):002:0> create 'backup_test_exporttable_source','f1','f2'
0 row(s) in 1.4780 seconds

hbase(main):012:0> scan'backup_test_exporttable_source'
ROW                     COLUMN+CELL                                                     
 row1                   column=f1:a, timestamp=1469931540396, value=f1-a                
 row1                   column=f1:b, timestamp=1469931546015, value=f1-b                
 row1                   column=f2:a, timestamp=1469931556171, value=f2-a                
 row1                   column=f2:b, timestamp=1469931551950, value=f2-b                
 row2                   column=f1:a-2, timestamp=1469931578074, value=f1-a-2            
 row2                   column=f1:b-2, timestamp=1469931585208, value=f1-b-2            
 row2                   column=f2:a-2, timestamp=1469931595183, value=f2-a-2            
 row2                   column=f2:b-2, timestamp=1469931641553, value=f2-b-2   

 

  2.xufeng-3集羣上經過以下命令出發dump文件MR任務:

 

HADOOP_CLASSPATH=`/opt/hadoop/hbase/bin/hbase classpath` hadoop jar hbase-server-1.0.0-cdh5.4.2.jar export -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK backup_test_exporttable_source /backuptestdata/backup_test_exporttable_source_dumpfiles

 

  其中經過-D指令來想MR任務配置參數,這裏咱們設置其在block上進行gzip的壓縮算法。最後兩個參數是表名和dump到的目標文件夾目錄。

  上述任務會經過HBase的API進行表的scan而後將結果存儲到文件中去。

 

    3.查看hdfs文件系統確認dump的文件結果:

[hadoop@xufeng-1 ~]$ hadoop fs -ls /backuptestdata/backup_test_exporttable_source_dumpfiles
16/07/30 22:36:02 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2016-07-30 22:32 /backuptestdata/backup_test_exporttable_source_dumpfiles/_SUCCESS
-rw-r--r--   1 hadoop supergroup        409 2016-07-30 22:32 /backuptestdata/backup_test_exporttable_source_dumpfiles/part-m-00000

 

 

  4。除了上述名另外咱們還能夠指定數據的版本號和開始timestamp和結束timestamp來進行增量的dump備份,固然如copytable同樣,對於timestamp的增量備份須要業務配合,最好是插入數據的時候不要認爲指定。

  具體其還有那些參數能夠參看export的具體使用方法:

 

[hadoop@xufeng-3 lib]$ HADOOP_CLASSPATH=`/opt/hadoop/hbase/bin/hbase classpath` hadoop jar hbase-server-1.0.0-cdh5.4.2.jar export
ERROR: Wrong number of arguments: 0
Usage: Export [-D <property=value>]* <tablename> <outputdir> [<versions> [<starttime> [<endtime>]] [^[regex pattern] or [Prefix] to filter]]

  Note: -D properties will be applied to the conf used. 
  For example: 
   -D mapreduce.output.fileoutputformat.compress=true
   -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec
   -D mapreduce.output.fileoutputformat.compress.type=BLOCK
  Additionally, the following SCAN properties can be specified
  to control/limit what is exported..
   -D hbase.mapreduce.scan.column.family=<familyName>
   -D hbase.mapreduce.include.deleted.rows=true
   -D hbase.mapreduce.scan.row.start=<ROWSTART>
   -D hbase.mapreduce.scan.row.stop=<ROWSTOP>
For performance consider the following properties:
   -Dhbase.client.scanner.caching=100
   -Dmapreduce.map.speculative=false
   -Dmapreduce.reduce.speculative=false
For tables with very wide rows consider setting the batch size as below:
   -Dhbase.export.scanner.batch=10

 

  5.對於上述dump出的文件會放在與HBase集羣一樣資源的hdfs上,因此建議能夠拷貝的外部hdfs集羣或者經過外部介質存儲。

 

  6.如今表已經dump出來了,如何restore呢?咱們在另一個HBase集羣xufeng-3上創建表,這個表的結構須要和備份源表列族等信息結構一致:

 

hbase(main):005:0> create 'backup_test_exporttable_dest','f1','f2'
0 row(s) in 6.8200 seconds

hbase(main):010:0> scan 'backup_test_exporttable_dest'
ROW                      COLUMN+CELL                                                        
0 row(s) in 0.0200 seconds

 

     7.經過以下命令將數據restore到目標表中去。

 

HADOOP_CLASSPATH=`/opt/hadoop/hbase/bin/hbase classpath` hadoop jar hbase-server-1.0.0-cdh5.4.2.jar import backup_test_exporttable_dest /backuptestdata/backup_test_exporttable_source_dumpfiles

 

  這個命令比較簡單,只要指定目標表和dump文件父路徑便可。

  上述命令會讀取dump命令中的內容而後組裝成put將數據插入的目標表中去。

  8.檢查目標表數據

 

=> ["backup_test_copytable_dest", "backup_test_exporttable_dest"]
hbase(main):002:0> scan 'backup_test_exporttable_dest'
ROW                      COLUMN+CELL                                                        
 row1                    column=f1:a, timestamp=1469931540396, value=f1-a                   
 row1                    column=f1:b, timestamp=1469931546015, value=f1-b                   
 row1                    column=f2:a, timestamp=1469931556171, value=f2-a                   
 row1                    column=f2:b, timestamp=1469931551950, value=f2-b                   
 row2                    column=f1:a-2, timestamp=1469931578074, value=f1-a-2               
 row2                    column=f1:b-2, timestamp=1469931585208, value=f1-b-2               
 row2                    column=f2:a-2, timestamp=1469931595183, value=f2-a-2               
 row2                    column=f2:b-2, timestamp=1469931641553, value=f2-b-2               
2 row(s) in 0.3430 seconds

  9.總結

    export和import的組合使用能夠進行數據的文件落地而後在restore,他們都是MR任務經過HBase API進行數據的讀取和插入。對於dump出來的文件建議放在不一樣的hdfs集羣上避免丟失。

 

  3. replication

    此種機制相對來講比較複雜,其實HBase本省的備份機制。前述的幾種方法都是借用MR和HBAse客戶端進行數據的轉移。

    對於replication的用戶會在另外的博文中演示說明[How to]HBase集羣備份方法--Replication機制

 

 

5.總計

  對於生產版本的數據的維護都是如履薄冰,備份機制可讓咱們在現有集羣宕機或者損毀的狀況下繼續有備份集羣進行快速的數據恢復和提供服務。

相關文章
相關標籤/搜索