引言
hbase是乙個高可靠性、高效能、面向列、可伸縮的分布式儲存系統,適用於結構化的儲存,底層依賴於hadoop的hdfs,利用hbase技術可在廉價pcserver上搭建起大規模結構化儲存集群。因此hbase被廣泛使用在大資料儲存的解決方案中。
為何使用hbase
hbase的優點:
列可以動態增加,並且列為空就不儲存資料,節省儲存空間。
hbase自動切分資料,使得資料儲存自動具有水平scalability。
hbase可以提供高併發讀寫操作的支援。
hbase的缺點:
不能支援條件查詢,只支援按照row key來查詢。
hbase並不適合傳統的事物處理程式或關聯分析,不支援複雜查詢,一定程度上限制了它的使用,但是用它做資料儲存的優勢也同樣非常明顯。
因為hbase儲存的是鬆散的資料,所以如果你的應用程式中,資料表每一行的結構是有差別的,那麼可以考慮使用hbase。因為hbase的列可以動態增加,並且列為空就不儲存資料,所以如果你需要經常追加字段,且大部分欄位是null值的,那可以考慮hbase。因為hbase可以根據rowkey提供高效的查詢,所以如果你的資料(包括元資料、訊息、二進位制資料等)都有著同乙個主鍵,或者你需要通過鍵來訪問和修改資料,使用hbase是乙個很好地選擇。
如何使用hbase
場景一:賣家操作日誌
賣家操作日誌,顧名思義是用來記錄商家操作的系統,從而可以保證商家可以精確查詢自己的各種操作。京東有幾十萬的商家時時刻刻的進行著各種操作,因此賣家操作日誌的特點是:資料量大、實時性強、增多查少。
圖1
圖2我們在做賣家操作日誌初期,將所有的操作日誌存放在es中,操作日誌的資料量是非常大的,但尷尬的是我們當時所能申請到的es資源有限。當把大量的資料儲存到有限的es集群中時便導致了效能的下降。在這種情況下,我們選擇了只在es集群中儲存最近三個月的資料,對其提供靈活的查詢,而長期的資料儲存使用hbase來進行。這樣的話我們便可以實現對近期操作靈活展現,對長期資料也有精確備份。
場景二:京麥訊息日誌的儲存
京麥訊息日誌的儲存是屬於京麥筋斗雲系統(用於打造京麥訊息生態系統閉環)不可或缺的一部分。其中包含訊息的全鏈路追蹤以及訊息的統計分析。京麥訊息每天都會有幾千萬的訊息量,如何對訊息進行追蹤和統計便成為了乙個至關重要的問題。訊息追蹤要求實時性、多維度精確查詢,因此我們選擇將最近一周的訊息日誌儲存在es。統計分析要求我們有足夠多的資料,因此我們在將資料儲存在es中的同時也儲存在hbase中乙份。最終再定期將hbase中的資料匯入到京東的資料集市中,這樣我們便可以很方便的對京麥訊息進行統計分析。
hbase的資料結構
要使用hbase我們首先要了解hbase的資料結構:
hbase會儲存系列的行記錄,行記錄有三個基本型別的定義:row key、time stamp、column family。
row key
與nosql資料庫一樣,row key是用來檢索記錄的主鍵。訪問hbase table中的行,只有三種方式:
通過單個row key訪問。
通過row key的range全表掃瞄。
row key可以是任意字串(最大長度是64kb,實際應用中長度一般為 10 ~ 100bytes),在hbase內部,row key儲存為位元組陣列。
在儲存時,資料按照row key的字典序(byte order)排序儲存。設計key時,要充分排序儲存這個特性,將經常一起讀取的行儲存到一起(位置相關性)。
column family
hbase表中每個列都必須屬於某個列族,列族必須作為表模式定義的一部分預先給出(有點像關係型資料庫中的列名,定義完一般情況下就不會再去修改);
列名以列族作為字首,每個列族都可以有多個列成員。新的列族成員(也就是列)可以隨後按需,動態加入。
hbase把同一列族裡面的資料儲存在同一目錄下,由幾個檔案儲存。
time stamp
在hbase每個cell儲存單元對同乙份資料有多個版本,根據唯一的時間戳來區分每個版本之間的差異,不同版本的資料按照時間倒序排序,最新的資料版本排在最前面。
簡述hbase的架構原理
1. hbase的模組
master
hbase master用於協調多個region server,偵測各個region server之間的狀態,並平衡region server之間的負載。hbase master還有乙個職責就是負責分配region給region server。hbase允許多個master 節點共存,但是這需要zookeeper的幫助。不過當多個master節點共存時,只有乙個master是提供服務的,其他的master節點處於待命的狀態。當正在工作的master節點宕機時,其他的master則會接管 hbase 的集群。
region server
對於乙個region server而言,其包括了多個region。region server的作用只是管理**,以及實現讀寫操作。client 直接連線region server,並通訊獲取hbase中的資料。對於region而言,則是真實存放hbase資料的地方,也就說region是hbase可用性和分布式的基本單位。如果當乙個**很大,並由多個cf組成時,那麼表的資料將存放在多個region之間,並且在每個region中會關聯多個儲存的單元(store)。
zookeeper
對於hbase而言,zookeeper的作用是至關重要的。首先zookeeper是作為hbase master的ha解決方案。也就是說,是zookeeper保證了至少有乙個hbase master處於執行狀態。並且zookeeper負責region和region server的註冊。其實zookeeper發展到目前為止,已經成為了分布式大資料框架中容錯性的標準框架。不光是hbase,幾乎所有的分布式大資料相關的開源框架,都依賴於zookeeper實現ha。
2. hbase的原理
首先我們需要知道hbase的集群是通過zookeeper來進行機器之前的協調,也就是說hbase master與region server之間的關係是依賴zookeeper來維護。當乙個client需要訪問hbase集群時,client需要先和zookeeper來通訊,然後才會找到對應的region server。每乙個 region server管理著很多個region。對於hbase來說,region是hbase並行化的基本單元。因此,資料也都儲存在region中。
這裡我們需要特別注意,每乙個region都只儲存乙個column family的資料,並且是該cf中的一段(按row 的區間分成多個region)。region所能儲存的資料大小是有上限的,當達到該上限時(threshold),region會進行**,資料也會**到多個region中,這樣便可以提高資料的並行化,以及提高資料的容量。
每個region包含著多個store物件。每個store包含乙個memstore,和乙個或多個hfile。memstore便是資料在記憶體中的實體,並且一般都是有序的。當資料向region寫入的時候,會先寫入memstore。當memstore中的資料需要向底層檔案系統傾倒(dump)時(例如memstore中的資料體積到達memstore配置的最大值),store便會建立storefile,而storefile就是對hfile一層封裝。所以memstore中的資料會最終寫入到hfile中,也就是磁碟io。由於hbase底層依靠hdfs,因此hfile都儲存在hdfs之中。這便是整個hbase工作的原理簡述。
使用hbase時應注意的問題
基於hbase的系統設計與開發中,需要考慮的因素不同於關係型資料庫,hbase模式本身很簡單,但賦予你更多調整的空間,有一些模式寫效能很好,但讀取資料時表現不好,或者正好相反,類似傳統資料庫基於正規化的or建模,在實際專案中考慮hbase設計模式是,我們需要從以下幾方面內容著手:
這個表應該有多少個列簇
列簇使用什麼資料
每個列簇應有多少個列
列名應該是什麼,儘管列名不必在建表時定義,但是讀寫資料時是需要的
單元應該存放什麼資料
每個單元儲存什麼時間版本
行健結構是什麼,應該包括什麼資訊
總結
現如今各種資料儲存方案層出不窮,本文僅僅是結合兩個實戰場景就基於hbase的大資料儲存做了簡單的分析,並對hbase的原理做了簡單的闡述。如何使用好hbase,甚至於如何選擇乙個最優的資料儲存方案,還需要我們根據場景需要具體分析和設計。
推薦閱讀文章
大資料時代需要了解的六件事
大資料框架hadoop十大誤解
年薪30k的大資料開發工程師的工作經驗總結?
大資料框架hadoop我們遇見過的問題
大資料儲存HBase
這兩天要寫乙個方案,某單位想建乙個中心資料庫,匯聚各業務系統資料,以及各種網上抓取的預報資料。我設想是用hbase。主要考慮點是 1 開源 2 支援海量資料 該單位的資料量增長按規劃還是很大的,大約每天20gb 關係型資料庫就不考慮了。rdbms本質上是單機系統,拿mysql來說吧,主從複製,讀寫分...
基於HBase的大資料儲存的應用場景分析
引言 hbase是乙個高可靠性 高效能 面向列 可伸縮的分布式儲存系統,適用於結構化的儲存,底層依賴於hadoop的hdfs,利用hbase技術可在廉價pcserver上搭建起大規模結構化儲存集群。因此hbase被廣泛使用在大資料儲存的解決方案中。為何使用hbase hbase的優點 列可以動態增加...
hbase基於快照的資料遷移
hbase基於快照的資料遷移 1.對於開啟安全認證 kerberos 的集群,首先需要關掉安全認證。2.在源集群所有節點 etc hosts檔案中配置目標集群所有節點的host。1.登入ambari檢查hbase site.xml 中的hbase.snapshot.enabled 是否設定為true...