flush機制hbase是基於
lsm-tree
模型的,所有的資料更新插入操作都首先寫入memstore
中(同時會順序寫
到日誌hlog
中),達到指定閾值之後再將這些修改操作批量寫入磁碟,生成乙個新的hfile檔案,這種設計可以極大地提公升
hbase的寫入效能
,另外,hbase為了方便按照rowkey進行檢索,要求hfile
中資料都按照rowkey進行排序
(字典序
),memstore資料在flush為hfile之前會進行一次排序
,將資料有序化;還有,根據區域性性原理,新寫入的資料會更大概率被讀取,因此hbase在讀取資料的時候首先檢查請求的資料是否在memstore,寫快取未命中的話再到讀快取中查詢,讀快取還未命中才會到hfile檔案中查詢,最終返回merged
的乙個結果給使用者
可見,memstore無論是對hbase的寫入效能還是讀取效能都至關重要。其中flush操作又是memstore最核心的操作,接下來重點針對memstore的flush操作進行深入地解析:首先分析hbase在哪些場景下會觸發flush,然後結合源**分析整個flush的操作流程,最後再重點整理總結和flush相關的配置引數,這些引數對於效能調優、問題定位都非常重要
1)【hbase.regionserver.global.memstore.size
】預設;堆大小的40%
regionserver的全域性memstore的大小,超過該大小會觸發flush到磁碟的操作,預設是堆大小的40%,
而且regionserver級別的flush會阻塞客戶端讀寫
2)【hbase.hregion.memstore.flush.size
】預設:128m
單個region裡memstore的快取大小,超過那麼整個hregion就會flush,
3)【hbase.regionserver.optionalcacheflushinterval
】預設:1h
記憶體中的檔案在自動重新整理之前能夠存活的最長時間
4)【hbase.regionserver.global.memstore.size.lower.limit
】預設:堆大小 * 0.4 * 0.95
有時候集群的「寫負載」非常高,寫入量一直超過flush的量,這時,我們就希望memstore不要超過一定的安全設定。
在這種情況下,寫操作就要被阻塞一直到memstore恢復到乙個「可管理」的大小, 這個大小
就是預設值是堆大小 * 0.4 * 0.95,也就是當regionserver級別的flush操作傳送後,會阻塞客戶端寫,
一直阻塞到整個regionserver級別的memstore的大小為 堆大小 * 0.4 *0.95為止
5)【hbase.hregion.preclose.flush.size
】預設為:5m
當乙個 region 中的 memstore 的大小大於這個值的時候,我們又觸發 了 close.會先執行「pre-flush」操作,
清理這個需要關閉的memstore,然後 將這個 region 下線。當乙個 region 下線了,我們無法再進行
任何寫操作。 如果乙個 memstore 很大的時候,flush 操作會消耗很多時間。"pre-flush" 操作
意味著在 region 下線之前,會先把 memstore 清空。這樣在最終執行 close 操作的時候,flush 操作會很快
6)【hbase.hstore.compactionthreshold
】預設:超過3個
乙個store裡面允許存的hfile的個數,超過這個個數會被寫到新的乙個hfile裡面 也即是每個region的每個列族
對應的memstore在fulsh為hfile的時候,預設情況下當超過3個hfile的時候就會 對這些檔案進行合併
重寫為乙個新檔案,設定個數越大可以減少觸發合併的時間,但是每次合併的時間就會越長
compact機制1)概述:在hbase中每當有memstore資料flush到磁碟之後,就形成乙個storefile,當storefile 的數量達到一定程度後(預設3個),就需要將storefile 檔案來進行compaction操作
2)compact 的作用:
2.1、合併檔案
2.2、清除過期,多餘版本的資料
3.3、提高讀寫資料的效率
3)hbase 中實現了兩種compaction 的方式:minor compaction和 major compaction
這兩種compaction方式的區別是:
3.1、minor compaction 操作只用來做部分檔案的合併操作以及包括minversion=0 並且設定ttl的過
期版本清理,不做任何刪除資料、多版本資料的清理工作
3.2、major compaction 操作是對region 下的hstore 下的所有storefile 執行合併操作,最終的結果
是整理合併出乙個檔案,會清理掉過期資料以及將delete標記刪除,delete標記在此之前會一直存在
4)相關擴充套件知識
4.1、flush '表名'
手動重新整理memstore到storefile
4.2、compact '表名'
手動合併,合併成乙個檔案
4.3、flush 時會刪除資料
flush時會將記憶體中不在版本範圍內的資料全部刪掉,然後再持久化到形成乙個storefile檔案,然後後續的資料會寫入乙個新的storefile檔案
4.3、scan 『abc』, 檢視的是記憶體+本地的資料,根據時間戳排序進行顯示
split機制(引用自1)概述:
hbase split 是乙個很重要的功能,hbase 通過把資料分配到一定數量的 region 來達到負載均衡的。當 region 管理的資料過多時,可以通過手動或自動的方式觸發 hbase split 將乙個 region **成兩個新的子 region,並對父 region 進行清除處理(不會立即清除)
2)split 觸發時機:
hbase 中共有3種情況會觸發 hbase split:
2.1、當 memstore flush 操作後,hregion 寫入新的 hfile,有可能產生較大的 hfile,會判斷是否需要執行 split
2.2、hstore 執行完成 compact 操作後可能產生較大的 hfile,會判斷是否需要執行 split
2.3、hbaseadmin 手動執行 split 命令時,會觸發 split
3)注意事項
3.1、不能對元資料表進行 split
3.2、不能對正在恢復的 region 進行 split
3.3、如果某個 region 存在引用檔案的不能 split
3.4、當 split 執行到將父 region 下線之後,子 region還未建立之前,如果此刻正訪問的是父 region,在客戶端沒有更新 region 位址快取的情況下,會報 notservingregionexception 異常,因此客戶端需要做好重試機制
3.5、split 的完整過程中有個關鍵的時間點是無法回退的點(ponr: point of no return),發生在將 .meta. 表中的父 region 下線之前,如果進入 ponr 之後,由於種種原因更新 .meta. 失敗,需要重啟所在的 regionserver
五 定位詳解
邊偏移 方位名詞 簡單說,我們定位的盒子,是通過邊偏移來移動位置的。定位模式 position 定位模式是有不同分類的,在不同情況下,我們用到不同的定位模式。a.靜態定位 static 了解 b.相對定位 relative 重要 相對定位的特點 務必記住 相對於 自己原來在標準流中位置來移動的 原來...
SELECT 入門詳解
select模型要用的結構和函式如下 fd set,可以理解為檔案控制代碼的乙個集合,sock也可認為是乙個檔案控制代碼。timeval,用來表示時間,結構體中的tv sec表示秒,tv usec表示毫秒。int select int maxfdp,fd set readfds,fd set wri...
Pygame pgu 入門詳解
注 我是乙個剛學python的菜鳥,這幾天做大作業用了一下這個模組,感覺挺有用的,但是感覺找到學習的資料挺少的,所以給大家簡單的介紹一下。直接上圖吧,做完的效果是這樣的 簡單的pgu程式 先簡要介紹一下pgu,其全稱是phil s pygame utilities,是用來增強pygame庫和工具的集...