文章出處

  最近做項目接觸到了HDFS、mapreduce以及Hbase,有了實戰機會,今天打算將這些知識好好總結下,以備不時之需。首先從Hbase開始吧。

  Hbase是建立在HDFS上的分布式數據庫,下圖是Hbase表的模型:

 

      Hbase這個數據庫其實和傳統關系數據庫還是有很多類似之處,而不是像mongodb,memcached以及redis完全脫離了表的概念,只不過hbase是以列為中心的數據庫,而傳統關系數據庫則是以行為中心的數據庫。不過hbase這個列并非我們傳統意義的列,而是列族。列族是hbase最小的存儲單位,換句話說hbase底層數據都是以列族來進行組織的。

      學習hbase我最大的收獲我個人覺得是對數據庫的一種新的認識,數據庫作用還是快速的檢索出我們想要數據,也就是數據庫的主要作用還是為了實時查詢,如果一個存儲數據的系統檢索數據的速度很慢,那么這個系統應該稱之為數據倉庫,hbase是一種數據庫,是一種用來彌補傳統關系數據庫在海量數據中快速檢索數據的能力不足。不過受制于持久存儲系統的檢索數據的速度以及海量數據存儲是分散到各個服務器上,因此解決海量數據實時檢索的方式只有根據實際的業務場景重新組織數據存儲的模型,并且加上合理的索引來解決的。那么hbase是如何解決這個問題的呢?

      Hbase首先打破關系數據庫里的避免數據冗余的機制,將經常需要一起查詢的記錄聚集在一起存儲,例如商戶的訂單信息,這里我們用order代表訂單信息,orderId為訂單號,spId為商品訂單號,spNm為商品名字,num為數量其他字段就略去,在hbase里我們可以把order定義為一個列族,orderId這些字段就是列的名字,在底層存儲系統里我們將order這個列族下所有的列數據聚集在一起存儲,那么當我們查詢訂單信息就可以直接找到這些聚集在一起的存儲訂單信息,那么就可以快速查詢出訂單信息。這一點相比關系數據庫,關系數據庫很難將一些經常查詢出來的信息聚集在一起存儲,這也就是hbase對于關系數據庫的一大優勢。這也就是為什么hbase是圍繞列族的數據庫,因為列族就是將一些經常會被一起查詢出來的數據的邏輯抽象,所以底層物理存儲機制都是圍繞列族進行,這也就是hbase里的hfile了,hfile是hbase物理存儲的最小單位,而hfile都是按照列族聚集在一起的。

      前面我說道想要在海量數據下做到實時查詢數據,一個要解決的問題就是如何將經常查詢的數據聚集在一起存儲,另一個就是建立索引了,下面我就要講講hbase的索引是如何設計。Hbase的索引是靠rowkey完成,也就是行主鍵,還是以商戶訂單為例,我們通過設計列族將這些數據聚集在一起存儲,但是實際查詢里我們經常會根據不同商戶,或者不同商品查詢訂單信息,那么我們就得要有手段能快速從聚集的訂單信息里查詢出所需要查詢的訂單信息,那么這時候就靠rowkey的作用了,在hbase物理存儲里最小存儲單位是hfile,hfile之上則是region,每個region里聚集很多hfile(當然實際hbase底層存儲比這個復雜,還有memstore,這是根據LSM存儲原理設計,不過本文就以hfile代表整個列族存儲),而region則是根據rowkey來進行構建和拆分的,換個說法就是region的名字或者代號就是rowkey,現在我們回到訂單的例子,我們可以在rowkey的設計時候加入商戶號,當用戶查詢時候可以根據商戶號快速定位到region,然后再在region里進一步查找具體的列族信息,這樣就完成了一個快速檢索數據的目的。

      最近學習hbase一直有個問題困惑我,那就是為何hbase的rowkey要按照字典順序設計,而不是按順序設計,這個疑惑的源頭是很多hbase資料里說hbase是一個有利于順序查詢的數據庫,那么rowkey設計為順序格式不是更好嗎?

      對于這個問題我其實還沒完全理解清楚,不過字典順序也是一種順序,在字典順序之上還是可以很好設計出按照數字順序的rowkey,不過hbase的rowkey是有別于關系數據庫的主鍵,關系數據庫下,一個行的主鍵只能查詢出一條數據,而hbase一個rowkey能查詢出許多數據,因此對于實時查詢而言rowkey的數字順序相比關系數據庫的行意義小的多。這兩個原因有點不痛不癢了,下面原因是個很重要的原因了,hbase里的region是hbase對客戶端提供相關操作的單位,而rowkey是按照數字順序排序,那么region則會根據順序進行拆分,如果這個rowkey包含了時間因素,那么當大量客戶端只做最近時間查詢,就會導致時間最近那個region負載壓力很大,為了達到負載均衡能力,我們最好將客戶端的查詢分布在各個不同的region上,那么我們最好讓不同的region存儲的數據應對查詢是分布均衡的,而這個就是要靠rowkey設計實現的。不管怎么說hbase的使用里hbase的作用很關鍵。

      時間匆忙今天寫道這里,希望自己研究完后能好好系統寫幾篇關系hbase的文章了。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()