最近作項目接觸到了HDFS、mapreduce以及Hbase,有了實戰機會,今天打算將這些知識好好總結下,以備不時之需。首先從Hbase開始吧。redis
Hbase是創建在HDFS上的分佈式數據庫,下圖是Hbase表的模型:mongodb
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設計爲順序格式不是更好嗎?memcached
對於這個問題我其實還沒徹底理解清楚,不過字典順序也是一種順序,在字典順序之上仍是能夠很好設計出按照數字順序的rowkey,不過hbase的rowkey是有別於關係數據庫的主鍵,關係數據庫下,一個行的主鍵只能查詢出一條數據,而hbase一個rowkey能查詢出許多數據,所以對於實時查詢而言rowkey的數字順序相比關係數據庫的行意義小的多。這兩個緣由有點不痛不癢了,下面緣由是個很重要的緣由了,hbase裏的region是hbase對客戶端提供相關操做的單位,而rowkey是按照數字順序排序,那麼region則會根據順序進行拆分,若是這個rowkey包含了時間因素,那麼當大量客戶端只作最近時間查詢,就會致使時間最近那個region負載壓力很大,爲了達到負載均衡能力,咱們最好將客戶端的查詢分佈在各個不一樣的region上,那麼咱們最好讓不一樣的region存儲的數據應對查詢是分佈均衡的,而這個就是要靠rowkey設計實現的。無論怎麼說hbase的使用裏hbase的做用很關鍵。學習
時間匆忙今天寫道這裏,但願本身研究完後能好好系統寫幾篇關係hbase的文章了。設計