淺談HBase體系結構

    新人對於HBase的一點理解,可能亂七八糟,若是有什麼理解不恰當的地方,你咬我啊~git

    - -  若有問題,我們能夠一塊兒討論下。。。github

     HBase是Apache hadoop集羣中經常使用的非關係型數據,它是一種開源的、分佈式的、多版本、面向列存儲的數據庫。數據庫

     它的源碼在 https://github.com/apache/hbase 上,妥妥的開源啊。。。apache

     分佈式是由於它的數據最後存儲在HDFS上,因此它繼承了hadoop分佈式的優良傳統(不知道可否這麼理解)。api

    多版本就很少介紹了,版本更新快唄。。。緩存

     面向列的存儲是它與傳統關係型數據庫最大的區別之一,它是根據rowKey、columnfamily、quaifer、timestamp(若是你有多版本的話)獲得你最後的value值。。這個我們之後再介紹,今天主要想寫的是hbase的體系結構。服務器

  

  hbase的服務器體系結構也是主從服務器架構,分爲HBase Master server和HRegionServers。架構

  HBase Master server :主服務器,主要負責管理HRegionServers,我的理解:只是關於HRegionServer的決策權都是由它完成的。負載均衡

具體的功能有:分佈式

    1.用戶對Table的增、刪、改、查。

    2。HRegionServer的負載均衡,調整HRegion的分佈,像一個HRegionserver掛了,master會將掛了的HRegionserver上面的HRegion從新拿到,標上未分配,而後再分配一個活的HRegionServer,固然,它也得先詢問下這個HRegionServer要不要了。。

    3.在HRegion分裂後,負責新的HRegion的分配。 默認的HRegion的大小爲64M,當超過這個大小的時候,它會自動分裂成兩個,而且這個拆分速度很快,由於它在拆分的時候先會建立兩個HRegion,而這兩個HRegion先會保存對原HRegion的引用,當這兩個新的HRegion數據拆分完成後,再將此引用去掉,並刪除原HRegion。如今拆分完了,可是HRegion不是拆分完了就沒事幹了,它得找個HRegionServer管理啊,so,又得HBase Master Server分配了,同上~~

   4.HRegionServer停機後,負責失效的HRegionServer上的HRegion分配。服務掛了,可是HRegion沒掛啊,HRegion能夠說是一個存儲文件夾,一個服務掛了,找頭(hbase master server)再找一個唄,而後繼續作着保存或查詢時被提取數據的工做。

    HRegionServer的構成:

    HRegionServer包含了一個HLog部分和HRegion部分(多個HRegion)。。

  ps:這地方可能有些異議,由於網上一些圖片顯示的都是HRegion裏才包含HLog,網上的資料比較老,因此這裏我參考《hadoop實戰》中的資料,它的版本是0.92,可能與如今的0.96版本還算比較接近的。。

    HLog部分保存着用戶操做hbase的日誌(不排除也包含master管理hregion的操做,明天看一下),用戶的操做都會先記錄到HLog中,而後再保存到HRegion中。  

    而HRegion其實就是存儲的實際數據了。它包含了多個HStore。

    HStore:每個列族都會造成一個HStore,它又由MemStore和多個HFile組成。

    MemStore駐留在內存中,當數據保存時,數據會先存儲到MemStore中,而後根據用戶設定的顯式刷寫或隱式刷寫模式,將數據再保存到HFile中。默認的存儲模式是隱式存儲。這個之後寫client api的時候再介紹。。固然,這地方還有個注意的地方,當數據保存到MemStore,最後卻沒有保存到HFile中時,死機了。。HLog的做用來了,用戶操做的指令保存在HLog中,它會將指令執行,再將從新保存到MemStore中,這樣就能夠完成後面的操做了。。

    HFile負責的是實際數據的存儲了,它是HBase中的最小單位了。它也能夠進行拆分,也就是所謂的分區,讓數據更加分散,讀取數據的時候更加效率。

    昨天未寫完的部分今天補上。。

    HBase的兩個主要結構介紹完了,那麼我們如今就開始介紹一下它的存儲流程和讀取的流程。。

將它做爲一個流程圖可能不太合適。。不過它裏面所須要的東西基本都包含了。。

先說下Zookeeper的做用:

  1. 存儲了Root表的地址和HMaster的地址。存儲ROOT的地址能夠更快的查詢到哪張表有數據,提升運算效率。存儲HMaster地址是爲了肯定有哪些HMaster。

  2. 管理着MHaster。當HMaster失效時,它能夠找到另外一個HMaster,避免HMaster單點故障。

ROOT與.META與Region的結構是同樣的,都是以鍵值對的形式保存數據。。

ROOT裏面存儲了對應的.META地址和開始結束信息(像1-5,說明ROOT裏面存儲了5個.META的地址信息)。

.META裏面一樣存儲了對應的HRegion地址和開始結束信息。

 

好了,如今開始經過從客戶端讀取信息的角度開始分析了:

  1. client要讀取信息,先查詢下client 端的cache中是否存在數據,若是存在,剛直接返回數據。若是不存在,則進入到zookeeper,查找到裏面的相應數據存在的Root表中的地址。

  2. 經過數據存在ROOT表中地址找到.META,最終找到HRegion。找到HRegion後,它會先訪問MemStore中是否存在數據,若是存在,則直接讀取。若是沒有,就再到HFile中查找數據,並將數據放到MemStore。

  3. 最後數據返回到客戶端顯示。。

存儲數據流程:

    因爲Hbase中默認的刷寫方式是隱式刷寫,因此你在put()數據時,它會自動保存到HRegion上,但當你批量處理數據時,它會將數據先保存到client端的cache中。當你關閉隱式刷寫時,你put()的數據則會保存到client cache中,直到你調用刷寫命令時,纔會保存到HRegion中。具體的命令等明天我去公司的時候貼上來。。在家沒環境。。

    在HRegion部分的存儲:要寫入的數據會先寫到HMemcache 和Hlog 中,HMemcache 創建緩存,Hlog 同步Hmemcache和Hstore 的事務日誌,發起Flush Cache 時,數據持久化到Hstore 中,並清空HMemecache。

此處須要關注:

HBase 寫數據,首先寫入Memcache,並計入Log中,最後寫入HStore中,若是在寫入HStore是發生系統異常,就能夠從Log中恢復數據,從新寫 入HStore中。

相關文章
相關標籤/搜索