HBase數據備份及恢復(導入導出)的常用方法

一、說明

隨著HBase在重要的商業系統中應用的大量增加,許多企業需要通過對它們的HBase集群建立健壯的備份和故障恢復機制來保證它們的企業(數據)資產。備份Hbase時的難點是其待備份的數據集可能非常巨大,因此備份方案必須有很高的效率。Hbase備份方案必須既能夠伸縮至對數百TB的存儲容量進行備份,又能夠在一個合理的時間內完成數據恢復的工作。HBase和Apache Hadoop系統提供了許多內置的機制,可以快速而輕松的完成PB級數據的備份和恢復工作。

二、方法

HBase是一個基于LSM樹(log-structured merge-tree)的分布式數據存儲系統,它使用復雜的內部機制確保數據準確性、一致性、多版本等。因此,你如何獲取數十個region server在HDFS和內存中的存儲的眾多HFile文件、WALs(Write-Ahead-Logs)的一致的數據備份?
讓我們從最小的破壞性,最小的數據占用空間,最小的性能要求機制和工作方式到最具破壞性的逐一講述:

  • Snapshots
  • Replication
  • Export
  • CopyTable
  • HTable API
  • Offline backup of HDFS data

下面的表格提供了一個關于這些方法的快速比較,具體的細節在下面再詳細描述。

1094291-20171103171645513-670730977.png

Snapshots(快照)

HBase快照功能豐富,有很多特征,并且創建時不需要關閉集群。關于snapshot在文章《apache hbase snapshot介紹》中有更詳細的介紹。
快照能通過在HDFS中創建一個和unix硬鏈接相同的存儲文件,簡單捕捉你的hbase表的某一時刻的信息(如下圖)。這些快照在幾秒內就可以完成,幾乎對整個集群沒有任何性能影響。并且,它只占用一個微不足道的空間。除了在metadata文件中存儲的極少目錄數據,你的數據不會冗余,快照允許你的系統回滾到(創建快照)那個時刻,當然,你需要恢復快照。

1094291-20171103171658888-815163977.png

通過在HBase shell中運行如下命令來創建一個表的快照:

hbase(main):013:0> snapshot 'yy', 'MySnapShot' 

在執行這條命令之后,你將發現在hdfs中有一些小的數據文件。在/hbase/.hbase-snapshots里 ,這些文件中存儲著快照信息。想要恢復數據只需要執行在shell中執行如下命令:

hbase(main):022:0> disable 'yy'
hbase(main):023:0> restore_snapshot 'MySnapShot' 
hbase(main):024:0> enable 'yy'

正如你看到的,恢復快照需要對表進行離線操作。一旦恢復快照,那任何在快照時刻之后做的增加/更新數據都會丟失。如果你的業務需求是這樣的:你必須有數據的異地備份,你可以用exportSnapshot命令賦值一個表的數據到你的本地HDFS或者你選擇的遠程HDFS中。

HBase復制(HBase Relication)

HBase復制是另外一個負載較輕的備份工具。文章《HBase復制概述》有對它的詳細描述。總的來說,復制被定義為列簇級別,可以工作在后臺并且保證所有的編輯操作在集群復制鏈之間的同步。

復制有三種模式:主->從(master->slave),主<->主(master<->master)和循環(cyclic)。這種方法給你靈活的從任意數據中心獲取數據并且確保它能獲得在其他數據中心的所有副本。在一個數據中心發生災難性故障的情況下,客戶端應用程序可以利用DNS工具,重定向到另外一個備用位置。

復制是一個強大的,容錯的過程。它提供了“最終一致性”,意味著在任何時刻,最近對一個表的編輯可能無法應用到該表的所有副本,但是最終能夠確保一致。

注:對于一個存在的表,你需要通過本文描述的其他方法,手工的拷貝源表到目的表。復制僅僅在你啟動它之后才對新的寫/編輯操作有效。

1094291-20171103171729201-373954854.png

導出導入(Export/Import)

