天天看點

大資料之HBASEN内部詳解

大資料之HBASEN内部詳解

hregionmaster:

一台伺服器隻能個hrs服務==hrs的單元是一台伺服器 或者hrs的單元是一個節點

Hregion:

大多數情況下,一個Hregion代表一張表的一部分的資料(當一張表隻有一個region的時候,就是代表整個表的資料内容)

store:一個region含有多個ms,一個master代表一個列族當中的資料,

Store中存儲的就是一個一個單元格的資料内容,也就是cell,所有真實的資料,最終就是在store中。

hbase的底層存儲是hdfs,由于資料量大,如果單條寫入,hdfs的效率會非常差,是以采用批量存入的方式來存儲到hdfs——————–Memstore

Menstore:資料最開始進入的地方,就是menstore,也就是記憶體當中的資料,

由于Menstore中的資料是存在記憶體中,可能會出現資料丢失的可能,是以當Memstore中的資料達到一定量的時候,将資料持久化到storefile,

Storefile:将資料封裝成一個一個hfile,Storefile其實是一個邏輯檔案

Hfile:真正往hdfs寫的一個一個的資料單元,,存儲資料的實體檔案

什麼時候産生storefile:當Memstore中的資料達到一定量的時候,資料持久化寫入到storefile中,形成一個一個的hfile

為什麼資料最開始進入memstore,積累到一定的量的時候,再進入hfile?

答:速度快 資料寫入記憶體和記憶體中讀資料,都會很快

Hlog:

由于存儲資料的流程是:當Memstore中的資料達到一定量的時候,資料持久化寫入到storefile中,假如資料在達到一定的量之前,還未寫入storefile中,此時發生意外,資料很有可能會丢失,

為什麼還有hlog???

防止memstore當中的資料丢失

Hlog的資料,是直接寫入到hdfs中的

為什麼不直接寫入到hdfs中,而是先寫入到menstore,并且還要寫入到hlog?

時間:資料寫入memstor中的時間比hlog直接寫入hdfs短

但是:資料寫入到hdfs結束時,兩者的時間會不一樣,因為資料寫入有rowkey的預設排序歸規則,也就是字典排序,由于寫入的資料,不能确定與原來的資料相比較大小排序,是以需要在memstore中查找,插入進行排序

若ms中的資料丢失,如何恢複?

Hlog直接将需要恢複的資料,資料寫入memstore中,memstore進行排序操作,hfile再寫入hdfs

什麼時候才會使用hlog中的資料?

當記憶體中memstore資料丢失,平時不會使用hlog

不同的版本對hlog寫入資料有不同的說明,最新:

Hlog的資料一直直接追加到hdfs,不排序

表的最終的存儲的地方是按照region來分的

一個region涵蓋多個列族

為什麼一個store中有很多個storefile?

每寫入一次,會寫入多個hfile,

每重新整理一次,就會形成一個一個的hfile檔案

當log和memstore中的資料都寫好以後,才傳回給使用者,資料完成

資料先到hlog,再到memstore

一張表的資料到底是在一個regionserver裡面還是多個?

多個

當一張表,region超過1以後,就會将region的資料去做負載均衡的操作,

負載均衡的好處:

1.寫資料:假如寫入2條資料,若沒有負載均衡,隻有第一條資料完成以後,第二條資料才能開始,如果做了負載均衡,兩個region同時開工,并行方式寫資料

2.讀資料:同時讀取兩條資料,如果是負載均衡,2個region同時去拿,不需要排隊等待

為什麼将一張表切分成多個

記憶體資料:memstore

硬碟資料:hlog hfile

Hdfs:hadoop分布式檔案管理系統,主要的作用是:在我們的硬碟中,把多塊硬碟同時做相應的存儲和查詢

Region和Region伺服器RegionServer:

表在行方向上,按照行鍵(rowkey)範圍劃分成若幹的Region

每個表最初隻有一個region,當記錄數增加到超過某個門檻值時,開始分裂成兩個region(針對預設的建立方式),也可以采用預分期的方式,建立表時就設定region的數量、範圍

