HBase 是一個分佈式的、面向列的開源數據庫,該技術來源於 Fay Chang 所撰寫的 Google 論文 「Bigtable:一個結構化數據的分佈式存儲系統」 。就像 Bigtable 利用了 Google 文件系統(File System)所提供的分佈式數據存儲同樣,HBase 在 Hadoop 之上提供了相似於 Bigtable 的能力。HBase 是 Apache 的 Hadoop 項目的子項目。HBase 不一樣於通常的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。另外一個不一樣的是 HBase 基於列的而不是基於行的模式。數據庫
HBase 以表的形式存儲數據。表由行和列組成。列劃分爲若干個列簇(column family),以下圖所示。數組
RowKey 可使用任意字符串(最大長度爲 64KB,實際應用中長度通常爲 10 ~ 100bytes),在 HBase 內部,Row Key 保存爲字節數組。負載均衡
在 HBase 使用過程當中,設計 RowKey 是一個很重要的環節。咱們在進行 RowKey 設計的時候可參照以下步驟:分佈式
與 NoSQL 同樣,RowKey 是用來檢索記錄的主鍵。訪問 HBase table 中的行,只有三種方式:oop
物理存儲上 HBase 將 Table 在行的方向上分割爲多個 HRegion, 每一個 HRegion 分散在不一樣的 HRegionServer 中。設計
每一個 HRegion 由多個 Store 構成, 每一個 Store 由一個 memStore 和0或多個 StoreFile 組成, 每一個 Store 保存一個 Columns Family。3d
HBase 中的組件包括 Client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog 等。code
HBase 中的每張表都經過行鍵(RowKey)按照必定的範圍被分割成多個子表(HRegion),一個 HRegion 超過必定閾值就要被分割成兩個,這個過程由 HRegionServer
管理, 而 HRegion 的分配由 HMaster
管理。server
HMaster 僅僅維護 table 和 HRegion 的元數據信息,而 table 的元數據信息保存在 zookeeper 上,所以,HMaster 的負載很低。對象
table 在行的方向上分割爲多個 HRegion ,HRegion 是 HBase 中分佈式存儲和負載均衡的最小單元,即不一樣的 HRegion 能夠分佈在不一樣的 HRegion Server 上,但同一個 HRegion 是不會拆分到多個 HRegion Server 上。
HRegion 按大小分割,每一個表通常只有一個 HRegion ,隨着數據不斷的插入表,HRegion 不斷增大,當 HRegion 的某個列簇達到必定的閾值時就會分紅兩個新的 HRegion 。
HBase 依賴 Zookeeper,默認狀況下 HBase 管理 Zookeeper 實例(啓動或關閉 Zookeeper),HMaster 與 HRegionServers 啓動時會向 Zookeeper 註冊,使 HMaster 能夠隨時感知到各個 HRegionServer 的健康狀態。
首先當一個請求發生時,HBase Client 使用 RPC 機制與 HMaster 和 HRegion Server 進行通訊。對於管理類操做,Client 與 HMaster 進行 RPC 通訊;對於數據讀寫操做,Client 與 HRegion Server 進行 RPC 通訊。
HBase Client 使用 RPC 機制與 HMaster 和 HRegion Server 進行通訊,但如何尋址呢?因爲 Zookeeper 中存儲了 Meta 表的地址和 HMaster 的地址,因此 HBase Client 須要先到 Zookeeper 上進行尋址。
HBase Client 訪問 Zookeeper,能夠根據 Meta 表獲取到 HRegion Server 地址。