淺析Hbase
- 2019 年 12 月 11 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/jxq0816/article/details/103345874
無論是 NoSQL,還是大數據領域,HBase 都是非常"炙熱"的一門資料庫。本文將對 HBase 做一些基礎性的介紹,旨在入門。
一、簡介
HBase 是一個開源的、面向列的非關係型分散式資料庫,目前是Hadoop體系中非常關鍵的一部分。在最初,HBase是基於Google的 BigTable 原型實現的,許多技術來自於Fay Chang在2006年所撰寫的Google論文"BigTable"。與 BigTable基於Google文件系統(File System)一樣,HBase則是基於HDFS(Hadoop的分散式文件系統)之上而開發的。
HBase 採用 Java 語言實現,在其內部實現了BigTable論文提到的一些壓縮演算法、記憶體操作和布隆過濾器等,這些能力使得HBase 在海量數據存儲、高性能讀寫場景中得到了大量應用,如 Facebook 在 2010年11 月開始便一直選用 HBase來作為消息平台的存儲層技術。HBase 以 Apache License Version 2.0開源,這是一種對商業應用友好的協議,同時該項目當前也是Apache軟體基金會的頂級項目之一。
有什麼特性
- 基於列式存儲模型,對於數據實現了高度壓縮,節省存儲成本
- 採用 LSM 機制而不是B(+)樹,這使得HBase非常適合海量數據實時寫入的場景
- 高可靠,一個數據會包含多個副本(默認是3副本),這得益於HDFS的複製能力,由RegionServer提供自動故障轉移的功能
- 高擴展,支援分片擴展能力(基於Region),可實現自動、數據均衡
- 強一致性讀寫,數據的讀寫都針對主Region上進行,屬於CP型的系統
- 易操作,HBase提供了Java API、RestAPI/Thrift API等介面
- 查詢優化,採用Block Cache 和 布隆過濾器來支援海量數據的快速查找
與RDBMS的區別
對於傳統 RDBMS 來說,支援 ACID 事務是資料庫的基本能力,而 HBase 則使用行級鎖來保證寫操作的原子性,但是不支援多行寫操作的事務性,這主要是從靈活性和擴展性上做出的權衡。
ACID 要素包含 原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)以及持久性(Durability)
總體來說, HBase 與傳統關係資料庫的區別,如下表所示:
特性 |
HBase |
RDBMS |
---|---|---|
硬體架構 |
類似於 Hadoop 的分散式集群,硬體成本低廉 |
傳統的多核系統,硬體成本昂貴 |
容錯性 |
由軟體架構實現,由於由多個節點組成 ,所以不擔心一點或幾點宕機 |
一般需要額外硬體設備實現 HA 機制 |
資料庫大小 |
PB |
GB、TB |
數據排布方式 |
稀疏的、分布的多維的 Map |
以行和列組織 |
數據類型 |
Bytes |
豐富的數據類型 |
事物支援 |
ACID 只支援單個 Row 級別 |
全面的 ACID 支援,對 Row 和表 |
查詢語言 |
只支援 Java API (除非與其他框架一起使用,如 Phoenix、Hive) |
SQL |
索引 |
只支援 Row-key,除非與其他技術一起應用,如 Phoenix、Hive |
支援 |
吞吐量 |
百萬查詢/每秒 |
數千查詢/每秒 |
二、數據模型
下面,我們以關係型資料庫的一個數據表來演示 HBase 的不同之處。
先來看下面這張表:
ID |
設備名 |
狀態 |
時間戳 |
---|---|---|---|
1 |
空調 |
打開 |
20190712 10:05:01 |
2 |
電視機 |
關閉 |
20190712 10:05:08 |
這裡記錄的是一些家庭設備上報的狀態數據(DeviceState),其中包括設備名、狀態、時間戳這些欄位。
在 HBase 中,數據是按照列族(Column Family,簡稱CF)來存儲的,也就是說對於不同的列會被分開存儲到不同的文件。那麼對於上面的狀態數據表來說,在HBase中會被存儲為兩份:
列族1. 設備名
Row-Key |
CF:Column-Key |
Timestamp |
Cell Value |
---|---|---|---|
1 |
DeviceState:設備名 |
20190712 10:05:01 |
空調 |
2 |
DeviceState:設備名 |
20190712 10:05:08 |
電視機 |
列族2. 狀態
Row-Key |
CF:Column-Key |
Timestamp |
Cell Value |
---|---|---|---|
1 |
DeviceState:狀態 |
20190712 10:05:01 |
打開 |
2 |
DeviceState:狀態 |
20190712 10:05:08 |
關閉 |
這裡Row-key是唯一定位數據行的ID欄位,而Row-key 加上 CF、Column-Key,再加上一個時間戳才可以定位到一個單元格數據。其中時間戳用來表示數據行的版本, 在HBase中默認會有 3 個時間戳的版本數據,這意味著對同一條數據(同一個Rowkey關聯的數據)進行寫入時,最多可以保存3個版本。
在查詢某一行的數據時,HBase需要同時從兩個列族(文件)中進行查找,最終將結果合併後返回給客戶端。 由此可見如果列族太多,則會影響讀取的性能,在設計時就需要做一些權衡。
由此可見,HBase的使用方式與關係型資料庫是大不相同的,在使用 HBase 時需要拋棄許多關係型資料庫的思維及做法,比如強類型、二級索引、表連接、觸發器等等。
然而 HBase 的靈活性及高度可伸縮性卻是傳統 RDBMS 無法比擬的。