Hbase 是一個分佈式的,可擴展的,大數據存儲數據庫。一種構建在HDFS上的分佈式、面向列的存儲系統。redis
原理
特色:列存儲
- 特色:
- 大:一個表能夠有上億行,上百列 (Hbase的每一個Region的列都不多)。
- 面向列:面向列表(簇:Columnfamily)的存儲和權限控制,列(簇)獨立檢索
- 稀疏:對於空(NULL)的列,並不佔用存儲空間。所以,表能夠設計的很是稀疏。
- 無模式:每一行都有一個能夠排序的主鍵和任意多的列,列能夠根據須要動態增長,同一張表中不一樣的行能夠有大相徑庭的列。
- 數據多版本:每一個單元的數據能夠有多個數據版本,默認狀況下,版本號自動分配,版本號就是單元格插入的時間戳。
- 數據類型單一:Hbase中的數據都是字符串,沒有類型。
整體架構
組成
- client:包含了訪問HBase的接口,並維護cache來加快對HBase的訪問。
- ZK:master和RegionServer啓動時會向Zookeeper註冊(服務發現)
- 保證任什麼時候候,集羣只有一個mater。
- 存儲全部Region的尋址入口
- 實時監控Region Server的上線和下線信息,並通知給master。服務發現
- 存儲HBase的Schema和table元數據。
- Hmaster:
- 管理用戶對Table的增刪改查,爲Region Server 分配region
- 負責Region Server的負載均衡
- 發現失效的Region Server 並從新分配其上的region
- HDFS上的垃圾文件回收
- 處理schema更新請求
- 在Region Split後,負責新Region的分配
- Region Server:
- 維護master分配給他的region,除了這些region的I/O請求
- 負責切分在運行過程當中變得過大的region。
- client 先從master和zk中獲取Region Server的地址。而後讀寫直接經過Region Server獲取
- HRegion:
- table在行方向上分割爲多個Region。Region 是HBase中分佈存儲和負載均衡的最小單元,不一樣的Region能夠分片在不一樣的Region Server上,但同一個Region是不會拆分到多個Server上。
- Client 要獲取完整的一個Row數據,必須經過 row、column、timestamp 的負載均衡從不一樣的 Region Server 中的Region中獲取具體數據,而後組裝
- 每一個region由一下信息標識:
- key:<表名,startRowKey,建立時間>
- 由目錄表 (-ROOT和.META) 記錄該region的endRowkey。
- Store:
- 每一個Region有一個或多個store組成。
- Hbase會把數據放在一個store裏面,即爲每一個ColumnFamily見一個store。有幾個columnFamily就有幾個Store。
- MemStore:
- 保存數據的key-Values,存放在內存中
- 當memStore大小達到一個閾值(默認64MB),Hbase會由一個線程將memStore會被flush到文件StoreFile,生成一個快照。
- StoreFile:memStore內存中的數據寫到文件後就是StoreFile,StoreFile底層是以HFile的格式保存。
- HLog(WAL log:write ahead log):用來作災難恢復使用,Hlog記錄數據的全部變動,一旦Region Server 宕機,就能夠從log中進行恢復。相似與:redis的 AOF
- HLog文件就是一個普通的Hadoop Sequence File。
- Sequence File 的value是key時HLogKey對象(?),其中記錄了寫入數據的歸屬信息。除了table和region名字外,還同時包括sequence number和timestamp,timestamp是寫入時間,sequence number的起始值爲0,或者是最近一次寫入文件系統的sequence number。Sequence File的value是HBase的Key-Value對象,對應HFile中的KeyValue
- LogFlusher:sync()將數據刷新到SequenceFileLogWriter實現
- LogRoller:
HRegion 定位與spilit
邏輯存儲
- Hbase面向列的存放方式:舊數據不會被覆蓋,只會添加
- 邏輯結構:
- Row key:是byte array(最大長度爲64KB),做爲每條記錄的主鍵。
- 經過單個Row key訪問
- 經過Row key的range全表掃描
- Row key能夠任意字符串(最大長度是64K,實際應用中長度通常位10~100bytes),在Hbase內部Row key保存位字節數組。
- Column Family:列簇,擁有一個名字,包含一個或者多個相關列
- 每一個Column family是存放在HDFS上的單獨文件,空值不會被保存。
- Column:列,屬於某個columnfamily,familyName:columnName,每條記錄可動態添加
- Hbase經過Row 和 Column肯定一個單元存儲Cell。每一個Cell都保存着同一份數據的多個版本。版本經過時間戳索引來索引,時間戳的類型是64位整型
- Version Number:類型位Long,默認值是系統的時間戳,可有用戶自定義
- Value(Cell):Byte Array。
- 由 {row key,column(=<family>+<label>),version} 惟一去頂的單元。Cell裏面沒有類型,所有是字節碼形式存儲。
物理存儲
-
HFile:HBase的基礎文件格式,全部的HBase都存放在HFile上面。若是說StoreFile是HBase數據存儲的最小邏輯單位。那麼HFile就至關於一個Linux的文件系統,映射物理磁盤和邏輯數據的最小單位。網絡
-
- Trailer:指針指向其它數據塊的起始點。
- File Info:記錄了文件的一些meta信息。
- Data Block:是hbase io的基礎單元,爲了提升效率,HRegionServer中有基於LRU的block cache機制。
- 每一個Data塊的大小能夠建立一個Table的時候經過參數指定(默認塊大小64K),大號的Block有利於順序scan,小號的Block有利於隨機查詢。
- 每一個Data塊除了開頭的Magic之外就是一個個KeyValue對拼接而成,Magic內容就是一些隨機數字,目的是防數據損壞。
-
- 開始2個固定長度:表示key和value的長度
- key:[RowKey的長度]-[Rowkey]-[ColumnFamily的長度]-[ColumnFamily]-[Qualifier]-[TimeStamp]-[key Type].key Type:在Put/Delete
-
HLog File:HBase的WAL(write ahead log)的存儲個數,物理上是Hadoop的Sequence File。在處理插入和刪除過程,用來記錄操做內容的日誌,只有日誌寫入成功,纔會通知客戶端操做成功架構
-
- Sequence File的key是HLogKey的對象,HLogKey記錄了寫入數據的歸屬信息,除了table和Region名字外,同時還包括sequence number和timestamp,
- sequence number起始值爲0,或者最近一次存入文件系統中的sequence number
- timestamp 是寫入時間。
讀寫
- 寫入:
- Client經過zookeeper的調度,
- RowKey存在:查詢到RowKey對應的-ROOT-和.META.的表,查詢到對應RegionServer信息。向RegionServer發送PUT寫請求,將put寫入WriteBuffer,若是是批量提交,寫滿緩存後自動提交。
- RowKey不存在:直接經過Hmaster負載到對應的Region中
- RegionServer中數據寫入Region的MemStore,知道MemStore達到預設的閾值。
- MemStore中的數據被Flush成一個StoreFile
- 隨着StoreFile文件的不斷增多,當數量增加到必定的閾值後,觸發Compact操做,將多個StoreFile合併成一個StoreFile,同時進行版本合併和數據刪除。
- StroeFiles經過不端的Compact合併操做,會造成愈來愈大的StoreFile。
- 當個StroeFile大小超過過必定閾值後,觸發Split操做,把當前Region Split成2個新的Region。父Region會下線,新的Split出2個Region會被Hmaster分配到對應的RegionServer上,使得原先1個Region的壓力得以分流到2個Region上。
- 讀取:
- Client訪問Zookeeper,查找**-ROOT-表和.META.表**信息
- 從**.META.表**中查詢存放目標數據的Region信息,從而找到對應的RegionServer
- 從RegionServer獲取須要查找的數據。
- RegionServer的內存分爲MemStore和BlockCache兩部分,MemStore主要用於寫數據,BlockCache主要用於讀數據。讀請求想到MemStore中查數據,查不到就到BlockCache中查,在查不到就會到StoreFile讀,並把讀的結果放入BlockCache。
安裝
使用