HBase簡介
HBase是一種分佈式數據庫,可以用來存儲結構化和半結構化的鬆散數據。通過水平擴展,可以讓數千臺服務器去存儲海量數據。
用HBase的原因:HDFS+MapReduce是面向離線的數據處理,無法滿足實時要求;傳統關係型數據庫擴展有瓶頸,現在數據結構經常變化,關係型數據庫往往模式確定後就很難變更了。
HBase的訪問接口:
HBase數據模型
列族可以動態擴展。更新操作會保留歷史版本。存儲以列族爲基本單元,是面向列的存儲,不同列族存儲在不同的文件裏。
上圖可見,不同列族分開存儲。
面向列的存儲方便分析,面向行的存儲方便事務操作。
HBase實現原理
功能組件:
客戶端不依賴master去取數據,而是直接去region服務器取。
1個region一般1到2個G,同一個region不會拆分到不同的region服務器上。
root表只有一個region。
爲了加速尋址,客戶端會緩存位置信息。
HBase運行機制
整體架構
Master:
- 負責不同region服務器的負載均衡
- 對錶增刪改查
- 負責調整分裂、合併後region的分佈
- 負責重新分配故障失效的region服務器
Region:
- 一個region服務器包含多個region。多個region共用一個HLog日誌
- 一個region中每個列族會單獨構成一個store
- MemStore是用來寫緩存的
- HBase裏的StoreFile對應HDFS裏的HFile
寫入數據:先寫日誌,再寫到緩存中去。
讀數據:先去緩存裏找,再去StoreFile裏找。
緩存的刷新:
- 系統週期性地把MemStore緩存裏的內容刷寫到磁盤的StoreFile文件中,清空緩存,並在HLog裏面寫入一個標記
- 每次刷寫都生成一個新的StoreFile文件,因此每個Store包含多個StoreFile文件
- 每個region服務器都有一個自己的HLog文件,每次啓動都檢查該文件,確認最近一次執行緩存刷新操作之後是否發生新的寫入操作,如果發現更新,則先寫入MemStore,再刷寫寫到StoreFile,最後刪除舊的HLog文件,開始爲用戶提供服務。
StoreFile的合併與分裂:
StoreFile數目達到閾值合併,StoreFile大小超過閾值分裂。
HBase應用解決方案
- 把時間靠近的數據存在一起:把時間戳(64位長整型)加入行鍵。Long.MAX_VALUE-timestamp作爲行鍵,最新的排在最前面。
- 提升讀寫性能:設置HColumnDescriptor.setlnMemory選項位true,把相關表放在緩存中。
- 節省存儲空間:設置HColumnDescriptor.setMaxVersionMaxVersions爲1,只保留最新版本。
- 節省空間:設置TimeToLive參數,超過生命週期就刪除。setTimeToLive()
- 可視化性能監視:Master-status,Ganglia,OpenTSDB,Ambari
- 通過SQL來管理HBase:Hive和Phoenix
- 二級索引:Hindex,Redis,Solr