1. 程式人生 > >Hbase和Hive的區別,Hbase與傳統資料庫的區別

Hbase和Hive的區別,Hbase與傳統資料庫的區別

HBase 於 Hive 的區別,我們簡單的梳理一下 Hive 和 HBase 的應用場景:

Hive 適合用來對一段時間內的資料進行分析查詢,例如,用來計算趨勢或者網站的日誌。Hive 不應該用來進行實時的查詢(Hive 的設計目的,也不是支援實時的查詢)。因為它需要很長時間才可以返回結果;HBase 則非常適合用來進行大資料的實時查詢,例如 Facebook 用 HBase 進行訊息和實時的分析。對於 Hive 和 HBase 的部署來說,也有一些區別,Hive 一般只要有 Hadoop 便可以工作。而 HBase 則還需要 Zookeeper 的幫助(Zookeeper,是一個用來進行分散式協調的服務,這些服務包括配置服務,維護元資訊和名稱空間服務)。再而,HBase 本身只提供了 Java 的 API 介面,並不直接支援 SQL 的語句查詢,

而 Hive 則可以直接使用 HQL(一種類 SQL 語言)。如果想要在 HBase 上使用 SQL,則需要聯合使用 Apache Phonenix,或者聯合使用 Hive 和 HBase。但是和上面提到的一樣,如果整合使用 Hive 查詢 HBase 的資料,則無法繞過 MapReduce,那麼實時性還是有一定的損失。Phoenix 加 HBase 的組合則不經過 MapReduce 的框架,因此當使用 Phoneix 加 HBase 的組成,實時性上會優於 Hive 加 HBase 的組合,我們後續也會示例性介紹如何使用兩者。最後我們再提下 Hive 和 HBase 所使用的儲存層,默認情況下 Hive 和 HBase 的儲存層都是 HDFS。但是 HBase 在一些特殊的情況下也可以直接使用本機的檔案系統。
例如 Ambari 中的 AMS 服務直接在本地檔案系統上執行 HBase。

 

HBase 與傳統關係資料庫的區別

首先讓我們瞭解下什麼是 ACID。ACID 是指資料庫事務正確執行的四個基本要素的縮寫,其包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)以及永續性(Durability)。對於一個支援事務(Transaction)的資料庫系統,必需要具有這四種特性,否則在事務過程(Transaction Processing)當中無法保證資料的正確性,交易過程極可能達不到交易方的要求。下面,我們就簡單的介紹下這 4 個特性的含義。

  • 原子性(Atomicity)是指一個事務要麼全部執行,要麼全部不執行。換句話說,一個事務不可能只執行了一半就停止了。比如一個事情分為兩步完成才可以完成,那麼這兩步必須同時完成,要麼一步也不執行,絕不會停留在某一箇中間狀態。如果事物執行過程中,發生錯誤,系統會將事物的狀態回滾到最開始的狀態。
  • 一致性(Consistency)是指事務的執行並不改變資料庫中資料的一致性。也就是說,無論併發事務有多少個,但是必須保證資料從一個一致性的狀態轉換到另一個一致性的狀態。例如有 a、b 兩個賬戶,分別都是 10。當 a 增加 5 時,b 也會隨著改變,總值 20 是不會改變的。
  • 隔離性(Isolation)是指兩個以上的事務不會出現交錯執行的狀態。因為這樣可能會導致資料不一致。如果有多個事務,執行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請求,使得在同一時間僅有一個請求用於同一資料。
  • 永續性(Durability)指事務執行成功以後,該事務對資料庫所作的更改便是持久的儲存在資料庫之中,不會無緣無故的回滾。

在具體的介紹 HBase 之前,我們先簡單對比下 HBase 與傳統關係資料庫的(RDBMS,全稱為 Relational Database Management System)區別。如表 1 所示。

表 1. HBase 與 RDBMS 的區別

  HBase RDBMS
硬體架構 類似於 Hadoop 的分散式叢集,硬體成本低廉 傳統的多核系統,硬體成本昂貴
容錯性 由軟體架構實現,由於由多個節點組成,所以不擔心一點或幾點宕機 一般需要額外硬體裝置實現 HA 機制
資料庫大小 PB GB、TB
資料排布方式 稀疏的、分佈的多維的 Map 以行和列組織
資料型別 Bytes 豐富的資料型別
事物支援 ACID 只支援單個 Row 級別 全面的 ACID 支援,對 Row 和表
查詢語言 只支援 Java API (除非與其他框架一起使用,如 Phoenix、Hive) SQL
索引 只支援 Row-key,除非與其他技術一起應用,如 Phoenix、Hive 支援
吞吐量 百萬查詢/每秒 數千查詢/每秒

