HBase的底層原理是什么

HBase 的底層原理是什么,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

雅安網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,雅安網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為雅安1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的雅安做網(wǎng)站的公司定做!

HBase簡(jiǎn)介

HBase 是一個(gè)分布式的、面向列的開(kāi)源數(shù)據(jù)庫(kù)。建立在 HDFS 之上。Hbase的名字的來(lái)源是 Hadoop database,即 Hadoop 數(shù)據(jù)庫(kù)。HBase 的計(jì)算和存儲(chǔ)能力取決于 Hadoop 集群。

它介于 NOSQL 和 RDBMS 之間,僅能通過(guò)主鍵(row key)和主鍵的 range 來(lái)檢索數(shù)據(jù),僅支持單行事務(wù)(可通過(guò) Hive 支持來(lái)實(shí)現(xiàn)多表 join 等復(fù)雜操作)。

HBase中表的特點(diǎn):

  1. 大:一個(gè)表可以有上十億行,上百萬(wàn)列

  2. 面向列:面向列(族)的存儲(chǔ)和權(quán)限控制,列(族)獨(dú)立檢索。

  3. 稀疏:對(duì)于為空(null)的列,并不占用存儲(chǔ)空間,因此,表可以設(shè)計(jì)的非常稀疏。

HBase底層原理

系統(tǒng)架構(gòu)

HBase 的底層原理是什么

HBase系統(tǒng)架構(gòu)

根據(jù)這幅圖,解釋下HBase中各個(gè)組件

Client
  1. 包含訪問(wèn)hbase的接口,Client維護(hù)著一些cache來(lái)加快對(duì)hbase的訪問(wèn),比如regione的位置信息.

Zookeeper

HBase可以使用內(nèi)置的Zookeeper,也可以使用外置的,在實(shí)際生產(chǎn)環(huán)境,為了保持統(tǒng)一性,一般使用外置Zookeeper。

Zookeeper在HBase中的作用:

  1. 保證任何時(shí)候,集群中只有一個(gè)master

  2. 存貯所有Region的尋址入口

  3. 實(shí)時(shí)監(jiān)控Region Server的狀態(tài),將Region server的上線和下線信息實(shí)時(shí)通知給Master

HMaster
  1. 為Region server分配region

  2. 負(fù)責(zé)region server的負(fù)載均衡

  3. 發(fā)現(xiàn)失效的region server并重新分配其上的region

  4. HDFS上的垃圾文件回收

  5. 處理schema更新請(qǐng)求

HRegion Server
  1. HRegion server維護(hù)HMaster分配給它的region,處理對(duì)這些region的IO請(qǐng)求

  2. HRegion server負(fù)責(zé)切分在運(yùn)行過(guò)程中變得過(guò)大的region
    從圖中可以看到,Client訪問(wèn)HBase上數(shù)據(jù)的過(guò)程并不需要HMaster參與(尋址訪問(wèn)Zookeeper和HRegion server,數(shù)據(jù)讀寫(xiě)訪問(wèn)HRegione server)

HMaster僅僅維護(hù)者table和HRegion的元數(shù)據(jù)信息,負(fù)載很低。

HBase的表數(shù)據(jù)模型

HBase 的底層原理是什么

HBase 整體結(jié)構(gòu)

  1. Table 中的所有行都按照 Row Key 的字典序排列。

  2. Table 在行的方向上分割為多個(gè) HRegion。

  3. HRegion按大小分割的(默認(rèn)10G),每個(gè)表一開(kāi)始只有一 個(gè)HRegion,隨著數(shù)據(jù)不斷插入表,HRegion不斷增大,當(dāng)增大到一個(gè)閥值的時(shí)候,HRegion就會(huì)等分會(huì)兩個(gè)新的HRegion。當(dāng)Table 中的行不斷增多,就會(huì)有越來(lái)越多的 HRegion。

  4. HRegion 是 HBase 中分布式存儲(chǔ)和負(fù)載均衡的最小單元。最小單元就表示不同的 HRegion 可以分布在不同的 HRegion Server 上。但一個(gè) HRegion 是不會(huì)拆分到多個(gè) Server 上的。

  5. HRegion 雖然是負(fù)載均衡的最小單元,但并不是物理存儲(chǔ)的最小單元。
    事實(shí)上,HRegion 由一個(gè)或者多個(gè) Store 組成,每個(gè) Store 保存一個(gè) Column Family。
    每個(gè) Strore 又由一個(gè) MemStore 和0至多個(gè) StoreFile 組成。如上圖。

