非关型数据库之Hbase
目錄
1 Hbase簡介
1.1 初識Hbase
1.2 Hbase的特性
2 HDFS專項(xiàng)模塊
2.1 HDFS的基本架構(gòu)
2.1.1?HDFS各組件的功能:
2.2 HFDFS多種機(jī)制
2.2.1 分塊機(jī)制
2.2.2 副本機(jī)制
2.2.3 容錯機(jī)制
2.2.4 讀寫機(jī)制
?3 Hbase組件及其功能
?3.1?客戶端
3.2 Zookeeper
3.3 HMaster
3.4 RegionServer
4 Hbase數(shù)據(jù)模型及Hbase Shell
5 Hbase原理實(shí)現(xiàn)
5.1 Region定位
5.1.1 Region
5.1.2 Meta表
5.1.3 Region查找
5.2 Region再細(xì)分
5.2.1 Hbase寫數(shù)據(jù)
?5.2.2 Hbase讀數(shù)據(jù)
5.2.3 HFile的合并(Minor|Major)
5.3 WAL機(jī)制
?5.4 Region拆分
5.5 Region合并
1 Hbase簡介
1.1 初識Hbase
????????Hbase全拼為Hadoop database即分布式存儲數(shù)據(jù)庫,是一個可以進(jìn)行隨機(jī)訪問的存儲和檢索數(shù)據(jù)的平臺,用于存儲結(jié)構(gòu)化和半結(jié)構(gòu)化的數(shù)據(jù),如果數(shù)據(jù)量不是非常龐大的情況下,Hbase甚至可以存儲非結(jié)構(gòu)化的數(shù)據(jù)。Hbase作為Apache基金會Hadoop項(xiàng)目的一部分,使用Java語言實(shí)現(xiàn),將HDFS作為底層文件存儲系統(tǒng),在此基礎(chǔ)上運(yùn)行MapReduce分布式批量處理數(shù)據(jù),為Hadoop提供海量的數(shù)據(jù)管理服務(wù)。?
? ? ? ? Hbase是典型的NoSQL數(shù)據(jù)庫,通常被描述為稀疏的、分布式的、持久化的,由行鍵、列鍵和時(shí)間戳進(jìn)行索引的多維有序映射數(shù)據(jù)庫,主要用來儲存結(jié)構(gòu)化和半結(jié)構(gòu)化的數(shù)據(jù)。Hbase是Google的Bigtable的開源實(shí)現(xiàn)。
1.2 Hbase的特性
🌈容量巨大
🌈列存儲
🌈稀疏性
????????傳統(tǒng)的關(guān)型數(shù)據(jù)庫中,每一行的數(shù)據(jù)類型都是事先定義好的,會占用固定的內(nèi)存空間,在此情況下NULL值也會占用一定的存儲空間。而在Hbase中的數(shù)據(jù)都是以字符串形式存儲,數(shù)據(jù)為空的情況下列并不占用存儲空間,因?yàn)闀胁糠謹(jǐn)?shù)據(jù)有真實(shí)值,部分?jǐn)?shù)據(jù)為NULL,故稱為稀疏性。
🌈擴(kuò)展性強(qiáng)
? ? ? ? Hbase構(gòu)建在HDFS之上,理所當(dāng)然的支持分布式表,也繼承了HDFS的可擴(kuò)展性。Hbase是橫向擴(kuò)展的,所謂的橫向擴(kuò)展是指在擴(kuò)展時(shí)不需要提過服務(wù)器本身的性能,只需要添加不同的服務(wù)器節(jié)點(diǎn)到現(xiàn)有的集群即可。Hbase根據(jù)Region的大小進(jìn)行分區(qū),分別存在集群中的不同節(jié)點(diǎn),當(dāng)添加新節(jié)點(diǎn)時(shí),集群自動重新調(diào)整,在新的節(jié)點(diǎn)啟動Hbase服務(wù)器,實(shí)現(xiàn)動態(tài)擴(kuò)展。Hbase的擴(kuò)展是熱擴(kuò)展,即在不停掉現(xiàn)有服務(wù)的情況下進(jìn)行服務(wù)節(jié)點(diǎn)的增加和刪除。
🌈高可靠性
? ? ? ? Hbase同時(shí)繼承了HDFS的高可靠性,HDFS的多副本機(jī)制可以讓它在出現(xiàn)故障時(shí)自動恢復(fù),同時(shí)Hbase內(nèi)部也提供了預(yù)寫日志(Write-Ahead-Log,WAL)和Replication機(jī)制。
2 HDFS專項(xiàng)模塊
????????HDFS即Hadoop Distributed File System(Hadoop分布式文件系統(tǒng)),HDFS是參考Google公司的GFS實(shí)現(xiàn)的,不管是HDFS還是GFS計(jì)算機(jī)節(jié)點(diǎn)都會很容易出現(xiàn)硬件故障,HDFS的數(shù)據(jù)分塊儲存在不同節(jié)點(diǎn),當(dāng)某個節(jié)點(diǎn)出現(xiàn)故障時(shí),HDFS相關(guān)組件會快速檢測出節(jié)點(diǎn)故障并提供容錯機(jī)制完成數(shù)據(jù)的自動恢復(fù)。
2.1 HDFS的基本架構(gòu)
? ? ? ? 三個組件:NameNode、DataNode、SecondaryNameNode
? ? ? ? 一個架構(gòu):主從架構(gòu)(Master/Slave模式)
? ? ? ? HDFS集群一般由一個NameNode(運(yùn)行在Master節(jié)點(diǎn))、一個SecondaryNameNode(運(yùn)行在Master節(jié)點(diǎn))和許多個DataNode(運(yùn)行在Salve節(jié)點(diǎn))組成。在HDFS中數(shù)據(jù)是被分塊進(jìn)行儲存,一個文件可以被分為許多個塊,每個塊被存儲在不同的DataNode上。
????????????????????????
2.1.1?HDFS各組件的功能:
- 🌈NameNode
- 將文件的元數(shù)據(jù)信息存儲在edits和fsimage文件中(元數(shù)據(jù)信息記錄了文件系統(tǒng)中的文件名和目錄名,以及它們之間的層級關(guān)系,同時(shí)也記錄了每個文件目錄的所有者以及權(quán)限,甚至還記錄了每個文件是由哪些塊組成)
- 接收客戶端的請求并提供元數(shù)據(jù)(當(dāng)客戶端請求讀取文件時(shí),會先從NameNode獲取文件的元數(shù)據(jù)信息,然后再往元數(shù)據(jù)中對應(yīng)的DataNode讀取數(shù)據(jù)塊)
- 通過心跳機(jī)制檢測DataNode的狀態(tài),當(dāng)出現(xiàn)節(jié)點(diǎn)故障時(shí),重新分配失敗的任務(wù)。
- 🌈SecondaryNameNode
- 定期合并edits和fsimage文件
? ? ? ? ? edits文件(編輯日志)用來記錄文件的增、刪、改操作信息。
? ? ? ? ? fsimage文件(鏡像文件)用來維護(hù)HDFS的文件和文件夾的元數(shù)據(jù)信息。
? ? ? ? ? 每次系統(tǒng)啟動時(shí),NameNode會讀取fsimage文件的信息并保存到內(nèi)從中。在HDFS運(yùn)行期間,新的操作日志不會立即與fsimage文件進(jìn)行合并,也不會存到NameNode內(nèi)存中,而是先寫到edits文件中,當(dāng)edits文件達(dá)到一定的閾值或者間隔一定時(shí)間(默認(rèn)為3600s或者達(dá)到64MB)后會觸發(fā)SecondaryNameNode工作,這個時(shí)間點(diǎn)被稱為checkpoint。具體的合并步驟如下:
?????????????????????????
- 🌈DataNode
- 存儲數(shù)據(jù)塊
- 為客戶端提供數(shù)據(jù)塊的讀寫服務(wù)
- 相應(yīng)NameNode的相關(guān)指令(數(shù)據(jù)塊的增、刪、改等操作)
- 定時(shí)發(fā)送心跳信息給NameNode
2.2 HFDFS多種機(jī)制
2.2.1 分塊機(jī)制
在HDFS中數(shù)據(jù)是被分塊進(jìn)行儲存,一個文件可以被分為許多個塊,每個塊被存儲在不同的DataNode上。HDFS數(shù)據(jù)塊大小默認(rèn)為64MB,而一般磁盤塊的大小為512B。
2.2.2 副本機(jī)制
HDFS中數(shù)據(jù)塊的副本數(shù)默認(rèn)為3個,當(dāng)然也可以設(shè)置更多的副本集。在默認(rèn)副本集為3的情況下,0.17版本之前,會把第一個副本放在一個機(jī)架的一個DataNode上,第二個副本放在這個機(jī)架的另一個DataNode上,而第三個副本會放在不同的機(jī)架上;0.17版本之后,會把第一個副本放在一個機(jī)架的一個DataNode上,第二個副本放在另一個機(jī)架的DataNode上,而第三個副本會放在第二個副本的同機(jī)架的不同DataNode上。(機(jī)架的概念參照上圖2-4)
2.2.3 容錯機(jī)制
NameNode出錯:從SecondaryNameNode備份的fsimage文件進(jìn)行恢復(fù)。
DataNode出錯:當(dāng)出現(xiàn)節(jié)點(diǎn)故障時(shí),重新分配失敗的任務(wù)。
數(shù)據(jù)出錯:數(shù)據(jù)寫入的同時(shí)保存總和校驗(yàn)碼,讀取數(shù)據(jù)時(shí)進(jìn)行校驗(yàn)。
2.2.4 讀寫機(jī)制
🌈讀文件
?????????????????????????
🌈寫文件
????????????????????????
?3 Hbase組件及其功能
?
?3.1?客戶端
客戶端包含訪問Hbase的接口,是整個Hbase系統(tǒng)的入口,使用者通過客戶端操作Hbase,客戶端使用Hbase的RPC機(jī)制與HMaster和RegionServer進(jìn)行通信。
3.2 Zookeeper
Zookeeper是一個高性能、集中化、分布式的應(yīng)用程序協(xié)調(diào)服務(wù),主要用來解決分布式應(yīng)用中用戶遇到的數(shù)據(jù)管理問題。在Hadoop中Zookeeper主要用于實(shí)現(xiàn)高可靠性(High Availability,HA),包括HDFS的NameNode和YARN的ResourceManager的HA。以HDFS為例,NameNode作為HDFS的主節(jié)點(diǎn),負(fù)責(zé)管理文件系統(tǒng)的命名空間以及客戶端對文件的訪問,同時(shí)還需要監(jiān)控整個HDFS中每個DataNode的狀態(tài),實(shí)現(xiàn)負(fù)載均衡和容錯。為了實(shí)現(xiàn)HA需要由多個NameNode并存,一個處于活躍狀態(tài)其他則是備用狀態(tài),當(dāng)處于活躍狀態(tài)的NameNode無法正常工作時(shí),處于備用狀態(tài)的節(jié)點(diǎn)會通過競爭選舉產(chǎn)生新的活躍節(jié)點(diǎn)。Zookeeper在Hbase中的功能如下:
- Master選舉
????????與HDFS中的競選機(jī)制一樣,Hbase中有多個Master并存,但只有一個HMaster處于活躍狀態(tài),當(dāng)處于活躍狀態(tài)的HMaster無法正常工作時(shí),從其余備用Master中通過選舉出一個新的HMaster,保證集群的高可靠性。
- 系統(tǒng)容錯
? ? ? ? 在Hbase啟動時(shí),每個RegionServer在加入集群時(shí)都需要到Zookeeper中進(jìn)行注冊,創(chuàng)建一個狀態(tài)節(jié)點(diǎn),Zookeeper會實(shí)時(shí)監(jiān)控每個RegionServer狀態(tài),當(dāng)某個RegionServer掛掉時(shí),Zookeeper會因?yàn)橐欢螘r(shí)間內(nèi)沒有接收到其心跳信息而刪除該RegionServer對應(yīng)的節(jié)點(diǎn),并給HMaster發(fā)送節(jié)點(diǎn)刪除通知,HMaster得知有RegionServer斷開,會立即開啟RegionServer容錯機(jī)制參考博客
- Region元數(shù)據(jù)管理
? ? ? ? 在Hbase集群中,Region元數(shù)據(jù)被存儲在Zookeeper中的Meta表里。每次客戶端發(fā)起新的請求時(shí),需要先查詢Meta表中的Region的位置,當(dāng)Region發(fā)生任何變更時(shí),就能通過Zookeeper的Mate表來感知這一變化,保證客戶端能夠獲取到正確的Region元數(shù)據(jù)信息。
- Region狀態(tài)管理
? ? ? ? Hbase中的Region會經(jīng)常發(fā)生變更,其原因可能是系統(tǒng)故障、配置修改、Region的分裂及合并。只要Region發(fā)生任何變化,就需要使集群中的所有節(jié)點(diǎn)都知曉,然而集群中的Region數(shù)量會達(dá)到十萬級甚至更多,如果交由Hbase處理則負(fù)擔(dān)過大,所以只能依賴Zookeeper來完成。
- 提供Meta表存儲位置
????????Meta表中存儲的數(shù)據(jù)庫信息、列族信息、列族存儲位置信息都屬于元數(shù)據(jù),而Mate表的位置入口由Zookeeper提供。
3.3 HMaster
- 管理用戶對表的增、刪、改、查操作。HMaster提供了對所有元數(shù)據(jù)增刪改查的接口,便于用戶與Hbase進(jìn)行交互。
- 管理RegionServer的負(fù)載均衡,調(diào)整Region的分布。
- Region的分配與移除。
- 處理RegionServer的故障轉(zhuǎn)移。
3.4 RegionServer
????????RegionServer主要負(fù)責(zé)響應(yīng)用戶的請求,向HDFS讀寫數(shù)據(jù),一般在分布式集群中,RegionServer運(yùn)行在DataNode服務(wù)器上,實(shí)現(xiàn)數(shù)據(jù)的本地性。
- 處理分配給它的Region
- 處理客戶DAU你的讀寫請求
- 刷新緩存到HDFS
- 處理Region分片
- 執(zhí)行壓縮?
4 Hbase數(shù)據(jù)模型及Hbase Shell
Hbase數(shù)據(jù)模型及Hbase Shell_扎哇太棗糕的博客-CSDN博客
5 Hbase原理實(shí)現(xiàn)
5.1 Region定位
5.1.1 Region
????????在Hbase中,表中的行都是按照RowKey的字典順序進(jìn)行排序,表在行的方向上被分割成多個Region。每一張表一開始就只有一個Region,隨著數(shù)據(jù)的不斷插入,Hbase會根據(jù)一定的規(guī)則將表進(jìn)行水平拆分最終形成多個Region。Region過多一臺機(jī)器無法存儲的下時(shí),可分布式存儲到多臺機(jī)器上,HMaster將不同的Region分配到不同的RegionServer上。
????????????????
?????????客戶端在對表彰數(shù)據(jù)進(jìn)行增刪改查時(shí)需要知道數(shù)據(jù)存儲在哪個RegionServer上,這個查找Region的過程就叫做Region定位。Region標(biāo)識符可以唯一標(biāo)志一個Region,Region標(biāo)識符 = 表名+起始行鍵+時(shí)間戳+RegionID,其中RegionID等于(表名+起始行鍵+時(shí)間戳)進(jìn)行MD5加密。其中第一個Region沒有首行,最后一個Region沒有末行。
5.1.2 Meta表
????????Meta映射表的每個條目包含兩項(xiàng)內(nèi)容:Region標(biāo)識、RegionServer標(biāo)識,該條目表示了Region與RegionServer之間的對應(yīng)關(guān)系,可以讓用戶知道該Region存儲在哪個RegionServer上。總而言之,Meta表記錄了元數(shù)據(jù)信息,使Region的定位變得精準(zhǔn)且快速。
5.1.3 Region查找
? ? ? ? 早期的Region查找使用三層架構(gòu):首先訪問zookeeper的/hbase/root-region-server節(jié)點(diǎn)來得知ROOT表在哪個RegionServer上,然后訪問ROOT表獲取數(shù)據(jù)所在Meta表以及Meta表所在RegionServer的位置,接著訪問META表找到數(shù)據(jù)所在的Region去訪問。后來改為二層架構(gòu):客戶端先通過查找ZooKeeper的Meta表,獲取到查詢的數(shù)據(jù)的Region元數(shù)據(jù)信息,按照元數(shù)據(jù)信息獲取到相應(yīng)的數(shù)據(jù)。
參考博客:HBase查詢機(jī)制--Region定位_Fys的博客-CSDN博客_查看hbase 表的region
5.2 Region再細(xì)分
????????Hbase的核心模塊是RegionServer,RegionServer又由HLog和Region構(gòu)成,Region存儲著一系列連續(xù)的數(shù)據(jù)集。Region對應(yīng)著和多個的Store,每個Store對應(yīng)著表中的一個列族的存儲,Store又是由一個MemStore和零到多個的StoreFile組成,StoreFile的底層是用HFile實(shí)現(xiàn),也可以說StoreFile就是HFile。
????????????????????????
5.2.1 Hbase寫數(shù)據(jù)
?5.2.2 Hbase讀數(shù)據(jù)
5.2.3 HFile的合并(Minor|Major)
Minor合并(滿足條件的小HFile進(jìn)行合并)
????????執(zhí)行合并時(shí),Hbase將多個小HFile的內(nèi)容讀出并寫入到一個新的文件中,然后激活新文件,舊文件標(biāo)記為刪除,被標(biāo)記后的舊文件只有在下一次Major合并時(shí)才會被刪除,在此之前仍會出現(xiàn)在HFile中。HFile的Minor合并是觸發(fā)式的,觸發(fā)條件很多,比如在將MemStore中的數(shù)據(jù)刷新到HFile中時(shí)會申請對符合條件的HFile進(jìn)行合并,定期合并等。除此之外,對選擇進(jìn)行合并的HFile文件也是有條件的,條件如下:
?也就是說,一次Minor合并的HFile文件的個數(shù)在3~10個之間。
Major合并(無差別合并)
????????Major合并會對Store中的所有HFile文件進(jìn)行無差別的合并,甚至有時(shí)會將整個表中同一列族的HFile進(jìn)行合并,這是一個耗時(shí)且耗費(fèi)資源的操作,很影響集群的性能。故一般情況下都只做Minor合并,不做甚至有些集群干脆就禁止Major合并,只有在集群負(fù)載較小時(shí)才進(jìn)行手動的Major合并,或者配置Major的合并中期,默認(rèn)為7天。
5.3 WAL機(jī)制
????????WAL就是(Write Ahead Log),字面翻譯就是預(yù)寫日志文件機(jī)制。如下圖所示,每個RegionServer中的所有Region共用一個HLog文件,HLog就是上面說到的預(yù)寫日志文件,也就是說,每當(dāng)客戶端更寫數(shù)據(jù)必須先寫入到HLog文件后才能被寫入到MemStore中。
? ? ? ? 故障轉(zhuǎn)移:Zookeeper會實(shí)時(shí)監(jiān)控每個Regionserver的狀態(tài),當(dāng)某個RegionServer故障時(shí),RegionServer在Zookeeper上的臨時(shí)節(jié)點(diǎn)就會過期,Zookeeper會首先通知Master,Master會第一時(shí)間處理該RegionServer上的HLog文件,對其按照Region進(jìn)行拆分并放到相應(yīng)Region的目錄下,等到Region被重新分配到可用的RegionServer上時(shí),按照Region目錄下的HLog進(jìn)行數(shù)據(jù)恢復(fù)。
?5.4 Region拆分
????????一旦Region的負(fù)載過大或者超過閾值時(shí)(Region中最大的Store的大小大于設(shè)置的閾值時(shí)就會觸發(fā)Region拆分),它就會被拆分成兩個新的Region,這個過程是由RegionServer來完成的,具體流程如下:
5.5 Region合并
????????Region合并的必要性:Region過多會導(dǎo)致Meta表過大,Zookeeper管理不過來,從而影響客戶端的請求響應(yīng)。
總結(jié)
以上是生活随笔為你收集整理的非关型数据库之Hbase的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信证券停牌是怎么回事
- 下一篇: Juypter 打开其他路径文件