理解了上面的表格之後,我們在看看資料是如何在 HBase 以及 RDBMS 中排布的。首先,資料在 RDBMS 的排布大致如表 2。

表 2. 資料在 RDBMS 中的排布示例

ID 密碼 時間戳
1 111 20160719
2 222 20160720

那麼資料在 HBase 中的排佈會是什麼樣子呢?如表 3 所示(這只是邏輯上的排布)。

表 3. 資料在 HBase 中的排布(邏輯上)

Row-Key Value(CF、Qualifier、Version)
1 info{'姓': '張','名':'三'}
pwd{'密碼': '111'}
2 Info{'姓': '李','名':'四'}
pwd{'密碼': '222'}

從上面示例表中,我們可以看出,在 HBase 中首先會有 Column Family 的概念,簡稱為 CF。CF 一般用於將相關的列(Column)組合起來。在物理上 HBase 其實是按 CF 儲存的,只是按照 Row-key 將相關 CF 中的列關聯起來。物理上的資料排布大致可以如表 4 所示。

表 4. 資料在 HBase 中的排布

Row-Key CF:Column-Key 時間戳 Cell Value
1 info:fn 123456789
1 info:ln 123456789
2 info:fn 123456789
2 info:ln 123456789

我們已經提到 HBase 是按照 CF 來儲存資料的。在表 3 中,我們看到了兩個 CF,分別是 info 和 pwd。info 儲存著姓名相關列的資料,而 pwd 則是密碼相關的資料。上表便是 info 這個 CF 儲存在 Hbase 中的資料排布。Pwd 的資料排布是類似的。上表中的 fn 和 ln 稱之為 Column-key 或者 Qulifimer。在 Hbase 中,Row-key 加上 CF 加上 Qulifier 再加上一個時間戳才可以定位到一個單元格資料(Hbase 中每個單元格預設有 3 個時間戳的版本資料)。初學者,在一開始接觸這些概念是很容易混淆。其實不管是 CF 還是 Qulifier 都是客戶定義出來的。也就是說在 HBase 中建立表格時,就需要指定表格的 CF、Row-key 以及 Qulifier。我們會在後續的介紹中,嘗試指定這些相關的概念,以便加深理解。這裡我們先通過下圖理解下 HBase 中,邏輯上的資料排布與物理上的資料排布之間的關係。

圖 1. Hbase 中邏輯上資料的排布與物理上排布的關聯

從上圖我們看到 Row1 到 Row5 的資料分佈在兩個 CF 中,並且每個 CF 對應一個 HFile。並且邏輯上每一行中的一個單元格資料,對應於 HFile 中的一行,然後當用戶按照 Row-key 查詢資料的時候,HBase 會遍歷兩個 HFile,通過相同的 Row-Key 標識,將相關的單元格組織成行返回,這樣便有了邏輯上的行資料。講解到這,我們就大致瞭解 HBase 中的資料排布格式,以及與 RDBMS 的一些區別。

對於 RDBMS 來說,一般都是以 SQL 作為為主要的訪問方式。而 HBase 是一種"NoSQL"資料庫。"NoSQL"是一個通用詞表示該資料庫並不是 RDBMS 。現在的市面上有許多種 NoSQL 資料庫,如 BerkeleyDB 是本地 NoSQL 資料庫的例子, HBase 則為大型分散式 NoSql 資料庫。從技術上來說,Hbase 更像是"資料儲存"而非"資料庫"(HBase 和 HDFS 都屬於大資料的儲存層)。因此,HBase 缺少很多 RDBMS 特性,如列型別,二級索引,觸發器和高階查詢語言等。然而, HBase 也具有許多其他特徵同時支援線性化和模組化擴充。最明顯的方式,我們可以通過增加 Region Server 的數量擴充套件 HBase。並且 HBase 可以放在普通的伺服器中,例如將叢集從 5 個擴充到 10 個 Region Server 時,儲存空間和處理容量都可以同時翻倍。當然 RDBMS 也能很好的擴充,但僅對一個點,尤其是對一個單獨資料庫伺服器而言,為了更好的效能,往往需要特殊的硬體和儲存裝置(往往價格也非常昂貴)。