HBase的導出工具是一個內置的實用功能,它使數據很容易從hbase表導入HDFS目錄下的SequenceFiles文件。它創造了一個map reduce任務,通過一系列HBase API來調用集群,獲取指定表格的每一行數據,并且將數據寫入指定的HDFS目錄中。這個工具對集群來講是性能密集的,因為它使用了mapreduce和HBase 客戶端API。但是它的功能豐富,支持制定版本或日期范圍,支持數據的篩選,從而使增量備份可用。
下面是一個導出命令的簡單例子:

hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir> 

一旦你的表導出了,你就可以復制生成的數據文件到你想存儲的任何地方(比如異地/離線集群存儲)。你可以執行一個遠程的HDFS集群/目錄作為命令的輸出目錄參數,這樣數據將會直接被導出到遠程集群。使用這個方法需要網絡,所以你應該確保到遠程集群的網絡連接是否可靠以及快速。
導入命令:

hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir> 

拷貝表(CopyTable)

拷貝表功能在文章《使用CopyTable在線備份HBase》中有詳細描述,但是這里做了基本的總結。和導出功能類似,拷貝表也使用HBase API創建了一個mapreduce任務,以便從源表讀取數據。不同的地方是拷貝表的輸出是hbase中的另一張表,這張表可以在本地集群,也可以在遠程集群。
一個簡單的例子如下:

hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=testCopy test 

這個命令將會拷貝名為test的表到集群中的另外一個表testCopy。

請注意,這里有一個明顯的性能開銷,它使用獨立的“puts”操作來逐行的寫入數據到目的表。如果你的表非常大,拷貝表將會導致目標region server上的memstore被填滿,會引起flush操作并最終導致合并操作的產生,會有垃圾收集操作等等。

此外,你必須考慮到在HBase上運行mapreduce任務所帶來的性能影響。對于大型的數據集,這種方法的效果可能不太理想。

HBase API

由于總是這樣使用hadoop,你可以使用公用的api寫自己定制的客戶端應用程序來直接查詢表格。你也可以通過mapreduce任務的批量處理優勢,或者自己設計的其他手段。然而,這個方法需要對hadoop開發以及因此對生產集群帶來的影響有深入的理解。

離線備份原生的HDFS數據(Offline Backup of Raw HDFS Data)

最強力的備份機制,也是破壞性最大的一個。涉及到最大的數據占用空間。你可以干凈的關閉你的HBase集群并且手工的在HDFS上拷貝數據(distcp)。因為HBase已經關閉,所以能確保所有的數據已經被持久化到HDFS上的HFile文件中,你也將能獲得一個最準確的數據副本。但是,增量的數據幾乎不能再獲得,你將無法確定哪些數據發生了變化。

同時也需要注意,恢復你的數據將需要一個離線的元數據因為.META.表將包含在修復時可能無效的信息。這種方法需要一個快速的,可信賴的網絡來傳輸異地的數據,如果需要在稍后恢復它的話。

由于這些原因,Cloudera非常不鼓勵在HBase中這種備份方法。

故障恢復(Disaster Recory)

HBase被設計為一個非常能容忍錯誤的分布式系統,假設硬件失敗很頻繁。在HBase中的故障恢復通常有以下幾種形式:

  • 在數據中心級別的災難性故障,需要切換到備份位置;
  • 需要恢復由于用戶錯誤或者意外刪除的數據的之前一個拷貝;
  • 出于審計目的,恢復實時點數據拷貝的能力

正如其他的故障恢復計劃,業務需要驅動這你如何架構并且投入多少金錢。一旦你確定了你將要選擇的備份方案,恢復將有以下幾種類型:

  • 故障轉移到備份集群
  • 導入表/恢復快照
  • 指向HBase在備份位置的根目錄

如果你的備份策略是這樣的,你復制你的HBase數據在不同數據中心的備份集群,故障轉移將變得簡單,僅需要使用DNS技術,轉移你的應用程序。

請記住,如果你打算允許數據在停運時寫入你的備份集群,那你需要確保在停運結束后,數據可以回到主機群。主<->主或循環的復制架構能自動處理這個過程,但對于一個主從結構來講,你就需要手動進行干預了。

