淺析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 無法比擬的。