HBase是一個分佈式的、面向列的開源數據庫存儲系統 ,是對Google論文Bigtable的實現,具備高可靠性、高性能和可伸縮性,它能夠處理分佈在數千臺通用服務器上的PB級的海量數據 。Bigtable是經過Google文件系統(GFS)來存儲數據的,而HBase對應的是經過Hadoop分佈式文件系統(HDFS)來存儲數據的。Hbase是Apache的Hadoop項目的子項目,不一樣於通常的關係數據庫,它是一個適合於非結構化數據存儲的數據庫,另外HBase是基於行鍵、列鍵和時間戳創建索引的模式存儲數據的。HBase不限制存儲的數據的種類,容許動態的、靈活的數據模型,不用SQL語言,也不強調數據之間的關係。HBase能夠在一個服務器集羣上運行,而且可以根據業務進行橫向擴展。數據庫
項目 | Hbase | 傳統數據庫 |
---|---|---|
數據量 | 線性擴展,數據量增多時可經過節點擴展進行支撐 | 數據量很大的時候沒法存儲 |
數據備份 | 數據存儲在hdfs上,備份機制健全 | 沒有很好的備份機制 |
訪問速度 | 經過zookeeper協調查找數據,訪問速度快 | 數據達到必定數量會開始變慢,很大的時候甚至沒法支撐 |
數據表結構 | 列動態增長,數據自動切分,支持高併發讀寫,但不支持條件查詢 | 列動態增長,數據自動切分,支持高併發讀寫,支持複雜的查詢 |
面向列: Hbase是面向列的存儲和權限控制,並支持獨立索引。列式存儲,其數據在表中是按照某列存儲的,這樣在查詢時只須要少數幾個字段,能夠大大減小讀取的數據量。數組
多版本: Hbase每個列會存儲多個Version。緩存
稀疏性: 爲空的列不佔用存儲空間,表能夠設計的很是稀疏。服務器
可擴展性: 由於底層依賴的是HDFS,HDFS自己就能夠進行擴展。數據結構
高可靠性: WAL機制保證了數據寫入時不會由於集羣異常而致使寫入數據丟失,Replication機制保證了在集羣出現嚴重的問題時,數據不會發生丟失或損壞。並且Hbase底層使用HDFS,HDFS自己就會進行備份。架構
高性能: 底層的LSM數據結構和RowKey有序排列等架構上的獨特設計,使得Hbase具備很是高的寫入性能。region切分主鍵索引和緩存機制使得Hbase在海量數據下具有必定的隨機讀取性能,該性能針對RowKey的查詢能達到毫秒級別。併發
HBase依賴於Zookeeper: Hbase是依賴於Zookeeper的,HBase中有內置的Zookeeper,但通常咱們會用其餘的 Zookeeper 集羣來監管 HMaster 和HRegionServer,Zookeeper 經過選舉,保證任什麼時候候,集羣中只有一個活躍的 HMaster 。負載均衡
Hbase的架構圖以下: 分佈式
一、HBase架構中有若干個從節點HRegionServer,負責維護主節點HMaster分配給它的HRegion,響應客戶端Client的I/O請求,向HDFS文件系統中讀寫數據,切分在運行過程當中變得過大的HRegion。併發性能與HRegionServer的個數有關。高併發
二、一個HRegionServer中有若干個HRegion,若干連續的行構成一個HRegion,當一個HRegion全部的storefile的大小超過閾值後,這個HRegion會分割爲兩個,並由HMaster分配到相應的HRegionServer服務器,實現負載均衡,因此一張完整的表可能被保存在多個HRegionServer上,HRegion是HBase中分佈式存儲和負載均衡的最小單元,但並非存儲的最小單元。
三、HBase中的每張表都經過RowKey按照必定的範圍被分割成多個子表(HRegion),默認一個HRegion超過256M就要被分割成兩個,這個過程由HRegionServer管理,而HRegion的分配由HMaster管理。 一個HRegion中有若干個Store,每一個Store是一個列族,Store分兩種,新插入的數據在內存數據MemStore中,滿了以後寫到磁盤StoreFile中,數據以HFile的格式保存在hdfs的DataNode中,StoreFile中有Hfile的元數據,方便索引。客戶端在檢索數據時,先在MemStore找,找不到再找StoreFile。不斷的寫StoreFile生成HFile會產生不少小文件不利於性能,因此會合並小StoreFile造成更大的,過大的話再切分。
四、HLog是一種預寫日誌WAL log,即Write ahead log,對hbase操做以前會將指令先寫入HLog,如MemStore中的數據還沒寫入StoreFile時停電了,就能夠進行數據恢復。每一個HRegionServer只有一個HLog,缺點是若是一臺HRegionServer下線,爲了恢復其上的HRegion,須要將HLog進行拆分,而後分發到其它HRegionServer上進行恢復。
五、HMaster管理用戶的增刪改查操做,管理HRegionServer的負載均衡,調整Region分佈,在HRegionServer停機後,負責失效HRegionServer上的HRegion遷移。因爲master只維護表和HRegion的元數據,而不參與表數據I/O的過程,HMaster下線僅致使全部元數據的修改被凍結(沒法建立刪除表,沒法修改表的schema,沒法進行HRegion的負載均衡,沒法處理HRegion上下線,沒法進行HRegion的合併,惟一例外的是HRegion的 split能夠正常進行,由於只有HRegionServer參與),表的數據讀寫還能夠正常進行。所以HMaster下線短期內對整個HBase集羣沒有影響。從上線過程能夠看到,HMaster保存的 信息全是能夠冗餘信息(均可以從系統其它地方收集到或者計算出來),所以,通常HBase集羣中老是有一個HMaster在提供服務,還有一個以上的"HMaster"在等待時機搶佔它的位置。
六、客戶端client包含有各類接口,client維護着一些cache來加快對HBase的訪問,好比HRegion的位置信息。讀寫操做時,客戶端直接與HRegionServer通訊,建表等管理操做則請求ZooKeeper與HMaster通訊。
七、ZooKeeper是分佈式應用程序協調服務,保存了表元數據尋址地址(-ROOT-表的地址)、HMaster和HRegionServer的狀態信息。它的做用是保證集羣中只有一個HMaster,實時監控HRegionServer的狀態並通知給HMaster。
八、-ROOT-表和.META.表是兩個內置表。.META.表中每一行記錄了一個用戶表HRegion的信息,當用戶表特別大時,HRegion也會很是多,.META.表也變得很是大,這時.META.本身也須要劃分紅多個HRegion,託管到多個HRegionServer上,此時須要用-ROOT-表去定位.META.,即-ROOT-表保存.META.表的HRegion信息。-ROOT-表永遠只有一個HRegion,也就只會存放在一臺HRegionServer上,定位任意HRegion須要3次跳轉。示意圖以下:
九、HFile是HBase中KeyValue數據的存儲格式,是hadoop的二進制格式文件。 首先HFile文件是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。Trailer中有指針指向其餘數據塊的起始點,FileInfo記錄了文件的一些meta信息。 Data Block是hbase io的基本單元,爲了提升效率,HRegionServer中有基於LRU的block cache機制。每一個Data塊的大小能夠在建立一個Table的時候經過參數指定(默認塊大小64KB),大號的Block有利於順序Scan,小號的Block利於隨機查詢。每一個Data塊除了開頭的Magic之外就是一個個KeyValue對拼接而成,Magic內容就是一些隨機數字,目的是防止數據損壞。
HBase是一個面向列的存儲數據庫,與通常的關係型數據庫不一樣,它裏面的數據是以列的形式來進行存儲的。在Hbase中一張表的列簇不會超過5個,每一個列簇中的列數沒有限制,HBase表的數據模型以下圖:
一、hbase表由若干行組成,行之間是有序的,按照惟一行鍵RowKey排序。
二、每一行由多個列族ColumnFamily組成,列族須要在建立表的時候定義好,如在語句create 'test','col1','col2'中,test爲表名,col1爲列族名。HBase的權限控制、存儲以及調優都是在列族層面進行的,同一列族的數據存儲在同一目錄下,建議列族數目很少於3個。
三、列族由多個列column組成,列不用預先定義,能夠隨時修改。
四、每個單元格cell都有惟一的時間戳timestamp標記版本。由於Hbase不適合修改數據,因此用時間戳記錄版本,修改數據就是添加新數據。單元格內的數據都是以字節數組表示的鍵值對。
Hbase的讀數據流程以下:
一、Client訪問Zookeeper,獲取-ROOT-表的元數據信息,即表位於哪一個RegionServer。
二、Zookeeper收到Client請求,並向客戶端返回此RegionServer的地址。
三、Client經過獲取到的RegionServer的IP去訪問RegionServer。
四、Client接着讀取RegionServer中的-ROOT-表的內容,獲取到.META表的地址。
五、Client根據.META表的地址,訪問.META表,獲取到數據的元數據信息。
六、client根據獲取到的數據的元數據信息,去訪問對應的HRegionServer,而後掃描所在的MemeStore和storefile來查詢數據。
Hbase的寫數據流程以下:
一、Client向Zookeeper發送寫數據請求。
二、Zookeeper收到Client發送的寫數據請求,而後返回要寫入數據對應的HRegionServer服務器和HRegion信息。
三、Client根據Zookeeper發送過來的信息向對應的HRegionServer服務器發起寫入數據請求,而後HRegionServer收到請求並響應。
四、Client先把數據寫入到HLog中,防止數據丟失,而後再寫入數據。
五、若是 Hlog 和 Memstore 均寫入成功,則這條數據寫入成功。在此過程當中,若是 Memstore達到16kb,會把 Memstore 中的數據寫到一個隊列中。
六、每次寫滿一個MemStore就會生一個HFile。
七、當HFile達到必定數量時,HRegionServer調用HDFS的API對HFile進行合併。