HBase是什麼
HBase是一個分佈式的、面向列的開源數據庫,該技術來源於 Fay Chang 所撰寫的Google論文“Bigtable:一個結構化數據的分佈式存儲系統”。就像Bigtable利用了Google文件系統(File System)所提供的分佈式數據存儲一樣,HBase在Hadoop之上提供了類似於Bigtable的能力。HBase是Apache的Hadoop項目的子項目。HBase不同於一般的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。另一個不同的是HBase基於列的而不是基於行的模式。HBase是一個Hadoop生態圈中的一種數據庫, 分佈式、可伸縮的、是一個稀疏的、存儲海量數據的工具。以谷歌的Bigtable爲模型的分佈式、版本化、非關係數據庫:結構化數據分佈式存儲系統。Apache HBase在Hadoop和HDFS上提供了類似Bigtable的功能。
爲什麼要有HBase
- 隨着互聯網整個行業的發展,整個數據處理爆炸的年代,換言之我們每天會產生大量的數據,這些數據如果存儲到傳統的數據庫中,已經不能滿足我們對數據存儲的要求了,所以出現很多分佈式的存儲介質。當我們需要隨機的並且實時的讀寫海量數據的時候就可以使用HBase。
Hbase的優勢
容量巨大
- HBase 的單表可以有百億行、百萬列,可以在橫向和縱向兩個維度插入數據,具有很大的彈性。
- 當關系型數據庫的單個表的記錄在億級時,查詢和寫入的性能都會呈現指數級下降,這種龐大的數據量對傳統數據庫來說是一種災難,而 HBase 在限定某個列的情況下對於單表存儲百億甚至更多的數據都沒有性能問題。
- HBase 採用 LSM 樹作爲內部數據存儲結構,這種結構會週期性地將較小文件合併成大文件,以減少對磁盤的訪問。
列存儲
- 與很多面向行存儲的關係型數據庫不同,HBase 是面向列的存儲和權限控制的,它裏面的每個列是單獨存儲的,且支持基於列的獨立檢索。通過下圖的例子來看行存儲與列存儲的區別。
- 從上圖可以看到,行存儲裏的一張表的數據都放在一起,但在列存儲裏是按照列分開保存的。在這種情況下,進行數據的插入和更新,行存儲會相對容易。而進行行存儲時,查詢操作需要讀取所有的數據,列存儲則只需要讀取相關列,可以大幅降低系統 I/O 吞吐量。
稀疏性
- 通常在傳統的關係性數據庫中,每一列的數據類型是事先定義好的,會佔用固定的內存空間,在此情況下,屬性值爲空(NULL)的列也需要佔用存儲空間。
- 在 HBase 中的數據都是以字符串形式存儲的,爲空的列並不佔用存儲空間,因此 HBase 的列存儲解決了數據稀疏性的問題,在很大程度上節省了存儲開銷。所以 HBase 通常可以設計成稀疏矩陣,同時這種方式比較接近實際的應用場景。
擴展性強
- HBase 工作在 HDFS 之上,理所當然地支持分佈式表,也繼承了 HDFS 的可擴展性。HBase 的擴展是橫向的,橫向擴展是指在擴展時不需要提升服務器本身的性能,只需添加服務器到現有集羣即可。
- HBase 表根據 Region 大小進行分區,分別存在集羣中不同的節點上,當添加新的節點時,集羣就重新調整,在新的節點啓動 HBase 服務器,動態地實現擴展。這裏需要指出,HBase 的擴展是熱擴展,即在不停止現有服務的前提下,可以隨時添加或者減少節點。
高可靠性
- HBase 運行在 HDFS 上,HDFS 的多副本存儲可以讓它在岀現故障時自動恢復,同時 HBase 內部也提供 WAL 和 Replication 機制。
- WAL(Write-Ahead-Log)預寫日誌是在 HBase 服務器處理數據插入和刪除的過程中用來記錄操作內容的日誌,保證了數據寫入時不會因集羣異常而導致寫入數據的丟失;而 Replication 機制是基於日誌操作來做數據同步的。
- 當集羣中單個節點出現故障時,協調服務組件 ZooKeeper 通知集羣的主節點,將故障節點的 HLog 中的日誌信息分發到各從節點進行數據恢復。
特點
HBase的內部結構
HBase的表結構
各個節點的作用
Client : hbase客戶端
- 1.包含訪問hbase的接口。比如,linux shell,java api。
- 2.除此之外,它會維護緩存來加速訪問hbase的速度。比如region的位置信息。
Zookeeper
- 1.監控Hmaster的狀態,保證有且僅有一個活躍的Hmaster。達到高可用。
- 2.它可以存儲所有region的尋址入口。如:root表在哪一臺服務器上。
- 3.實時監控HregionServer的狀態,感知HRegionServer的上下線信息,並實時通知給Hmaster。
- 4.存儲hbase的部分元數據。
HMaster
- 1.爲HRegionServer分配Region(新建表等)。
- 2.負責HRegionServer的負載均衡。
- 3.負責Region的重新分配(HRegionServer宕機之後的Region分配,HRegion裂變:當Region過大之後的拆分)。
- 4.Hdfs上的垃圾回收。
- 5.處理schema的更新請求
HRegionServer
- 1.維護HMaster分配給的Region(管理本機的Region)。
- 2.處理client對這些region的讀寫請求,並和HDFS進行交互。
- 3.負責切分在運行過程中組件變大的Region。
HLog
- 1.對HBase的操作進行記錄,使用WAL寫數據,優先寫入log(put操作:先寫日誌再寫memstore,這樣可以防止數據丟失,即使丟失也可以回滾)。
HRegion
- 1.HBase中分佈式存儲和負載均衡的最小單元,它是表或者表的一部分。
Store
- 1.相當於一個列簇
Memstore
- 1.內存緩衝區,用於將數據批量刷新到hdfs中,默認大小爲128M
StoreFile
- 1.和HFile概念意義,不過是一個邏輯概念。HBase中的數據是以HFile存儲在Hdfs上。
各個節點之間的關係
HMaster:HRegionServer : 1=*
HRegionServer:HRegion : 1=*
HRegionServer:HLog : 1=1
HRegion:Store : 1=*
Store:Memstore : 1=1
Memstore:HStoreFile : 1=*
StoreFile:HFile : 1=1
你知道的越多,你不知道的越多。
有道無術,術尚可求,有術無道,止於術。
如有其它問題,歡迎大家留言,我們一起討論,一起學習,一起進步