一、什麼是 Hbase
Hbase 是一個構建在 Hadoop 之上的高可用、高性能、多版本的分佈式 NOSQL 數據庫。
二、Hbase 的特點
2.1、與 hdfs 對比
Hbase 是構建在 Hadoop 之上的,Hadoop 不支持隨即寫,但 Hbase 支持。
2.2 、與傳統數據庫的比較:
1、傳統數據庫無法存儲很大量的數據,但 Hbase 可以通過增加節點的方式來存儲海量數據。
2、傳統數據庫沒有很好的備份機制,但 Hbase 把的文件存儲是基於 hdfs 的,又健全的備份機制。
3、傳統數據庫當數據量達到一定規模時速度就會很慢,而 Hbase 通過 Zookeeper 協調查找數據,訪問速度快。
三、Hbase 存儲數據的結構
3.1 邏輯結構
從邏輯視圖來看,Hbase 的數據是以表的形式組織的,而且和關係型數據庫中的一樣,Hbase 的表由行和列構成。
解釋圖中的元素:
1、RowKey
rowkey 是用來檢索記錄的主鍵。訪問 hbase table 中的數據,只有三種方式:通過單個 rowkey 訪問;通過 rowkey 的範圍;全表掃描。
rowkey 可以是任意字符串,存儲時,數據按照 row key 的字典排序。因此在設計 key 時,要充分利用排序存儲這一特性,將經常一起讀取的行存儲放到一起。
2、列簇(column family)
hbase 表中的每個列,都歸屬於某個列簇,列簇時 scheme 的一部分(而列不是),列命都以列簇爲前綴。
3、單元(cell)
hbase 中通過 row 和 columns 確定的唯一一個存儲單元稱爲 cell。
cell 是沒有數據類型的,全都是以字節碼的形式存儲。
4、時間戳(timestamp)
每個 cell 都保持着同一數據的多個版本,版本通過時間戳來索引。
3.2 物理結構
把每一個列簇單獨地存儲成一列,可以極大地節省空間。
三、Hbase 架構
解釋圖中元素:
1、Client
客戶端訪問 hbase 數據之前,首先通過源數據表定位目標數據所在的 RegionServer,之後纔會發送請求到 RegionServer,同時這些元數據會被緩存到本地,方便以後的請求訪問。如果 RegionServer 因爲發生宕機或者執行了負載均衡等導致數據分片發生遷移,客戶端需要重新請求最新的元數據並緩存到本地。
2、Zookeeper
Zookeeper 是一個分佈式的協調服務。
在 hbase 中,Zookeeper 負責管理 Hbase 的核心元數據,如 Master 和 RegionServer 的狀態、元數據表所在的 RS 地址等。
3、Master
1)Master 負責處理用戶的管理請求,例如:用戶的增刪改查操作。
2)協調 RegionServer:爲 RS 分配 Region;發現失效的 RS 並重新分配位於其上的 Region;通過 ZK 監控集羣上所有 RS 的運行狀態。
3)清理過期的 HLog 和 HFile
4、RegionServer
1)響應用戶的 I/O 請求,向 HDFS 中讀寫數據。
2)內部管理了一系列 HRegion 對象,每個 HRegion 對應 table 中的一個 Region,HRegion 由多個 Htore 組成,每個 Store 對應 table 中的一個 列簇。
5、HLog
1)實現數據的高可靠性:hbase 數據寫入並不是直接寫入 HFile,而是先寫入緩存,再異步刷新羅盤。爲防止數據丟失,數據寫入緩存之前先寫入 HLog,這樣,即使緩存數據丟失,仍然可以通過 HLog 恢復。
2)用於 hbase 集羣間數據同步:通過回放主機羣推送過來的 HLog 來實現主從集羣間的數據同步。
6、BlockCache
客戶端從磁盤讀取數據之後通常會將數據緩存到系統內存中,後續訪問同一行數據可直接從內存中獲取,對於大量熱點讀的業務請求來說,帶來了極大的性能提升。
7、Region
hbase 用 rowkey 把表 “水平切割” 成多個 Region,Region 代表的是數據表的一個分片,通常一個表的 Region 會分佈在整個集羣的多個 RS 上,一個 RS 上會存放來自不同表的多個 Region。
四、Hbase 讀寫數據流程
4.1 寫數據流程
1、客戶端處理階段
1)客戶端提交 put 請求後,會將數據添加到本地緩衝區中,符合一定條件時就異步批量提交。
2)客戶端到 hbase:meta 中根據 rowkey 找到它們歸屬的 RegionServer。批量請求時會把這些 rowkey 按照不同的 RegionServer 分組。
3)客戶端發送 RPC 請求給對應的 RegionServer。
2、Region 寫入階段
1)RS 收到請求後,首先反序列化 put 對象,執行各種檢查(region是否只讀,Memstore是否超過指定大小等)
2).建立行鎖(Acquire locks)->2.更新寫入時間->3.創建WAL edit對象->4.WAL edit寫入Hlog->5.數據寫入MemStore->6.釋放行鎖->7.刷寫Hlog到HDFS->8.結束事務
3、MemStore Flusn 階段
當Region中的MemStore容量超過一定閾值,系統會異步執行flush操作,將內存中的數據寫入文件,形成HFile
4.2 讀數據流程
1、第一次讀數據
1)從 Zookeeper 中獲取 hbase:meta 的位置,緩存該位置信息
2)從 hbase:meta 中查詢用戶 table 對應請求的 rowkey 所在的 RegionServer,緩存該位置信息。
3)從查詢到的 HRegionServer 中讀取 Row。
2、第一次以後讀數據
先查詢緩存裏能不能找到 Row 對應的 RegionServer,找到就直接做上面的第三步,找不到就依據情況從第一或者第二步開始。