2. StoreFile 和 HFile 結(jié)構(gòu)

StoreFile以HFile格式保存在HDFS上。

HFile的格式為:

HBase 的底層原理是什么

HFile 具體結(jié)構(gòu)

開(kāi)始是兩個(gè)固定長(zhǎng)度的數(shù)值,分別表示Key的長(zhǎng)度和Value的長(zhǎng)度。緊接著是Key,開(kāi)始是固定長(zhǎng)度的數(shù)值,表示RowKey的長(zhǎng)度,緊接著是 RowKey,然后是固定長(zhǎng)度的數(shù)值,表示Family的長(zhǎng)度,然后是Family,接著是Qualifier,然后是兩個(gè)固定長(zhǎng)度的數(shù)值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒(méi)有這么復(fù)雜的結(jié)構(gòu),就是純粹的二進(jìn)制數(shù)據(jù)了。

HFile分為六個(gè)部分:

  1. Data Block 段–保存表中的數(shù)據(jù),這部分可以被壓縮.

  2. Meta Block 段 (可選的)–保存用戶自定義的kv對(duì),可以被壓縮。

  3. File Info 段–Hfile的元信息,不被壓縮,用戶也可以在這一部分添加自己的元信息。

  4. Data Block Index 段–Data Block的索引。每條索引的key是被索引的block的第一條記錄的key。

  5. Meta Block Index段 (可選的)–Meta Block的索引。

  6. Trailer–這一段是定長(zhǎng)的。保存了每一段的偏移量,讀取一個(gè)HFile時(shí),會(huì)首先讀取Trailer,Trailer保存了每個(gè)段的起始位置(段的Magic Number用來(lái)做安全check),然后,DataBlock Index會(huì)被讀取到內(nèi)存中,這樣,當(dāng)檢索某個(gè)key時(shí),不需要掃描整個(gè)HFile,而只需從內(nèi)存中找到key所在的block,通過(guò)一次磁盤(pán)io將整個(gè) block讀取到內(nèi)存中,再找到需要的key。DataBlock Index采用LRU機(jī)制淘汰。

HFile的Data Block,Meta Block通常采用壓縮方式存儲(chǔ),壓縮之后可以大大減少網(wǎng)絡(luò)IO和磁盤(pán)IO,隨之而來(lái)的開(kāi)銷當(dāng)然是需要花費(fèi)cpu進(jìn)行壓縮和解壓縮。
目前HFile的壓縮支持兩種方式:Gzip,Lzo。

3. Memstore與StoreFile

一個(gè) HRegion 由多個(gè) Store 組成,每個(gè) Store 包含一個(gè)列族的所有數(shù)據(jù) Store 包括位于內(nèi)存的 Memstore 和位于硬盤(pán)的 StoreFile。

寫(xiě)操作先寫(xiě)入 Memstore,當(dāng) Memstore 中的數(shù)據(jù)量達(dá)到某個(gè)閾值,HRegionServer 啟動(dòng) FlashCache 進(jìn)程寫(xiě)入 StoreFile,每次寫(xiě)入形成單獨(dú)一個(gè) StoreFile

當(dāng) StoreFile 大小超過(guò)一定閾值后,會(huì)把當(dāng)前的 HRegion 分割成兩個(gè),并由 HMaster 分配給相應(yīng)的 HRegion 服務(wù)器,實(shí)現(xiàn)負(fù)載均衡

客戶端檢索數(shù)據(jù)時(shí),先在memstore找,找不到再找storefile。

4. HLog(WAL log)

WAL 意為Write ahead log,類似 MySQL 中的 binlog,用來(lái) 做災(zāi)難恢復(fù)時(shí)用,Hlog記錄數(shù)據(jù)的所有變更,一旦數(shù)據(jù)修改,就可以從log中進(jìn)行恢復(fù)。