你也可以在故障時通過簡單的修改hbase-site.xml的 hbase.root.dir屬性來更改hbase根目錄,但是這是最不理想的還原選項,因為你復制完數據返回生產集群時,正如之前提到的,可能會發現.META是不同步的。

總結

綜上所述,從某種損失或中斷中恢復數據需要一個精心設計的BDR計劃。強烈建議你徹底明白你的業務需求,然后明白數據精確度/可用性以及故障恢復的最大時間。有了這些知識,你才能更好的選擇滿足這些需求的工具。

選擇工具僅僅是個開始,你應該對你的BDR策略進行大規模測試,以確保它的在你的基礎設施下的功能。并且,你應該是非常熟悉所有的故障恢復步驟。

參考

http://blog.cloudera.com/blog/2013/11/approaches-to-backup-and-disaster-recovery-in-hbase/
http://blog.csdn.net/iam333/article/details/38232215

轉載于:https://www.cnblogs.com/bugsbunny/p/7779185.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393439.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react和react2_為什么React16是React開發人員的福氣

react和react2by Harsh Makadia通過苛刻馬卡迪亞 為什么React16是React開發人員的福氣 (Why React16 is a blessing to React developers) Just like how people are excited about updating their mobile apps and OS, developers should also be excited to update their fr…

jzoj4598. 【NOIP2016模擬7.9】準備食物

一個th的題&#xff08;a gensokyo&#xff09; 難度系數在該知識點下為$2.1$ 區間xor我們很明顯會想到trie樹&#xff0c;將每一個區間$l~r$異或和拆成$sum[l-1]$ $sum[r]$兩個數的異或 注意到二進制的性質&#xff0c;比當前低的位即使都取1加起來都沒有這位選1答案高&#x…

java number轉string_Java Number類, Character類,String類

字符串在Java編程中廣泛使用&#xff0c;字符串就是一系列字符(由一個個的字符組成)。 在Java編程語言中&#xff0c;字符串被視為對象。Java平臺提供String類來創建和操作字符串。1. 創建字符串創建字符串的最直接方法是 -String str "Hello world!";每當它在代碼中…

Android商城開發系列(二)——App啟動歡迎頁面制作

商城APP一般都會在應用啟動時有一個歡迎界面&#xff0c;下面我們來實現一個最簡單的歡迎頁開發&#xff1a;就是打開商城App&#xff0c;先出現歡迎界面&#xff0c;停留幾秒鐘&#xff0c;自動進入應用程序的主界面。 首先先定義WelcomeActivity布局&#xff0c;布局非常簡單…

DELL安裝不了mysql_Windows 版本 Mysql 8.x 安裝

1、官網下載安裝包百度網盤鏈接&#xff1a;https://pan.baidu.com/s/1cFRbQM5720xrzMxbgjPeyA提取碼&#xff1a;xlz72、解壓安裝包并新建一個文件夾作為安裝目錄(mysqlInstall)3、配置 Mysql 環境變量4、在解壓好的目錄下新建一個 my.ini 文件(注意&#xff1a;my.ini 文件和…

lambda 使用_如何使用Lambda和API網關構建API

lambda 使用Do you want to access your database, control your system, or execute some code from another website? An API can do all of this for you, and they’re surprisingly easy to set up.您是否要訪問數據庫&#xff0c;控制系統或從其他網站執行一些代碼&…

Hyper-V Server聯機調整虛擬硬盤大小

1. 技術概述&#xff1a; 從 Windows Server 2012 R2開始&#xff0c;管理員可以在運行虛擬機的同時&#xff0c;使用 Hyper-V 來擴展或壓縮虛擬硬盤的大小。存儲管理員可以通過對運行中的虛擬硬盤執行維護操作來避免代價不菲的停機。不再需要關閉虛擬機&#xff0c;這可以避免…

leetcode162. 尋找峰值(二分法)

