【云駐共創】終于看到Hbase技術原理,太不容易了
前言
本章主要講述開源的非關系型分布式數據庫HBase,它可以滿足大規模數據實時處理應用的需求。
目標
學完本課程后,您將能夠:
熟悉HBase的系統架構和相關概念
熟悉HBase的關鍵流程和突出特點
熟悉HBase的性能優化
熟悉HBase的基本Shell操作
大數據平臺所提供的主要功能是什么?大數據平臺主要提供的是存儲和計算,對于我們所學習的每一種組件,我們應該考慮其應用場景,而HBase能夠去應對海量數據的存儲,同時它也能夠去支撐實時響應、查詢、計算。
一、HBase基本介紹
HBase是谷歌的BigTable的開源實現,HBase是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統。
適合于存儲大表數據(表的規模可以達到數十億行以及數百萬列),并且對大表數據的讀、寫訪問可以達到實時級別。
利用Hadoop HDFS ( Hadoop Distributed File System )作為其文件存儲系統,提供實時讀寫的分布式數據庫系統。
利用ZooKeeper作為協同服務。Zookeeper也為HBase提供分布式鎖服務、監聽服務,還有微數據庫服務。
HBase與RDB的對比
HBase與傳統的關系數據庫的區別主要體現在以下幾個方面:
數據索引:關系數據庫通常可以針對不同列構建復雜的多個索引,以提高數據訪問性能。HBase只有一個索引――行鍵,通過巧妙的設計,HBase中的所有訪問方法,或者通過行間的某個區域,或者通過行鍵掃描,從而使得整個系統不會慢下來。
數據維護:在關系數據庫中,更新操作會用最新的當前值去替換記錄中原來的舊值蓋后就不會存在。而在HBase中執行更新操作時,并不會刪除數據舊的版本,而是生成新的版本,舊有的版本仍然保留。
可伸縮性:關系數據庫很難實現橫向擴展,縱向擴展的空間也比較有限。相反,HBase在BigTable這些分布式數據庫就是為了實現靈活的水平擴展而開發的,能夠輕易地通過在集群增加或者減少硬件數量來實現性能的伸縮。
HBase面向于海量數據存儲的,存儲的數據可以達到PB和TB級別。另外HBase它不需要完全擁有關系數據庫的ACID特性。A代表事物的原子性,C代表了事物的一致性,I代表事物的獨立性,D代表事物的持久性。再者HBase采用了zookeeper為其提供服務,可以提供了高吞吐量的客戶端查詢,在海量的數據中實現高效的隨機讀取機制。這個是通過了HBase的行鍵實現的,另外HBase具有很強的性能伸縮能力,我們通過了增加HBase的節點,能夠去水平擴展HBase的存儲以及查詢能力,hHBase能夠去同時處理結構化、半結構化以及非結構化的數據。
二、HBase相關概念
數據模型
簡單來說,應用程序是以表的方式在HBase存儲數據的。
表是由行和列構成的,所有的列是從屬于某一個列族的。
行和列的交叉點稱之為cell,cell是版本化的。cell的內容是不可分割的字節數組。
表的行鍵也是一段字節數組,所以任何東西都可以保存進去,不論是字符串或者數字。
HBase的表是按key排序的,排序方式是針對字節的。
所有的表都必須要有主鍵-key。
存儲在HBase表每一行數據都有可排序的關鍵字(Row Key)和任意列項( Column &Column Family )。在HBase中,僅能通過主鍵(Row Key )和主鍵版本號來檢索數據,僅支持單行事務。下面以HBase存儲搜索引擎的網頁為例:
行鍵,相當于關系表的主鍵,每一行數據的唯一標識。字符串、整數、二進制串都可以作為RowKey。所有記錄按照RowKey排序后存儲。
Column Family,列簇,一個表在水平方向上由一個或多個CF組成。一個CF可以由任意多個Column組成。Column是CF下的一個標簽,可以在寫入數據時任意添加,因此CF支持動態擴展,無需預先定義Column的數量和類型。HBase中表的列非常稀疏,不同行的列的個數和類型都可以不同。此外,每個CF都有獨立的TTL(生存周期)。可以只對行上鎖,對行的操作始終是原始的。
HBase表結構
HBase每一行記錄都有了行鍵。HBase有列族,在列族下又有了不同的列,行間和列相交的地方稱為可以是單元格的內容。對于每一個單元格的內容它有版本,那么這個版本是根據時間戳來決定的。
比如說在T1時刻,我們存儲進去是male,那么在T2時刻我們對male進行修改,實際上存儲還是male,那么male、female都存儲在HBase的單元格cell中。
表:HBase采用表來組織數據,表由行和列組成,列劃分為若干個列族
行:每個HBase表都由若干行組成,每個行由行鍵(row key)來標識。
列族:一個HBase表被分組成許多“列族”( column Family )的集合,它是基本的訪問控制單元
列限定符:列族里的數據通過列限定符(或列)來定位
單元格:在HBase表中,通過行、列族和列限定符確定一個“單元格”( cell ),單元格中存儲的數據沒有數據類型,總被視為字節數組byte[]
時間戳:每個單元格都保存著同一份數據的多個版本,這些版本采用時間戳進行去索引。
數據存儲概念視圖
有一個名為webtable的表,包含兩個列族: contents和anchor.在這個例子里面,anchor有兩個列(anchor:aa.com, anchor:bb.com),contents僅有一列(contents:html)
數據存儲物理視圖
盡管在概念視圖里,表可以被看成是一個稀疏的行的集合。但在物理上,它的是區分列族存儲的。新的columns可以不經過聲明直接加入一個列族。
行存儲
行存儲,數據按行存儲在底層文件系統中。通常,每一行會被分配固定的空間。
優點:有利于增加/修改整行記錄等操作;有利于整行數據的讀取操作。
缺點:單列查詢時,會讀取一些不必要的數據。
列存儲
HBase采用列存儲
列存儲,數據以列為單位,存儲在底層文件系統中。
優點:有利于面向單列數據的讀取/統計等操作。
缺點:整行讀取時,可能需要多次I/O操作。
三、HBase體系架構
HBase架構介紹
功能:
監控 RegionServer
處理 RegionServer 故障轉移
處理元數據的變更
處理 region 的分配或移除
在空閑時間進行數據的負載均衡
通過 Zookeeper 發布自己的位置給客戶端
功能:
負責存儲 HBase 的實際數據
處理分配給它的 Region
刷新緩存到 HDFS
維護 HLog
執行壓縮
負責處理 Region 分片
HBase的架構包括三個主要的功能組件:
庫函數:鏈接到每個客戶端
Master主服務器
HRegionServer服務器
主服務器Master負責管理和維護HBase表的分區信息,維護Region服務器列表,分配Region負載均衡。
HRegionServer服務器負責存儲和維護分配給自己的Region,處理來自客戶端的讀寫請求。
客戶端并不是直接從Master主服務器上讀取數據,而是在獲得Region的存儲位置信息后,直接從HRegionServer上讀取數據。
客戶端并不依賴Master,而是通過Zookeeper來獲得Region位置信息,大多數客戶端甚至從來不和Master通信,這種設計方式使得Master負載很小。
Table ?(HBase table)
Region(Regions for the table)
-Store(Store per ColumnFamily for each Region for the table)
- MemStore? ?(MemStore for each Store for each Region for the table)
- StoreFile ? (StoreFiles for each Store for each Region for the table)
~Block ? ? ? (Blocks within a StoreFile within a Store for each Region for the tabie)
MemStore:顧名思義,就是內存存儲,位于內存中,用來保存當前的數據操作,所以當數據保存在 WAL 中之后,RegsionServer 會在內存中存儲鍵值對。
Store:HFile 存儲在 Store 中,一個 Store 對應 HBase 表中的一個列族。
Region:Hbase 表的分片,HBase 表會根據 RowKey 值被切分成不同的 region 存儲在 RegionServer 中,在一個 RegionServer 中可以有多個不同的 region。
表和Region
HBase表開始只有一個Region,后來不斷分裂
Region拆分操作非常快,接近瞬間,因為拆分之后的Region讀取的仍然是原存儲文件,直到分裂過程結束,把存儲文件異步地寫到獨立的文件之后,才會讀取新文件
Region的定位
Region分為元數據Region以及用戶Region兩類。
Meta Region記錄了每一個User Region的路由信息。
讀寫Region數據的路由,包括如下幾步:
找尋Meta Region地址
再由Meta Region找尋user Region地址
為了加快訪問速度,hbase:meta表會被保存在內存中。
假設hbase:meta表的每行(一個映射條目)在內存中大約占用1KB,并且每個Region限制為128MB。
兩層結構可以保存的Region數目是128MB/1KB = 2的17次方個Region。
HMaster高可用
Zookeeper可以幫助選舉出一個Master作為集群的總管,并保證在任何時刻總有唯—一個Master在運行,這就避免了Master的“單點失效”問題。
Master:主服務器Master主要負責表和Region的管理工作
管理用戶對表的增加、部除、修改、查詢等操作。
實現不同Region服務器之間的負載均衡。
在Region分裂或合并后,負責重新調整Region的分布。
對發生故疏失效的Region服務器上的Region進行遷移。
HRegionServer:HRegionServer是HBase中最核心的模塊。負責維護分配給自己的Region。響應用戶的讀寫請求。
四、HBase關鍵流程
用戶讀寫數據過程
用戶寫入數據時,被分配到相應HRegionServer去執行。
用戶數據首先被寫入到Hlog中,再寫入MemStore中,最終寫到磁盤上形成StoreFile。
只有當操作寫入Hlog之后,commit()調用才會將其返回給客戶端。
當用戶讀取數據時,HRegionServer會首先訪問MemStore緩存,如果找不到,再去磁盤上面的StoreFile中尋找。
緩存的刷新
●系統會周期性地把MemStore緩存里的內容刷寫到磁盤的StoreFile文件中,清空緩存,并在Hlog里面寫入一個標記
●每次刷寫都生成-一個新的StoreFile文件, 因此,每個Store包含多個StoreFile文件
●每個HRegionServer都有一 個自己的HLog文件,每次啟動都檢查該文件,確認最近一 次執行緩存刷新操作之后是否發生新的寫入操作;如果發現更新,則先寫入MemStore,再刷寫到StoreFile,開始為用戶提供服務。
StoreFile的合并
每次刷寫都生成一個新的StoreFile,數量太多,影響查找速度調用Store.compact()把多個合并成一個
合并操作比較耗費資源,只有數量達到一個閾值才啟動合并
Store工作原理
Store是Region服務器的核心。多個StoreFile合并成一個。單個StoreFile過大時,又觸發分裂操作,1個父Region被分裂成兩個子Region 。
HLog工作原理
分布式環境必須要考慮系統出錯。HBase采用HLog保證系統恢復。
HBase系統為每個Region服務器配置了一個HLog文件,它是一種預寫式日志( writeAhead Log )。
用戶更新數據必須首先寫入日志后,才能寫入MemStore緩存,并目,直到MemStore存內容對應的日志已經寫入磁盤,該緩存內容才能被刷寫到磁盤。
五、HBase突出特點
多HFile的影響
HFile文件數目越來越多,讀取時延也越來越大。
如圖所示,橫坐標表示HFile文件的數目,縱坐標表示讀取的時延。可以看到,在HFile文件數目較少的情況下,讀取的實驗呢大概在兩個毫秒左右。但是隨著HFile文件數目的不斷增多,讀取的時間將會越來越大。當HFile文件數目達到一萬四千四百個左右的時候,讀取的時間將達到二十毫秒,上升了一個級別,為了降低讀取時延,我們采用了壓縮的方法。
Compaction
Compaction的目的,是為了減少同一個Region中同一個ColumnFamily下面的小文件(HFile)數目,從而提升讀取的性能。
Compaction分為Minor、Major兩類:
Minor:小范圍的Compaction。有最少和最大文件數目限制。通常會選擇一些連續時間范圍的小文件進行合并。
Major:涉及該Region該ColumnFamily 下面的所有的HFile文件。
Minor Compaction選取文件時,遵循一定的算法。
壓縮( compaction)用于在 MergeOnRead存儲類型時將基于行的log日志文件轉化為parquet列式數據文件,用于加快記錄的查找。用戶可通過 hudi-cli提供的命令行顯示觸發 compaction或者在使用 HoodieDeltaStreamer將上游(Kafka/DFS)數據寫入 hudi數據集時進行相應配置,然后由系統自動進行 compaction操作。壓縮會影響到讀寫的性能。
OpenScanner
OpenScanner的過程中,會創建兩種不同的Scanner來讀取Hfile、MemStore的數據:
HFile對應的Scanner為StoreFileScannero。
MemStore對應的Scanner為MemStoreScanner。
BloomFilter
BloomFilter用來優化一些隨機讀取的場景,即Get場景。它可以被用來快速的判斷一條用戶數據在一個大的數據集合(該數據集合的大部分數據都沒法被加載到內存中)中是否存在。
BloomFilter在判斷一個數據是否存在時,擁有一定的誤判率。但對于“用戶數據XXXX不存在”的判斷結果是可信的。
HBase的BloomFilter的相關數據,被保存在HFile中。
六、HBase性能優化
行鍵(Row Kev )
行鍵是按照字典序存儲,因此,設計行鍵時,要充分利用這個排序特點,將經常一起讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。
舉個例子︰如果最近寫入HBase表中的數據是最可能被訪問的,可以考慮將時間戳作為行鍵的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作為行鍵,這樣能保證新寫入的數據在讀取時可以被快速命中。
構建HBase二級索引
HBase只有一個針對行健的索引
訪問HBase表中的行,只有三種方式:
通過單個行健訪問
日通過一個行健的區間來訪問
全表掃描
為了提高訪問速度可以構建二級索引,例如構建:
多個表索引
多個列索引
基于部分列值的索引
七、HBase常用Shell命令
HBase常用Shell命令
create:創建表
list:列出HBase中所有的表信息
put:向表、行、列指定的單元格添加數據
scan:瀏覽表的相關信息
get:通過表名、行、列、時間戳、時間范圍和版本號來獲得相應單元格的值
enable/disable:使表有效或無效
drop:刪除表
總結:
本章詳細介紹了HBase數據庫的知識。HBase數據庫是BigTable的開源實現,和BigTable一樣,支持大規模海量數據,分布式并發數據處理效率極高,易于擴展且支持動態伸縮,適用于廉價設備HBase實際上就是一個稀疏、多維、持久化存儲的映射表,它采用行鍵、列鍵和時間戳進行索引,每個值都是未經解釋的字符串。本章介紹了HBase數據在概念視圖和物理視圖中的差別。
學習推薦
華為Learning網站:?https://support.huawei.com/learning
華為e學云:?https://support.huawei.com/learning/elearning
華為Support案例庫:https://support.huawei.com/enterprise
本文整理自華為云社區【內容共創系列】活動。
查看活動詳情:https://bbs.huaweicloud.com/blogs/314887
相關任務詳情:Hbase技術原理
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。