每個(gè)Region Server維護(hù)一個(gè)Hlog,而不是每個(gè)Region一個(gè)。這樣不同region(來(lái)自不同table)的日志會(huì)混在一起,這樣做的目的是不斷追加單個(gè)文件相對(duì)于同時(shí)寫(xiě)多個(gè)文件而言,可以減少磁盤(pán)尋址次數(shù),因此可以提高對(duì)table的寫(xiě)性能。帶來(lái)的麻煩是,如果一臺(tái)region server下線,為了恢復(fù)其上的region,需要將region server上的log進(jìn)行拆分,然后分發(fā)到其它region server上進(jìn)行恢復(fù)。

HLog文件就是一個(gè)普通的Hadoop Sequence File:

  1. HLog Sequence File 的Key是HLogKey對(duì)象,HLogKey中記錄了寫(xiě)入數(shù)據(jù)的歸屬信息,除了table和region名字外,同時(shí)還包括 sequence number和timestamp,timestamp是”寫(xiě)入時(shí)間”,sequence number的起始值為0,或者是最近一次存入文件系統(tǒng)中sequence number。

  2. HLog Sequece File的Value是HBase的KeyValue對(duì)象,即對(duì)應(yīng)HFile中的KeyValue,可參見(jiàn)上文描述。

讀寫(xiě)過(guò)程

1. 讀請(qǐng)求過(guò)程:

HRegionServer保存著meta表以及表數(shù)據(jù),要訪問(wèn)表數(shù)據(jù),首先Client先去訪問(wèn)zookeeper,從zookeeper里面獲取meta表所在的位置信息,即找到這個(gè)meta表在哪個(gè)HRegionServer上保存著。

接著Client通過(guò)剛才獲取到的HRegionServer的IP來(lái)訪問(wèn)Meta表所在的HRegionServer,從而讀取到Meta,進(jìn)而獲取到Meta表中存放的元數(shù)據(jù)。

Client通過(guò)元數(shù)據(jù)中存儲(chǔ)的信息,訪問(wèn)對(duì)應(yīng)的HRegionServer,然后掃描所在HRegionServer的Memstore和Storefile來(lái)查詢數(shù)據(jù)。

最后HRegionServer把查詢到的數(shù)據(jù)響應(yīng)給Client。

查看meta表信息

hbase(main):011:0> scan 'hbase:meta'

2. 寫(xiě)請(qǐng)求過(guò)程:

Client也是先訪問(wèn)zookeeper,找到Meta表,并獲取Meta表元數(shù)據(jù)。

確定當(dāng)前將要寫(xiě)入的數(shù)據(jù)所對(duì)應(yīng)的HRegion和HRegionServer服務(wù)器。

Client向該HRegionServer服務(wù)器發(fā)起寫(xiě)入數(shù)據(jù)請(qǐng)求,然后HRegionServer收到請(qǐng)求并響應(yīng)。

Client先把數(shù)據(jù)寫(xiě)入到HLog,以防止數(shù)據(jù)丟失。

然后將數(shù)據(jù)寫(xiě)入到Memstore。

如果HLog和Memstore均寫(xiě)入成功,則這條數(shù)據(jù)寫(xiě)入成功

如果Memstore達(dá)到閾值,會(huì)把Memstore中的數(shù)據(jù)flush到Storefile中。

當(dāng)Storefile越來(lái)越多,會(huì)觸發(fā)Compact合并操作,把過(guò)多的Storefile合并成一個(gè)大的Storefile。

當(dāng)Storefile越來(lái)越大,Region也會(huì)越來(lái)越大,達(dá)到閾值后,會(huì)觸發(fā)Split操作,將Region一分為二。

細(xì)節(jié)描述:

HBase使用MemStore和StoreFile存儲(chǔ)對(duì)表的更新。
數(shù)據(jù)在更新時(shí)首先寫(xiě)入Log(WAL log)和內(nèi)存(MemStore)中,MemStore中的數(shù)據(jù)是排序的,當(dāng)MemStore累計(jì)到一定閾值時(shí),就會(huì)創(chuàng)建一個(gè)新的MemStore,并且將老的MemStore添加到flush隊(duì)列,由單獨(dú)的線程flush到磁盤(pán)上,成為一個(gè)StoreFile。于此同時(shí),系統(tǒng)會(huì)在zookeeper中記錄一個(gè)redo point,表示這個(gè)時(shí)刻之前的變更已經(jīng)持久化了。
當(dāng)系統(tǒng)出現(xiàn)意外時(shí),可能導(dǎo)致內(nèi)存(MemStore)中的數(shù)據(jù)丟失,此時(shí)使用Log(WAL log)來(lái)恢復(fù)checkpoint之后的數(shù)據(jù)。

