hbase詳解-----終於瞭解了
Hbas是一個在HDFS上實現的面向列的分散式資料庫,非常適合實時地隨機讀/寫超大規模資料集
行,列族,列,主鍵
Hbase中的行類似於資料庫中的行,表中的行根據行的鍵值(也就是表的主鍵)進行排序,排序根據位元組序進行,所有對錶的訪問都要通過表的主鍵
行中的列分成”列族”,所有的列族成員有相同的字首.如company:name,company:address都是列族company的成員,Hbase中為了方便,使用冒號(:)來分隔列族和列族修飾符.一個表的列族必須作為表模式定義的一部分預先給出,但是新的列族成員可以隨後按需加入.例如,目標表中有了列族company,那麼客戶端可以在更新時提供新的列company:logo,服務端會儲存它的值.物理上,所有的列族成員都一起儲存在檔案系統中,所以說,Hbase是一個面向列族的儲存器.由於調優和儲存都是在列族這個層次上進行的,所以最好使所有的列族成員都有相同的”訪問模式”和大小特徵.
簡而言之,Hbase表和資料庫表類似,行是排序的,只要列族預先定義存在, 客戶端隨時可以把列新增到列族中去.
區域
Hbase把表水平劃成區域,每個區域由表中行的子集構成.一開始,一個表只有一個區域,但是隨著表的區域開始變大,,等到開始超過設定的大小闕值,便會在某行的邊界上分成兩個大小基本相同的新分割槽.在第一次劃分之後,所有載入的資料都放在原始分割槽所在的那臺伺服器上,隨著表的變大,區域的個數開始增加,有些區域也會被放到叢集上的其他節點上.區域是Hbase叢集上分佈資料的最小單位,每個節點都負責管理表中區域的一個子集,線上的所有區域按次序排列就構成了表的所有內容.
鎖
無論對行進行訪問的事務涉及多少列,對行的更新都是”原子”的,這使得Hbase鎖模型能夠儘量簡單
Hbase實現
Hbase由一個Master節點負責協調管理一個或多個RegionServer從屬機.Master負責啟動,把區域分配給註冊的RegionServer,恢復RegionServer的故障. Master負載很輕. RegionServer負責零個或多個區域的管理以及響應客戶端的讀寫請求, RegionServer還負責區域的劃分,並通知Master有了新的子區域Hbase依賴於Zookeeper.如果區域的分配過程中有伺服器崩潰,就通過Zookeeper來協調,分配,在Zookeeper分配事務狀態有助於在恢復時可以從崩潰遺留的狀態開始繼續分配.在啟動一個客戶端到叢集上的連線時,客戶端必須至少拿到叢集所傳遞的Zookeeper整體的位置.這樣,客戶端才能訪問Zookeeper的層次,瞭解叢集的屬性,如伺服器的位置.
執行中Hbase
Hbase中保留著-ROOT-和.META.的特殊目錄,它們維護著當前叢集上所有區域的列表,狀態,位置.ROOT表維護著Meta表的資訊,Meta表維護著使用者表的資訊, Meta表中的項使用區域名作為主鍵,區域名由所屬的表名,區域的起始行,建立的時間戳進行雜湊後的結果組成.區域變化時,即分裂,禁用/啟用.刪除,為負載均衡重新部署機器或由於Regionserver崩潰而重新部署區域時,目錄表都會相應進行更新,這樣,叢集上所以區域的資訊都能保持是最新的.
客戶端的每一個行操作都要訪問三次遠端節點:
1. 從Zookeeper獲取Master的位置
2. 從Master獲取.Meta.表的資訊
3. 根據.Meta.表的資訊,獲取region位置資訊
為了減少訪問遠端節點,Hbase客戶端會快取它們遍歷ROOT表時獲取的資訊和Meta表位置以及使用者空間的區域的開始行和結束行,這樣不用訪問Meta表也能得知區域存放的位置.當客戶端碰到錯誤時會再去檢視Meta獲取區域的新位置,如果.Meta也移動了,就去查詢ROOT表