實體上所有資料存放在HDFS,由Region伺服器提供region的管理

一台實體節點隻能跑一個HRegionServer

一個Hregionserver可以管理多個Region執行個體和多個HLOG:

老版本的Hregionserver:多個region、一個hlog

新版本的Hregionserver:一個region就對應一個hlog

一個Region存放多個資料的Store(代表一個列族的資料)

Hmaster作為總控節點

Zookeeper負責排程 Zookeeper是一個單獨的産品,不屬于habse

Hbase沒有副本機制,因為所有的資料都會存儲在hdfs,是以hdfs系統采用了多少個副本數,hbase同樣有多少個副本,包括habse的中繼資料資訊表,hbase:meta表,也會存儲在hdfs中,是以,隻有hdfs存在,hbase就不會出現資料丢失的可能

HLog:

1.用于災難恢複—–記憶體中也就是memstore當中的資料存在丢失

2.預寫式日志,記錄所有更新操作,操作先記錄進日志,資料才會寫入

Wals: 預寫式日志 hlog存儲

大資料之HBASEN内部詳解

在配置hbase的分布式的時候,有root.dar這個配置,作用就是将我們hbase的資料,放到hdfs中,50070可以檢視,

WALS這個目錄就是hlog存儲資料的位置目錄

大資料之HBASEN内部詳解
大資料之HBASEN内部詳解
大資料之HBASEN内部詳解
大資料之HBASEN内部詳解

Memstore與storefile:

1.一個region由多個store組成,每個store包含一個列族的所有資料

2.Store包括位于記憶體的memstore和位于硬碟的storefile

3.寫操作先寫入memstore,當memstore中的資料量達到某個門檻值,Hregionserver會啟動flashcache程序寫入storefile,每次寫入形成單獨一個storefile(也就是hfile)

4.當storefile檔案的數量增長到一定門檻值後,系統會進行合并,在合并過程中會進行版本合并和删除工作,形成更大的storefile

5.當storefile大小超過一定門檻值後,會把目前的region分割為兩個,并由Hmaster配置設定到相應的region伺服器,實作負載均衡

6.用戶端檢索資料時,先在memstore找,找不到再找storefile

Memstore與storefile存儲在哪裡?存儲在store中

Data

Hbseid

Oldwals:

Memstor與storfile的 區分:

建立一個表

寫一條資料:

此時資料在記憶體中,hdfs中沒有

記憶體中的量,一般是64M 128M

—-=======重新整理表

大資料之HBASEN内部詳解

手動幹預将記憶體的資料不到一定量就立馬寫入到hdfs’中

什麼時候會将記憶體中的資料寫入到hdfs:

1.手動執行flush重新整理操作

2.出現故障之後,hlog的資料寫入到記憶體之後,有些hbase的版本,在ms排序之後。會直接寫成hfile

3.内容大小達到hdfs限定值的時候

是不是所有的hdfs檔案的大小都是一樣的? 答:不是

如何保證我們在讀取的時候是完整的資料呢 ?

答:用戶端檢索資料時,先在memstore找,找不到再找storefile

存儲在記憶體中,因為對于整個同一個store的資料,怎麼才能包含完整的資料呢?包含所有的hfile再加上msmstore的資料,才能形成完整的資料

思考:

新資料和老資料,那個用的多? 新資料

=====得知結論:不管是讀和寫,都是先走memstore

Memstore與storefile:

大資料之HBASEN内部詳解

當我們執行put delete incr等操作時,會先聯系hregionserver,hregionserver會将資料先寫入hlog中,當hlog資料寫完以後,再往具體的hregion中寫入。存儲時就會先進入memstore中,再将我們ms的資料,持久化放到storefile中

用戶端Client:

1.整個HBase叢集的入口(hbase shell、jdbc、)

2.使用HBase RPC機制與HMaster和HRegionserver通信

我們連接配接位址時連接配接的zookeeper的端口,并不是hmaster

3.與HMaster通信進行管理類的操作

4.與HRegionserver通信進行讀寫類操作