StoreFile是只讀的,一旦創(chuàng)建后就不可以再修改。因此HBase的更新其實(shí)是不斷追加的操作。當(dāng)一個(gè)Store中的StoreFile達(dá)到一定的閾值后,就會(huì)進(jìn)行一次合并(minor_compact, major_compact),將對(duì)同一個(gè)key的修改合并到一起,形成一個(gè)大的StoreFile,當(dāng)StoreFile的大小達(dá)到一定閾值后,又會(huì)對(duì) StoreFile進(jìn)行split,等分為兩個(gè)StoreFile。

由于對(duì)表的更新是不斷追加的,compact時(shí),需要訪問(wèn)Store中全部的 StoreFile和MemStore,將他們按row key進(jìn)行合并,由于StoreFile和MemStore都是經(jīng)過(guò)排序的,并且StoreFile帶有內(nèi)存中索引,合并的過(guò)程還是比較快。

HRegion管理

HRegion分配

任何時(shí)刻,一個(gè)HRegion只能分配給一個(gè)HRegion Server。HMaster記錄了當(dāng)前有哪些可用的HRegion Server。以及當(dāng)前哪些HRegion分配給了哪些HRegion Server,哪些HRegion還沒(méi)有分配。當(dāng)需要分配的新的HRegion,并且有一個(gè)HRegion Server上有可用空間時(shí),HMaster就給這個(gè)HRegion Server發(fā)送一個(gè)裝載請(qǐng)求,把HRegion分配給這個(gè)HRegion Server。HRegion Server得到請(qǐng)求后,就開(kāi)始對(duì)此HRegion提供服務(wù)。

HRegion Server上線

HMaster使用zookeeper來(lái)跟蹤HRegion Server狀態(tài)。當(dāng)某個(gè)HRegion Server啟動(dòng)時(shí),會(huì)首先在zookeeper上的server目錄下建立代表自己的znode。由于HMaster訂閱了server目錄上的變更消息,當(dāng)server目錄下的文件出現(xiàn)新增或刪除操作時(shí),HMaster可以得到來(lái)自zookeeper的實(shí)時(shí)通知。因此一旦HRegion Server上線,HMaster能馬上得到消息。

HRegion Server下線

當(dāng)HRegion Server下線時(shí),它和zookeeper的會(huì)話斷開(kāi),zookeeper而自動(dòng)釋放代表這臺(tái)server的文件上的獨(dú)占鎖。HMaster就可以確定:

  1. HRegion Server和zookeeper之間的網(wǎng)絡(luò)斷開(kāi)了。

  2. HRegion Server掛了。

無(wú)論哪種情況,HRegion Server都無(wú)法繼續(xù)為它的HRegion提供服務(wù)了,此時(shí)HMaster會(huì)刪除server目錄下代表這臺(tái)HRegion Server的znode數(shù)據(jù),并將這臺(tái)HRegion Server的HRegion分配給其它還活著的節(jié)點(diǎn)。

HMaster工作機(jī)制

master上線

master啟動(dòng)進(jìn)行以下步驟:

  1. 從zookeeper上獲取唯一一個(gè)代表active master的鎖,用來(lái)阻止其它HMaster成為master。

  2. 掃描zookeeper上的server父節(jié)點(diǎn),獲得當(dāng)前可用的HRegion Server列表。

  3. 和每個(gè)HRegion Server通信,獲得當(dāng)前已分配的HRegion和HRegion Server的對(duì)應(yīng)關(guān)系。

  4. 掃描.META.region的集合,計(jì)算得到當(dāng)前還未分配的HRegion,將他們放入待分配HRegion列表。

master下線

由于HMaster只維護(hù)表和region的元數(shù)據(jù),而不參與表數(shù)據(jù)IO的過(guò)程,HMaster下線僅導(dǎo)致所有元數(shù)據(jù)的修改被凍結(jié)(無(wú)法創(chuàng)建刪除表,無(wú)法修改表的schema,無(wú)法進(jìn)行HRegion的負(fù)載均衡,無(wú)法處理HRegion 上下線,無(wú)法進(jìn)行HRegion的合并,唯一例外的是HRegion的split可以正常進(jìn)行,因?yàn)橹挥蠬Region Server參與),表的數(shù)據(jù)讀寫(xiě)還可以正常進(jìn)行。因此HMaster下線短時(shí)間內(nèi)對(duì)整個(gè)HBase集群沒(méi)有影響

