Hbase的存儲
Hbase在生態系統中的位置
Hbase存儲的邏輯視圖
Hbase的存儲格式
Hbase寫數據流程
Hbase快速響應數據linux
Hbase在生態系統中的位置
HBase位於結構化存儲層,Hadoop HDFS爲HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce爲HBase提供了高性能的計算能力,Zookeeper爲HBase提供了穩定服務和failover機制。算法
Hbase存儲的邏輯視圖數組
1)行鍵(RowKey)緩存
-- 行鍵是字節數組, 任何字符串均可以做爲行鍵;
-- 表中的行根據行鍵進行排序,數據按照Row key的字節序(byte order)排序存儲;
-- 全部對錶的訪問都要經過行鍵 (單個RowKey訪問,或RowKey範圍訪問,或全表掃描) (二級索引)安全
2)列族(ColumnFamily)服務器
-- CF必須在表定義時給出網絡
-- 每一個CF能夠有一個或多個列成員(ColumnQualifier),列成員不須要在表定義時給出,新的列族成員能夠隨後按需、動態加入數據結構
-- 數據按CF分開存儲,HBase所謂的列式存儲就是根據CF分開存儲(每一個CF對應一個Store),這種設計很是適合於數據分析的情形架構
3)時間戳(TimeStamp)負載均衡
-- 每一個Cell可能又多個版本,它們之間用時間戳區分
4)單元格(Cell)
-- Cell 由行鍵,列族:限定符,時間戳惟一決定,數據所有以字節碼形式存儲
5)區域(Region)
-- HBase自動把表水平(按Row)劃分紅多個區域(region),每一個region會保存一個表裏面某段連續的數據;
-- 每一個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region;
-- 當table中的行不斷增多,就會有愈來愈多的region。這樣一張完整的表被保存在多個Region 上。
-- HRegion是HBase中分佈式存儲和負載均衡的最小單元(默認256M)。最小單元表示不一樣的HRegion能夠分佈在不一樣的HRegionServer上。但一個HRegion不會拆分到多個server上。
特色:
無模式:每行都有一個可排序的主鍵和任意多的列,列能夠根據須要動態的增長,同一張表中不一樣的行能夠有大相徑庭的列;
面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索;
稀疏:空(null)列並不佔用存儲空間,表能夠設計的很是稀疏;
Hbase的存儲格式
HBase中的每張表都經過行鍵按照必定的範圍被分割成多個子表(HRegion),默認一個HRegion超過256M就要被分割成兩個,由HRegionServer管理,管理哪些HRegion由HMaster分配。
HRegionServer存取一個子表時,會建立一個HRegion對象,而後對錶的每一個列族(Column Family)建立一個Store實例,每一個Store都會有0個或多個StoreFile與之對應,每一個StoreFile都會對應一個HFile, HFile就是實際的存儲文件。所以,一個HRegion有多少個列族就有多少個Store。另外,每一個HRegion還擁有一個MemStore實例。memStore存儲在內存中,StoreFile存儲在HDFS上。
Region雖然是分佈式存儲的最小單元,但並非存儲的最小單元。Region由一個或者多個Store組成,每一個store保存一個columns family;每一個Store又由一個memStore和0至多個StoreFile組成,StoreFile包含HFile;memStore存儲在內存中,StoreFile存儲在HDFS上。
HBase是基於BigTable的面向列的分佈式存儲系統,其存儲設計是基於Memtable / SSTable設計的,主要分爲兩部分,一部分爲內存中的MemStore (Memtable),另一部分爲磁盤(這裏是HDFS)上的HFile (SSTable)。還有就是存儲WAL的log,主要實現類爲HLog.
本質上MemStore就是一個內存裏放着一個保存KEY/VALUE的MAP,當MemStore(默認64MB)寫滿以後,會開始刷磁盤操做。
HBase存儲在HDFS上的主要包含兩種文件類型:
1. HFile, HBase中KeyValue數據的存儲格式,HFile是Hadoop的二進制格式文件,實際上StoreFile就是對HFile作了輕量級包裝,即StoreFile底層就是HFile
2. HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,物理上是Hadoop的Sequence File
HFile結構:
Data Block:保存表中的數據,這部分能夠被壓縮
Meta Block:(可選)保存用戶自定義的kv對,能夠被壓縮。
File Info :Hfile的meta元信息,不被壓縮,定長。
Data Block Index :Data Block的索引。每一個Data塊的起始點。
Meta Block Index:(可選的)Meta Block的索引,Meta塊的起始點。
Trailer: 定長。保存了每一段的偏移量,讀取一個HFile時,會首先讀取Trailer,Trailer有指針指向其餘數據塊的起始點,保存了每一個段的起始位置(段的Magic Number用來作安全check),而後,DataBlock Index會被讀取到內存中,這樣,當檢索某個key時,不須要掃描整個HFile,而只需從內存中找到key所在的block,經過一次磁盤io將整個block讀取到內存中,再找到須要的key。DataBlock Index採用LRU機制淘汰。
HFile的Data Block,Meta Block一般採用壓縮方式存儲。Data Block是HBase I/O的基本單元,爲了提升效率,HRegionServer中有基於LRU的Block Cache機制。每一個Data塊的大小能夠在建立一個Table的時候經過參數指定,大號的Block有利於順序Scan,小號Block利於隨機查詢。每一個Data塊除了開頭的Magic之外就是一個個KeyValue對拼接而成, Magic內容就是一些隨機數字,目的是防止數據損壞。
HFile中的Key-Value結構
HFile中的每一個Key-Value對就是一個簡單的byte數組。但這個byte數組包含了不少項信息,並含有固定的結構。(有點相似數據流)
http://www.linuxidc.com/uploa...
File中的Key-Value
開始是兩個長度固定的數值,分別表示Key的長度和Value的長度。緊接着是Key,開始是固定長度的數值,表示RowKey的長度,緊接着是RowKey,而後是固定長度的數值,表示Family的長度,而後是Family(列族),接着是Qualifier(小列),而後是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)。Value部分則相對簡單,是純粹的二進制數據。
HBase 爲每一個值維護了多級索引,即:<key, column family, column name(qualifer), timestamp>
Hbase寫數據流程
a) Client發起了一個HTable.put(Put)請求給HRegionServer
b) HRegionServer會將請求匹配到某個具體的HRegion上面
c) 決定是否寫WAL log。WAL log文件是一個標準的Hadoop SequenceFile,文件中存儲了HLogKey,這些Keys包含了和實際數據對應的序列號,主要用於崩潰恢復。
d) Put數據保存到MemStore中,同時檢查MemStore狀態,若是滿了,則觸發Flush to Disk請求。
e) HRegionServer處理Flush to Disk的請求,將數據寫成HFile文件並存到HDFS上,而且存儲最後寫入的數據序列號,這樣就能夠知道哪些數據已經存入了永久存儲的HDFS中。
因爲不一樣的列族會共享region,因此有可能出現,一個列族已經有1000萬行,而另一個才100行。當一個要求region分割的時候,會致使100行的列會一樣分佈到多個region中。因此,通常建議不要設置多個列族。
Hbase快速響應數據
hbase上的數據是以storefile(HFile)二進制流的形式存儲在HDFS上block塊中;可是HDFS並不知道的hbase存的是什麼,它只把存儲文件是爲二進制文件,也就是說,hbase的存儲數據對於HDFS文件系統是透明的。
《Hbase權威指南》深刻學習:爲何hbase的速度那麼快?!
HBase HRegion servers集羣中的全部的region的數據在服務器啓動時都是被打開的,而且在內衝初始化一些memstore,相應的這就在必定程度上加快系統響應;而Hadoop中的block中的數據文件默認是關閉的,只有在須要的時候纔打開,處理完數據後就關閉,這在必定程度上就增長了響應時間。
從根本上說,HBase能提供實時計算服務主要緣由是由其架構和底層的數據結構決定的,即由LSM-Tree + HTable(region分區) + Cache決定——客戶端能夠直接定位到要查數據所在的HRegion server服務器,而後直接在服務器的一個region上查找要匹配的數據,而且這些數據部分是通過cache緩存的。
不一樣的region會被Master分配給相應的RegionServer進行管理:
HBase中有兩張特殊的Table,-ROOT-和.META.
.META.:記錄了用戶表的Region信息,.META.能夠有多個regoin,以及RegionServer的服務器地址。
-ROOT-:記錄了.META.表的Region信息,-ROOT-只有一個region
Ø Zookeeper中記錄了-ROOT-表的location
Client訪問用戶數據以前須要首先訪問zookeeper,而後訪問-ROOT-表,接着訪問.META.表,最後才能找到用戶數據的位置去訪問,中間須要屢次網絡操做,不過client端會作cache緩存。
《Hbase權威指南》深刻學習:爲何hbase的速度那麼快?!
一、Client會經過內部緩存的相關的-ROOT-中的信息和.META.中的信息直接鏈接與請求數據匹配的HRegion server; 二、而後直接定位到該服務器上與客戶請求對應的region,客戶請求首先會查詢該region在內存中的緩存——memstore(memstore是是一個按key排序的樹形結構的緩衝區); 三、若是在memstore中查到結果則直接將結果返回給client; 四、在memstore中沒有查到匹配的數據,接下來會讀已持久化的storefile文件中的數據。storefile也是按key排序的樹形結構的文件——而且是特別爲範圍查詢或block查詢優化過的,;另外hbase讀取磁盤文件是按其基本I/O單元(即 hbase block)讀數據的。具體就是過程就是: 若是在BlockCache中能查到要造的數據則這屆返回結果,不然就讀去相應的storefile文件中讀取一block的數據,若是尚未讀到要查的數據,就將該數據block放到HRegion Server的blockcache中,而後接着讀下一block塊兒的數據,一直到這樣循環的block數據直到找到要請求的數據並返回結果;若是將該region中的數據都沒有查到要找的數據,最後接直接返回null,表示沒有找的匹配的數據。固然blockcache會在其大小大於一的閥值(heapsize * hfile.block.cache.size * 0.85)後啓動基於LRU算法的淘汰機制,將最老最不經常使用的block刪除。
Hbase容錯和恢復
HLogFile
HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是「寫入時間」,sequence number的起始值爲0,或者是最近一次存入文件系統中sequence number。
HLog Sequece File的Value是HBase的KeyValue對象,即對應HFile中的KeyValue.
該機制用於數據的容錯和恢復:
每一個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead Log的類,在每次用戶操做寫入MemStore的同時,也會寫一份數據到HLog文件中(HLog文件格式見後續),HLog文件按期會滾動出新的,並刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止後,HMaster會經過Zookeeper感知到,HMaster首先會處理遺留的 HLog文件,將其中不一樣Region的Log數據進行拆分,分別放到相應region的目錄下,而後再將失效的region從新分配,領取 到這些region的HRegionServer在Load Region的過程當中,會發現有歷史HLog須要處理,所以會Replay HLog中的數據到MemStore中,而後flush到StoreFiles,完成數據恢復。
HBase容錯性Master容錯:Zookeeper從新選擇一個新的Master*無Master過程當中,數據讀取仍照常進行;*無master過程當中,region切分、負載均衡等沒法進行;RegionServer容錯:定時向Zookeeper彙報心跳,若是一旦時間內未出現心跳,Master將該RegionServer上的Region從新分配到其餘RegionServer上,失效服務器上「預寫」日誌由主服務器進行分割並派送給新的RegionServerZookeeper容錯:Zookeeper是一個可靠地服務,通常配置3或5個Zookeeper實例