峰值元素是指其值大于左右相鄰值的元素。 給定一個輸入數組 nums&#xff0c;其中 nums[i] ≠ nums[i1]&#xff0c;找到峰值元素并返回其索引。 數組可能包含多個峰值&#xff0c;在這種情況下&#xff0c;返回任何一個峰值所在位置即可。 你可以假設 nums[-1] nums[n] -…

python網絡爬蟲(5)BeautifulSoup的使用示范

創建并顯示原始內容 其中的lxml第三方解釋器加快解析速度 import bs4 from bs4 import BeautifulSoup html_str """ <html><head><title>The Dormouses story</title></head> <body> <p class"title"><…

Mingw編譯DLib

Mingw編譯DLib 因為機器上安裝了qt-opensource-windows-x86-mingw530-5.8.0&#xff0c;所以準備使用其自帶的mingw530來編譯DLib使用。 因為DLib使用CMake的構建腳本&#xff0c;所以還請先安裝好CMake。 cmake的下載地址如下https://cmake.org/files/v3.7/cmake-3.7.2-win64-…

探索JavaScript的關閉功能

Discover Functional JavaScript was named one of the best new Functional Programming books by BookAuthority!“發現功能JavaScript”被BookAuthority評為最佳新功能編程書籍之一 &#xff01; A closure is an inner function that has access to the outer scope, even…

QueryList 配置curl參數 的文檔位置 QueryList抓取https 終于找到了

需要設置ssl證書&#xff0c;或者不驗證證書&#xff0c;例&#xff1a;$ql QueryList::get(https://...,[],[verify > false]);設置這個 verify > false , 所以curl的其他參數就在這里配置即可 文檔在 https://guzzle-cn.readthedocs.io/zh_CN/latest/request-optio…

leetcode981. 基于時間的鍵值存儲(treemap)

創建一個基于時間的鍵值存儲類 TimeMap&#xff0c;它支持下面兩個操作&#xff1a; set(string key, string value, int timestamp) 存儲鍵 key、值 value&#xff0c;以及給定的時間戳 timestamp。 2. get(string key, int timestamp) 返回先前調用 set(key, value, times…

物聯網筆記

轉載于:https://www.cnblogs.com/16-C-kai/p/6596682.html

關于大學生玩網絡游戲的調查問卷

1.創建問卷&#xff0c;輸入調查名稱 2編輯問卷 3檢查問卷&#xff0c;是否有誤 4.提交并發布問卷 5分享問卷 6.問卷分析 轉載于:https://www.cnblogs.com/dzw1996/p/7786754.html

java自動排序_java ArrayList自動排序算法的實現

前幾天寫的那個是錯誤的&#xff0c;在這里將正確的更新。。。通過實現ComParator接口&#xff0c;并且對Compare函數進行重寫&#xff0c;自定義排序規則實現對ArrayList中對象的排序。。Student類定義&#xff1a;通過右鍵-》source-》自動生成Set和get方法package first;imp…

1到100的二進制編碼_每天經過100天的編碼后,我學到了什么

1到100的二進制編碼Eleftheria Batsou is a web developer from Thessaloniki, Greece. She gave a talk at the Codegarden conference about her experience doing a solid 100 days of coding every day as part of the #100DaysOfCode Challenge.Eleftheria Batsou是來自希…

第六次 實驗

轉載于:https://www.cnblogs.com/P201821440005/p/10967987.html

leetcode658. 找到 K 個最接近的元素(二分法)

給定一個排序好的數組&#xff0c;兩個整數 k 和 x&#xff0c;從數組中找到最靠近 x&#xff08;兩數之差最小&#xff09;的 k 個數。返回的結果必須要是按升序排好的。如果有兩個數與 x 的差值一樣&#xff0c;優先選擇數值較小的那個數。 示例 1: 輸入: [1,2,3,4,5], k4,…

du命令、df命令用法

一、du命令 [plain] view plaincopy print?[rootwc1 mysql]# du --help Usage: du [OPTION]... [FILE]... or: du [OPTION]... --files0-fromF Summarize disk usage of each FILE, recursively for directories. Mandatory arguments to long options are mandatory…