Author:Pirate Leo
myBlog: http://blog.csdn.net/pirateleo/
myEmail: [email protected]
轉載請註明出處,謝謝。
文中可能涉及到的API:
Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/
HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.html
Begin!
一、概述
使用了HBase提供的Export與Import工具。
Export:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/Export.html
Import:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/Import.html
看到這兩個類所在目錄我們瞭解到,Export與Import的實質是MapReduce任務。
關於這兩個工具API中寫的很清楚:
Export an HBase table. Writes content to sequence files up in HDFS. Use Import to read it back in again.
將HBase的表導出爲HDFS的sequence files。
Export如其名,只是導出工具,如何完成備份功能呢?
二、功能實驗
測試過程涉及很多數據,這裏僅提供重要結論:
1、Export是以表爲單位導出數據的,若想完成整庫的備份需要執行n遍。
2、Export在shell中的調用方式類似如下格式:
./hbase org.apache.hadoop.hbase.mapreduce.Export 表名 備份路徑 (版本號) (起始時間戳) (結束時間戳)
Export [-D <property = value>]* <tableName> <outputDir> [<versions> [<startTime> [<endTime>]]]
括號內爲可選項,例如
./hbase org.apache.hadoop.hbase.mapreduce.Export 'contentTbl' /home/codeevoship/contentBackup20120920 1 123456789
備份contentTbl這張表到/home/codeevoship/contentBackup20120920目錄下(最後一級目錄必須由Export自己創建),版本號爲1,備份記錄從123456789這個時間戳開始到當前時間內所有的執行過put操作的記錄。
注意:爲什麼是所有put操作記錄?因爲在備份時是掃描所有表中所有時間戳大於等於123456789這個值的記錄並導出。如果是delete操作,則表中這條記錄已經刪除,掃描時也無法獲取這條記錄信息。
3、當不指定時間戳時,備份的就是當前完整表中的數據。
三、實施細節
1、如何在增量備份時體現出對數據的刪除操作?
由於Export按時間戳備份只能反映出Put過的表項,若我在一個備份(增量包)時間區間內刪除了某條已有記錄,當數據庫回檔時,這條被刪除的記錄又會出現在我的表中。
因此,我將所有的刪除操作替換爲Put操作:
a、給每行數據添加了一個無效標誌位,在刪除記錄時使用Put給該標誌位寫爲1。
b、在單條查詢時,根據rowKey取出記錄後會根據這個標誌位判斷這條記錄是否已被“刪除”,以此決定是否返回這條記錄。在多條查詢時(scan),使用列值過濾器,過濾出所有這個標誌位不爲1的記錄。(可參見我之前的博文《HBase 條件查詢》)
2、在備份過程中新增的數據是否會影響備份內容的準確性?
可以指定小於等於當前時刻的結束時間戳,以便將需要備份的數據範圍明確。
3、如何備份到其他機器?
a、Export支持提供地址的備份。最簡單的方法,直接把遠端存儲掛載到本地,然後使用本地路徑。
b、使用API調用時,Path如果使用file:///home/codeevoship/backup,代表使用本地文件系統。若直接寫爲/home/codeevoship 代表使用HDFS層的路徑。在使用Shell調用時則相反。
4、如何使用API調用?
通過MapReduce的Job:http://hadoop.apache.org/docs/r0.20.2/api/org/apache/hadoop/mapreduce/Job.html
先通過Export類提供的方法創建Job實例,再調用Job的submit()或
waitForCompletion(boolean verbose);異步與同步。
四、其他解決方案
1、HDFS層的HDFS Replication或DistCp
2、Cluster Replication