從上線過(guò)程可以看到,HMaster保存的信息全是可以冗余信息(都可以從系統(tǒng)其它地方收集到或者計(jì)算出來(lái))

因此,一般HBase集群中總是有一個(gè)HMaster在提供服務(wù),還有一個(gè)以上的‘HMaster’在等待時(shí)機(jī)搶占它的位置。

HBase三個(gè)重要機(jī)制

1. flush機(jī)制

1.(hbase.regionserver.global.memstore.size)默認(rèn);堆大小的40%
regionServer的全局memstore的大小,超過(guò)該大小會(huì)觸發(fā)flush到磁盤(pán)的操作,默認(rèn)是堆大小的40%,而且regionserver級(jí)別的flush會(huì)阻塞客戶端讀寫(xiě)

2.(hbase.hregion.memstore.flush.size)默認(rèn):128M
單個(gè)region里memstore的緩存大小,超過(guò)那么整個(gè)HRegion就會(huì)flush,

3.(hbase.regionserver.optionalcacheflushinterval)默認(rèn):1h
內(nèi)存中的文件在自動(dòng)刷新之前能夠存活的最長(zhǎng)時(shí)間

4.(hbase.regionserver.global.memstore.size.lower.limit)默認(rèn):堆大小 * 0.4 * 0.95
有時(shí)候集群的“寫(xiě)負(fù)載”非常高,寫(xiě)入量一直超過(guò)flush的量,這時(shí),我們就希望memstore不要超過(guò)一定的安全設(shè)置。在這種情況下,寫(xiě)操作就要被阻塞一直到memstore恢復(fù)到一個(gè)“可管理”的大小, 這個(gè)大小就是默認(rèn)值是堆大小 * 0.4 * 0.95,也就是當(dāng)regionserver級(jí)別的flush操作發(fā)送后,會(huì)阻塞客戶端寫(xiě),一直阻塞到整個(gè)regionserver級(jí)別的memstore的大小為 堆大小 * 0.4 *0.95為止

5.(hbase.hregion.preclose.flush.size)默認(rèn)為:5M
當(dāng)一個(gè) region 中的 memstore 的大小大于這個(gè)值的時(shí)候,我們又觸發(fā)了region的 close時(shí),會(huì)先運(yùn)行“pre-flush”操作,清理這個(gè)需要關(guān)閉的memstore,然后 將這個(gè) region 下線。當(dāng)一個(gè) region 下線了,我們無(wú)法再進(jìn)行任何寫(xiě)操作。 如果一個(gè) memstore 很大的時(shí)候,flush 操作會(huì)消耗很多時(shí)間。"pre-flush">

6.(hbase.hstore.compactionThreshold)默認(rèn):超過(guò)3個(gè)
一個(gè)store里面允許存的hfile的個(gè)數(shù),超過(guò)這個(gè)個(gè)數(shù)會(huì)被寫(xiě)到新的一個(gè)hfile里面 也即是每個(gè)region的每個(gè)列族對(duì)應(yīng)的memstore在flush為hfile的時(shí)候,默認(rèn)情況下當(dāng)超過(guò)3個(gè)hfile的時(shí)候就會(huì)對(duì)這些文件進(jìn)行合并重寫(xiě)為一個(gè)新文件,設(shè)置個(gè)數(shù)越大可以減少觸發(fā)合并的時(shí)間,但是每次合并的時(shí)間就會(huì)越長(zhǎng)

2. compact機(jī)制

把小的storeFile文件合并成大的HFile文件。
清理過(guò)期的數(shù)據(jù),包括刪除的數(shù)據(jù)
將數(shù)據(jù)的版本號(hào)保存為1個(gè)。

看完上述內(nèi)容,你們掌握HBase 的底層原理是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

文章題目:HBase的底層原理是什么
文章位置:http://muchs.cn/article48/pdjsep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈用戶體驗(yàn)、動(dòng)態(tài)網(wǎng)站App設(shè)計(jì)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化