1、Hbase介紹
1.一、對Hbase的認識
- HBase做爲面向列的數據庫運行在HDFS之上,HDFS缺少隨機讀寫操做,HBase正是爲此而出現。
- HBase參考 Google 的 Bigtable 實現,以鍵值對的形式存儲。項目的目標就是快速在主機內數十億行數據中定位所需的數據並訪問它。
- HBase是創建在HDFS之上的分佈式面向列的數據庫;屬於KV結構數據(V能夠隨便存,結構化數據和非結構化數據均可以),原生不支持標準SQL。
- HBase能夠提供快速隨機訪問海量結構化數據。
- 它利用了Hadoop的文件系統(HDFS)提供的容錯能力。
- Hive 和 Hbase都是做用在hdfs之上的。
- Hive :適合統計分析。Hive 執行的是mapreduce任務,延遲高。
- Hbase:適合大數據量查詢,不適合統計分析。Hbase是鍵值對存儲,能夠快速返回數據。
1.二、Hbase數據單元
- RowKey:是Byte array,是表中每條記錄的「主鍵」,按照字典順序排序,惟一,方便快速查找,Rowkey的設計很是重要;
- Column Family:列族,擁有一個名稱(string),包含一個或者多個相關列;
- Column:屬於某一個columnfamily,familyName:columnName,每條記錄可動態添加;
- Version Number:版本號,類型爲Long,默認值是系統時間戳Timestamp,可由用戶自定義;用於標記同一份數據的不一樣版本。
- Value(Cell):具體的值,Byte array;
- 總之,在一個HBase:
- 表是行的集合。
- 行是列族的集合。
- 列族是列的集合。
- 列是鍵值對的集合。
- 建表時:指定表的列族,列本身插入數據時動態建立

1.三、Hbase物理存儲結構
- 每一個column family存儲在HDFS上的一個單獨文件中,空值不會被保存;
-
Key 和 Version number在每一個 column family中均有一份;web
-
HBase 爲每一個值維護了多級索引,即:<key, column family, column name, timestamp>;算法
-
在物理層面上,表格的數據是經過StoreFile來存儲的,每一個StoreFile至關於一個可序列化的Map,Map的key和value都是可解釋型字符數組;sql
-
Column Family是一組Column的組合,在HBase中,Schema的定義主要爲Column Family的定義,同大多數nosql數據庫同樣,HBase也是支持自由定義Schema,可是前提要先定義出具體的Column Family,而在隨後的column定義則沒有任何約束;其次,HBase的訪問權限控制,磁盤及內存統計等功能都是基於Column Family層面完成的;數據庫
-
HBase提供基於Cell的版本管理功能,版本號默認經過timestamp來標識,而且呈倒序排列;數組
2、Hbase原理分析
HBase採用Master/Slave(主僕結構)架構搭建集羣,它隸屬於Hadoop生態系統,由如下類型節點組成:緩存
- HMaster節點
- HRegionServer節點
- ZooKeeper集羣
- 而在底層,它將數據存儲於HDFS中,於是涉及到HDFS的NameNode、DataNode等
整體結構以下:架構

2.一、Client
- 使用HBase RPC機制與HMaster和HRegionServer進行通訊;
- Client與HMaster進行通訊進行管理類操做;
- Client與HRegionServer進行數據讀寫類操做;
2.二、HMaster
HMaster沒有單點問題,HBase中能夠啓動多個HMaster,經過Zookeeper保證總有一個Master在運行。
HMaster主要負責Table和Region的管理工做:負載均衡
- 管理用戶對錶的增刪改查操做DDL;
- 管理HRegionServer的負載均衡,調整Region分佈;
- Region Split後,負責新Region的分佈;
- 在HRegionServer停機後,負責失效HRegionServer上Region 的遷移;
2.三、HRegionServer
HBase中最核心的模塊;nosql
- 維護region,處理對這些region的IO請求;
- Regionserver負責切分在運行過程當中變得過大的region;
- 一個HRegionServer包括多個HRegion和一個Hlog
HRegion介紹分佈式
HBase使用RowKey將表水平切割成多個HRegion,從HMaster的角度,每一個HRegion都紀錄了它的StartKey和EndKey(第一個HRegion的StartKey爲空,最後一個HRegion的EndKey爲空),因爲RowKey是排序的,於是Client能夠經過HMaster快速的定位每一個RowKey在哪一個HRegion中。(通俗理解:就是經過StartKey和Endkey將rowkey按照順序存儲)

查看web UI

HregionServer詳解

- HRegionServer通常和DataNode在同一臺機器上運行,實現數據的本地性。
- HRegionServer內部管理了一系列HRegion對象,每一個HRegion對應了Table中的一個Region。
- 一個Table能夠有一個或多個Region,他們能夠在一個相同的HRegionServer上,也能夠分佈在不一樣的HRegionServer上,一個HRegionServer能夠有多個HRegion,他們分別屬於不一樣的Table。
- HRegion由多個Store(HStore)構成,每一個HStore對應了一個Table在這個HRegion中的一個Column Family,即每一個Column Family就是一個集中的存儲單元,於是最好將具備相近IO特性的Column存儲在一個Column Family,以實現高效讀取。
- 每一個HRegionServer中都會有一個HLog對象。HLog是一個實現Write Ahead Log的類,每次用戶操做寫入Memstore的同時,也會寫一份數據到HLog文件,HLog文件按期會滾動出新,並刪除舊的文件(已持久化到StoreFile中的數據)。
- 引入HLog緣由:
- 災難恢復。在分佈式系統環境中,沒法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種狀況。
- 一個HStore由一個MemStore 和0個或多個StoreFile組成。
- MemStore:
- 是一個寫緩存(In Memory Sorted Buffer),全部數據的寫在完成WAL日誌寫後,會寫入MemStore中,由MemStore根據必定的算法將數據Flush到底層HDFS文件中(HFile),一般每一個HRegion中的每一個 Column Family有一個本身的MemStore。
- StoreFile:
- 用於存儲HBase的數據(Cell/KeyValue)。在HFile中的數據是按RowKey、Column Family、Column排序,對相同的Cell(即這三個值都同樣),則按timestamp倒序排列。

2.四、Zookeeper
- ZooKeeper爲HBase集羣提供協調服務,它管理着HMaster和HRegionServer的狀態(available/alive等),而且保證集羣中只有一個HMaster,會在它們宕機時通知給其餘HMaster,從而能夠實現HMaster之間的故障轉移;
- 實時監控HRegionServer的上線和下線信息,並實時通知給HMaster;
- 存儲HBase的Meta Table(hbase:meta)的位置,Meta Table表存儲了集羣中全部用戶HRegion的位置信息,且不能split;
- Zookeeper的引入使得Master再也不是單點故障;
在zookeeper的節點中: /hbasae/master:來表示Active的HMaster; 若是當前Active的HMaster宕機,則該節點消失,於是其餘HMaster獲得通知,而將自身轉換成Active的HMaster,在變爲Active的HMaster以前,它會建立在/hbase/back-masters/下建立本身的Ephemeral節點;