hregion 分配與定址
1.region 分配
hmaster負責為region 分配region server,乙個region 只能分配給乙個region server。 hmaster中 記錄:
哪些region 已經分配到哪些region server中
哪些region server 可用
哪些region 尚未分配
當hmaster發現有尚未分配的region,並有region server可用時,會向該server傳送請求,server收到請求後對該region提供服務。
region的name:
《表名,startrowkey,建立時間》, 如:quote_data,3,1473384408919
(因此乙個region只能屬於乙個表?乙個表可以有多個 region,但是乙個region只能記錄乙個表的全部或者部分資料???)
(1)0.94- 版本
之前講到,zookeeper中記錄了所有region的定址入口,此處說的是入口(此處入口其實指的是.meta.表的存放位置資訊),不是真正的region位址。真正的位址存放在.meta.表中
hbase中有兩張特殊的表:.meta. 和-root-表,這兩張表跟hbase其它表在訪問上沒有任何區別,只是他們記錄了hbase中的系統資訊。region分配到那個region server是隨機的,因此需要一種機制對region進行定位。
可以將-root-表看成是簡表,.meta.表看成是詳表:
這就是hbase的**定位定址法(最多三次,如果已經在memstore中就不需要再訪問這麼多次了)
(2)0.96+版本
hbase0.96版本後刪除了root 表,因為覺的目的是根據root表獲取meta位址,過程是通過zookeeper獲取root表位址,再根據root表記錄meta表位址進行訪問,還不如和zookeeper通訊一次。新增了namespace,詳細見patch設計。
同時將.meta.表重新命名為:hbase:meta (放在名為hbase的表空間下), 在hbase:meta表中的column family info中增加了一列:seqnumduringopen. 而且rowkey(region 的name )重新定義如下:
《表名,startrowkey,建立時間時間戳+」.」+encode值+」.」> (舊版的不包含encoded值)
如下為hbase:meta表的一條記錄:rowkey=iqm:instrument_common_index,66666660,1474393055082.adcf19159f1116c6e1e194b3d10a7c79., 該記錄的encoded值為: adcf19159f1116c6e1e194b3d10a7c79
startkey,region的開始key,第乙個region的startkey是空字串;
endkey,region的結束key,最後乙個region的endkey是空字串;
encode值,該值會作為hdfs檔案系統的乙個目錄,假設encode值為: da1aec29c13725e29786e920bcc2d7b0 ,存放如下如圖:
用來存放region的資料夾的名字是region name的雜湊值,因為region的name中有startkey,所以可能含有非法字元,所以取它的hash值來作為目錄名稱存放region檔案。
改造後的定址示意圖如下:
複製**
hregion是按照表名+開始/結束主鍵,即表名+主鍵範圍來區分的。由於主鍵範圍是連續的,所以一般用開始主鍵就可以表示相應的hregion了。
不過,因為我們有合併和分隔操作,此時,如果正好在執行這些操作的過程中出現宕機,那麼就可能存在多份表名和開始主鍵相同的資料,這樣的話,只有光靠開始主鍵就不夠了,
這就需要通過hbase的元資料資訊來區分哪乙份才是正確的資料檔案。
為此,為了區分這樣的情況,每個hregion都有乙個』regionid』來標識它的唯一性。所以乙個hregion的表達符,最終是:表名+開始主鍵+唯一id,
即tablename+startkey+regionid。
使用者表的region名中regionid使用時間戳標識的,.meta.表的region名的regionid是直接用數字標記的。
複製**
掌握SDRAM DDR的結構與定址
本系列前面兩篇文章 攻克儲存 sram位址線的連線 和 攻克儲存 儲存晶元的寫遮蔽及擴充套件 已經介紹了sram晶元的位址線連線方法以及儲存晶元的寫遮蔽擴充套件,這兩篇文章基本上是從sram的角度在進行講解和描述,其中許多原理在sdram ddr晶元中也同樣適用,不過,sdram ddr 儲存晶元的...
shuffler 檔案定址與記憶體管理
shuffle 元件 mapoutputtracker 磁碟管理小檔案 1,主 mapoutputtrackermaster 存在於driver 2,從 mapoutputtrackerworker 存在於executor blockmanager 塊管理者 1,blockmanagermaster...
動態分配與靜態分配記憶體
記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...