當你有讀或者是寫的操作的時候,效需率高的原因之一是因為不需要和hmaster之間通信,而hdfs的讀寫,每次都要和namennode之間通信,擷取相應的路由資訊,才知道往哪個datanode上存儲,而hbase中,隻需找到對應的hregionserver

思考:怎麼知道需要的hregionserver在哪個主機上?

5.包含通路HBase的接口,并維護cache(緩存)來加快對HBase的通路,與HRegionserver互動

底層通信位址:rpc

HBase子產品 – Region :

大資料之HBASEN内部詳解

1.将一個資料表按Key值範圍橫向劃分為一個個的子表,實作分布式存儲。

2.這個子表,在HBase中被稱“ Region”。

3.每一個Region都關聯一個Key值範圍,即一個使用StartKey和EndKey描述的區間。事實上,每一個Region僅僅記錄StartKey就可以了,因為它的EndKey就是下一個Region的StartKey。(每一個region的最後的endkey沒有包含在region)

4.Region是HBase分布式存儲的最基本單元。

Rowkey有什麼要求?特點是什麼?

1.字典排序

2.唯一

Region與RegionServer :

大資料之HBASEN内部詳解

1.RegionServer是HBase的資料服務程序。負責處理使用者資料的讀寫請求。

當我們要執行一個操作的時候,直接找regionserver

2.Region被交由RegionServer管理。實際上,所有使用者資料的讀寫請求,都是和RegionServer上的Region進行互動。

Region包含了所有的資料

3.Region可以在RegionServer之間發生轉移。

什麼時候會發送轉移:故障 轉移時不需要轉移hdfs的資料,隻需要把關聯資訊轉移到新的regionserver

一張表有很多的region組成,這些region可以放到不同的region上去:實作并行化,可以同時多查詢 多寫入

思考:

一個Region包含了一個Startkey和EndKey範圍;

一條使用者資料KeyValue必然屬于一個唯一的Region;

Region由RegionServer來管理,那麼,這個路由信

息儲存在哪裡呢?

Hbase_meta表中

大資料之HBASEN内部詳解

包含:确定表資訊 、确定region資訊、

===是以,這個路由資訊就存在hbase的這張中繼資料表中:habse——meta

Region如何才可以轉移?由誰負責轉移? (master完成操作)

答:某一個regionserver挂掉,移動到另外一台主機上

Region由一個變成2個的時候,通常移動到

另外一台主機上,做負載均衡

當我們插入或者是查詢的時候,是如何定位的

get ‘表名’,’rowkey’

1.1 定位表是否存在

1.2 拿到該張表有哪些region[每一個region在哪一個regionServer上]

1.3 根據我們需要查詢的rowkey,從region的資料當中去判斷,我們需要得到的資料在哪一個regionServer上

1.4 将我們的需求(put、get)交給對應的regionServer去處理

Region分類 :

User Region Meta Region

大資料之HBASEN内部詳解

記錄hbase中繼資料的表:hbase_meta表,随着habse的資料增多,這個中繼資料也會一直增加,我們也需要盡量的讓這個表變的均衡,是以也會産生region,但是這個region我們不能控制,由hbase内部完成

Region分為中繼資料Region以及使用者Region兩類。

Meta Region記錄了每一個User Region的路由資訊。

到底是什麼路由資訊:找的region在哪個regionserver上

讀寫Region資料的路由,包括如下

幾步:

找尋Meta Region位址。

再由Meta Region找尋User Region位址。

關于meta表在版本之前有一定的區分

新版本當中:hbase:meta表--->meta region---->user region
           

老版本 : .ROOT.—>.META.—>user region

1我們找資料的時候,先找.ROOT.表 [不會進行region劃分,隻有一個region,不需要管理region的資訊]

2會将你所找的資料在哪一個.Meta. region的路由發給你。

3在從meta的路由資訊中找到具體User region。

4從userRegion資訊中去找具體的RegionServer

———————–今晚結束,有很多内容比較亂,明天修改内容,晚安———–

繼續閱讀