這邊筆記主要作用就是讓自己更好的深入理解HBase的運行原理,當遇到問題時能高效快捷的鎖定并解決問題。
原理剖析我們有一下幾個目標:
1、HBase的存儲模式
1.1行式存儲與列式存儲的介紹
行式存儲與列式存儲特點:
行式存儲:
行式存儲維護大量的索引,存儲成本比較高,不能做到線性擴展,對于隨機讀的效率非常高。最大的特點就是對事務的支持能力非常好。
列式存儲:
根據(jù)同一列數(shù)據(jù)的相似性原理,對數(shù)據(jù)進行壓縮,存儲成本比較低。列式存儲每一列的數(shù)據(jù)都是分開存儲的,我們在查找不同列的數(shù)據(jù)的時候,可以利用并行查詢的原理,高效的查詢多列的數(shù)據(jù)。而行式存儲是將不同列的數(shù)據(jù)存儲在同一行上的,所以并行查詢是不可能實現(xiàn)的。
行式存儲與列式存儲的應用環(huán)境:
列式存儲應用場景:
》對于單列或者相對少的列,獲取頻率較高,推薦列式存儲。因為如果你只要某列的數(shù)據(jù),那么只需要找某一列存儲位置即可。
》如果是對多列查詢,使用并行處理的查詢也是效率非常高的,這樣的情況也可以使用列式存儲。
》特別是對于大數(shù)據(jù)的環(huán)境,利于數(shù)據(jù)壓縮和擴展,這樣的存儲場景比較多的話,同樣第一個應該考慮的是列式存儲。
》如果你的事務使用率不高、讀取場景的頻率不高、數(shù)據(jù)量非常大這樣的場景也需要列式存儲。
》如果你隨機更新某行頻率不高的話,列式存儲也是不錯的選擇。
行式存儲應用場景:
行式存儲實現(xiàn)了一個關系型數(shù)據(jù)庫的解決方案,如果你的表與表之間有很強的關聯(lián)性,且數(shù)據(jù)量不大的話,使用行式存儲是一個比較好的選擇,可以很容易關聯(lián)查詢數(shù)據(jù)。
》行式存儲最大的優(yōu)勢是聯(lián)機事務處理能力,如果你要存儲消費、轉賬的記錄,你就需要強事務關聯(lián)性。
》但是由于行式存儲線性擴展性不高,需要保證我們的數(shù)據(jù)量存儲不能特別大,如果你的數(shù)據(jù)只有千萬量級的話,考慮使用行式存儲。
》簡單說,行式存儲適合事務型應用場景,列式存儲更適合分析型應用場景。
hbase的列族(列簇)式的存儲
列族的存儲概念:多個數(shù)據(jù)列的組合,hbase表中的每個列都歸屬于某個列族。列族是表的schema的一部分,而列不是,我們在創(chuàng)建一張hbase表的時候,必須要給出列族的名稱,但不需要給出列的名稱。列名一般都以列族名稱作為前綴,訪問控制、磁盤、內(nèi)存的使用統(tǒng)計都是在列族層面進行的,hbase準確的說是列族數(shù)據(jù)庫,而不是列數(shù)據(jù)庫。
列數(shù)據(jù)的屬性:
默認情況下,一列數(shù)據(jù)可以保存三個版本,特別對于聊天這類應用,特別方便。比如標識信息是已讀的還是未讀的。
2、HBase的數(shù)據(jù)表解析
Name:是數(shù)據(jù)表的列族名,在建表的時候必須要提供的,且以后在hbase表的工作過程中,最好不要修改。因為很多屬性都是基于列族進行配置的,如果你修改那么的話,會導致表的結構發(fā)生變化。
Version:是時間版本的個數(shù),這里的b列族就顯式聲明了3個時間版本。
Replication_scope:是hbase0.9版本的時候,加入了一個重要機制,要多副本機制,他的數(shù)據(jù)完整性得到進一步保障。當請求發(fā)送給master的時候,log的日志放入hdfs的同時會進入到Replication的隊列里面,由Slave通過zookeeper去獲取信息寫入到slave節(jié)點的表中,master和slave是主從集群機制。
Compression:數(shù)據(jù)壓縮格式的配置,其中列族b和o都是把壓縮格式設置為了SNAPPY,其實SNAPPY就是一種壓縮格式。
壓縮特性:就是使用cpu資源換區(qū)磁盤資源,對讀寫性能并不會有太大影響,目前hbase支持三種壓縮格式,GZip、LZO、SNAPPY
HBase數(shù)據(jù)存儲目錄
我們在搭建HBase時,需要指定其數(shù)據(jù)存儲目錄,HBase會在指定的目錄中構造需要的目錄結構,之后我們創(chuàng)建數(shù)據(jù)表以及存放數(shù)據(jù)時,也會存放在對應的目錄中,我們下面就介紹下,hbase數(shù)據(jù)存儲目錄結構。
我這里的目錄結構是存放在hdfs上的,如下圖,系統(tǒng)級別的目錄如下:
.tmp:當對表做創(chuàng)建或刪除操作時,會將表移動到.tmp目錄下面,然后再去做處理操作他是一個臨時交換的表目錄,臨時存放一些當前需要修改的數(shù)據(jù)結構。
WALs:它其實是一個預寫日志,它是被HLog實例管理的WAL文件,這里可以簡單的理解為hbase數(shù)據(jù)庫系統(tǒng)的操作日志文件。
archive:它存儲表的歸檔和快照,hbase在做分隔或者是合并操作完成之后,會將hfile文件移動到archive目錄中,然后將之前的hfile刪除掉。這個目錄是有master中的定時任務定期去處理。
corrupt:這個目錄用于存放損壞的日志文件,他一般是空的,如果他不為空代表我們的系統(tǒng)出現(xiàn)了些問題,有些日志文件可能被損壞了。
data:它是hbase存儲數(shù)據(jù)的核心目錄,系統(tǒng)表和用戶表數(shù)據(jù)都存儲在這里,他是非常重要的目錄
hbase.id:hbase在運行起來之后,就會產(chǎn)生集群中的唯一id,是用來標識hbase進程用的。
hbase.version:它表明了hbase的文件格式、版本信息,其實就是表明了hfile的文件版本信息。
oldWALs:當WALs中的log文件被持久化后,日志就不被需要了,就會被移動到oldWALs目錄中等待刪除。
用戶級別的目錄:
HBase的元信息表
Row Key:其實Meta Table也是一個普通的hbase數(shù)據(jù)表,他的結構跟普通的表結構是差不多的。不過他的Row Key和Value有特殊意義:Row Key它包含三個部分,對三個部分進行組合得到一個Row Key,其中table為region table、region Start key、以及region Time,這里的time為存儲數(shù)據(jù)的最早時間。由于Mata Table中包含Start key,所以它很容易找到對應的region,最后找到對應的數(shù)據(jù)。
Value:value最終指向的是Region Server,它其實保存的是Region Server的地址。表中最主要的列族是info,列族中包含三個主要的列,都是屬于value的,三個屬性列中第一個屬性列是regioninfo,第二個屬性列是server,包含了Region Server的服務器地址和端口,第三個屬性列是Start code,它包含了Region Server的start time。
Meta Table表的值,會發(fā)生變化嗎?
答案是可定的,它的值是會發(fā)生變化的,當region進行分割、合并、禁用、啟用、刪除等會導致region重新分配,或者region server服務節(jié)點掛掉,也會導致region重新分配,這時候meta表的數(shù)據(jù)會及時更新,這個動作是由master發(fā)起的,正是由于它能夠及時的更新,才能保證客戶端根據(jù)mate表訪問到的數(shù)據(jù)是存在的。其實理解了meta table就理解了hbase存儲數(shù)據(jù)的機制,其實mate Table就是hbase存取數(shù)據(jù)的第一級索引,是最重要的系統(tǒng)表。
3、HBase的存儲設計(核心)
》什么是LSM樹?
他的概念是日志結構合并樹,是由兩個或兩個以上存儲數(shù)據(jù)的結構組成的,每一個數(shù)據(jù)結構各自對應自己的存儲介質。但從概念上不太好理解,我們從LSM樹的簡易模型來介紹,相對好理解些。
LSM樹的簡易模型是由兩個樹狀結構組成,這兩個樹分別是C0和C1。C0比較小,并且全部存儲于內(nèi)存之中,而C1則存儲于磁盤之上,一條新的記錄先從C0中插入,插入時會判斷C0中的內(nèi)存閥值,如果超出了閥值,C0中的某些數(shù)據(jù)片段會被遷移并合并到C1的樹上。由于合并排序算法是批量的且是順序存儲,所以說速度是非常快的。當然這只是簡易模型,在實際應用時,是多余兩層樹結構的。
》LSM思想在HBase中的實現(xiàn),C0級用戶數(shù)據(jù)到達了region server為了加速隨機寫,region server不會將數(shù)據(jù)直接刷寫到硬盤里面,是寫入log和memorye,寫日志的原因是因為內(nèi)存中的數(shù)據(jù)是不穩(wěn)定的,寫入內(nèi)存中的數(shù)據(jù)在機器宕機或重啟的情況下,就會丟失,所以寫入log是保證高可用。
》當C0層數(shù)據(jù)到達閾值時,會被遷移至C1層數(shù)據(jù),并將C0層的多個小文件合并成多個大文件,當C1層的數(shù)據(jù)達到閥值時,異步線程啟動,多路合并多個文件刷到磁盤當中,形成一個最終的大文件。這就是HBase借鑒的LSM存儲思想,從而達到了高效的存儲性能,后續(xù)我們會繼續(xù)詳細介紹每個層的實現(xiàn)模塊。
HBase存儲設計模塊簡介
Region:一個RegionServer能包含很多個Region,Region是存儲用戶數(shù)據(jù)的最小單元,每個Region中包含的數(shù)據(jù)都是互斥的,存儲用戶各個行的數(shù)據(jù)。
Stroe:Region里包含了很多Store,Store對應于HBase表的列族,我們定義HBase表時,為表定義了多少個列族,那么每個Region中就包含了多少個Stroe。
HLog:一個RegionServer中包含唯一的一個HLog實例,HLog用于實現(xiàn)預寫日志,用戶存儲的數(shù)據(jù)最先會保存在這里,目的就是實現(xiàn)整個系統(tǒng)的高可用,在系統(tǒng)宕機或崩潰的時候回放日志,恢復到原始的狀態(tài)。
MemStore:Store中包含了一個MemStore,它是內(nèi)存式的數(shù)據(jù)結構,用戶數(shù)據(jù)進入Region之后,先會刷寫到MemStore中,當MemStore的數(shù)據(jù)裝滿之后,會把數(shù)據(jù)刷寫到StoreFile中。StoreFile又會封裝成HFile,最后再去往HDFS中真正刷寫成HFile文件。MemStore其實是一個Store的內(nèi)存緩沖服務,用戶數(shù)據(jù)在寫入到HLog之后第二步會寫入到MemStore中。
Hlog和MemStore就構成了LSM的第一級結構Level0
StoreFile:它其實是在MemStore數(shù)據(jù)裝滿以后,由MemStore刷寫出來的文件,他是HFile的簡單封裝。
HFile:它是HBase存儲數(shù)據(jù)的一個組織形式,我們所保存的數(shù)據(jù),在HBase中的最終存儲格式就是HFile。我們可以簡單的認為我們的數(shù)據(jù)都存儲在HFile中。
StoreFile和HFile這兩個模塊構成LSM中的第二級結構Level1,他實現(xiàn)了內(nèi)存數(shù)據(jù)的持久化。
HBase Region解析
》什么是Region?
1、每一個Region都會存儲于一個確定的RegionServer上,不會出現(xiàn)同一個region在兩個RegionServer上,他們之間的數(shù)據(jù)是互斥的關系。HBase表在RowKey的方向上分配了多個Region,他是hbase分布式存儲和負載均衡的最小單元。Region按照大小進行切分,每個表一行只有一個Region,所以說一行數(shù)據(jù)不可能分散在多個Region上面。當不斷的插入,導致Region的存儲或者是某個列族到達一定預值之后,Region會被水平拆分為兩個Region,Region在RegionServer運行過程中,可能會出現(xiàn)移動,這是Master的負載均衡策略。或者某一個RegionServer掛了或宕機了,存儲于它之上的所有Region都會把Master安排到其他的RegionServer上面。
2、每個Region都有三個重要的屬性信息來標識他們,第一個TableName(表的名稱)第二個是Start_RowKey(表示從哪個rowkey開始的),所有的rowkey都是排序的,所以根據(jù)rowkey容易檢索數(shù)據(jù)。第三個是CreateTime(表示Region中最早的一條數(shù)據(jù)插入的時間)。
》Region有哪些特點?
1、Region是HBase中分布式存儲和負載均衡的最小單元,不同的Region分布到不同的RegionServer上,但并不是存儲的最小單元,存儲的最小單元是HFile。
2、Region的數(shù)量問題,如果RegionServer中Region的數(shù)量過多就會導致性能下降,region的數(shù)量太少就會妨礙可擴展性,降低并行能力,導致機器壓力不夠分散。所以有個設計原則,Region的數(shù)量一定不能低于集群中節(jié)點的數(shù)量。
3、Region的拆分策略,Region的拆分操作是不可見的,因為Master不會參與其中,那么RegionServer拆分Region的步驟是什么呢?其實RegionServer是先將要拆分的Region下線,然后對他進行拆分,然后將子Region加入到Meta Table表的元信息中。之后再將他們加入到原本的RegionServer上面。最后同步到Master上面。
總結:Region實現(xiàn)了HBase的負載均衡,所以我們在對表進行設計,特別是對RowKey的設計上,要花一點功夫,盡量讓數(shù)據(jù)分散到多臺RegionServer上,避免某個節(jié)點成為熱點,這樣才能高效的發(fā)揮HBase的性能。
HBase HFile 解析
Store:一個Store包含了一個MemStroe和0個或多個StoreFile。其中MemStroe是一個內(nèi)存數(shù)據(jù)結構,StoreFile是文件系統(tǒng)級別的數(shù)據(jù)結構。Store是由Region去管理的,用于維護列族的數(shù)據(jù)。對于一個HBase的表,設計了幾個列族,那么對于任何一個Region而言就會有幾個Store。這也是HBase被稱為列族式數(shù)據(jù)庫的原因。他會把一起訪問的數(shù)據(jù)放在一個Stroe里面。同時HBase會以Store大小來判斷,是否需要去切分Region。
MemStore:它是一個內(nèi)存數(shù)據(jù)結構,它保存修改的數(shù)據(jù),即用戶put、delete等請求,因為將數(shù)據(jù)存儲在內(nèi)存之中,所以需要有預值控制,到達預值,就刷寫到文件系統(tǒng)。默認這個預值是64M,為了保證讀寫線程不被阻塞到,HBase提供了專門的Flush異步線程,去實現(xiàn)數(shù)據(jù)的刷寫。
StoreFile:它是MemStore中的內(nèi)存數(shù)據(jù)刷寫到文件之后形成的StoreFile,它底層是以HFile的格式保存的。
HFile:HFile文件他是HBase存儲數(shù)據(jù)文件的最基本的存儲形式,他底層是HDFS的二進制格式文件。他是用戶數(shù)據(jù)的實際載體。它存儲著Key-Value這樣的數(shù)據(jù)。
》Scanned block section:它是在順序掃描HFile的時候,這個部分的所有數(shù)據(jù)塊將會被讀取,用戶數(shù)據(jù)存儲于這個部分之中。其實用戶數(shù)據(jù)確切的說就存儲在Data Block中
》Nonscanned block section:它是在順序掃描HFile的時候,這些數(shù)據(jù)塊不會被讀取到,主要包含一些Meta block(元數(shù)據(jù)塊)它是在訪問用戶數(shù)據(jù)的時候不會被掃描到的。
》Load-on-open section:這部分數(shù)據(jù)在HBase Region Server啟動的時候,會加載到內(nèi)存中,主要是HFile元數(shù)據(jù)相關的信息。
》Trailer:這部分記錄了HFile的基本信息,各個部分的偏移量,尋址信息,可以簡單的理解它也是HFile元數(shù)據(jù)的一部分。
HBase Data Block
》Data block是HBase中數(shù)據(jù)存儲的最基本單元,它實際存儲用戶的數(shù)據(jù)結構,他實際上存儲著key-value數(shù)據(jù),key-value數(shù)據(jù)結構是HBase中的核心。每個數(shù)據(jù)都是以key-value格式在HBase中存儲的。接下來我們詳細的介紹下Data block的key-value結構。如下圖:
》上圖可知,Data Block每一個數(shù)據(jù)都是一個key-value,而每一個key-value包含四個部分
Key Length:key的長度,Value Length:value的長度,他們兩個主要起到控制偏移的作用。最后再保存key和對應的value。
我們發(fā)現(xiàn)key也有多部分組成,分別是:
Row Length:行鍵的長度、Row:行鍵、ColumenFamily Length:列族的長度、ColumnFamily:列族、ColumnQualifier Length:列描述符的長度(這些所有以length命名的數(shù)據(jù)模塊其實是起到偏移控制的作用)、ColumnQualifier:列描述符、Timestamp:時間戳即版本、KeyType:墓碑標記,包含put、delete、deleteColumn、deleteFamily。什么意思呢?
》我們之前介紹過,HBase的插入性能非常高,但是從來沒有介紹過,HBase刪除數(shù)據(jù)的時候是怎么做的。這里賣個關子,問下:當你執(zhí)行delete的時候,HBase會將存儲的數(shù)據(jù)立即刪除嗎?答案:是不會的,這里有個非常重要的細節(jié)就是,內(nèi)存數(shù)據(jù)一旦刷寫成HFile文件之后,數(shù)據(jù)將不可做修改,也就是說,當用戶存儲進來的數(shù)據(jù)被保存成HFile之后都不能被修改。
》那這時候如果我么確實要刪除數(shù)據(jù)怎么辦呢?
這時候KeyType就起作用了,用戶正常插入數(shù)據(jù)使用put,用戶刪除數(shù)據(jù)使用delete,delete代表刪除整行數(shù)據(jù),deleteColumn代表刪除對應的列數(shù)據(jù),deleteFamily代表刪除一個列族之下的數(shù)據(jù)。其實這就是給數(shù)據(jù)打上一個標記,這里叫做墓碑標記,標識著這個數(shù)據(jù)被刪除掉了。當我們再對HBase這張表進行掃描的時候,這些被標記的列或行就不會被掃描到了。在后續(xù)的運行過程中,HBase會在某個時間點,定時清理掉這些被標記的數(shù)據(jù),并不是在執(zhí)行delete語句的時候,就立即刪除。
HBase WAL解析
》WAL最重要的功能就是災難恢復,類似于mysql的binlog,它記錄的所有的數(shù)據(jù)改動,一旦服務器崩潰,通過重放log,可以恢復到崩潰之前的狀態(tài)。所以當對Region Server寫入數(shù)據(jù)的時候,如果寫入WAL失敗,整個操作將被認為是失敗的。由上圖可以看出,所有的用戶寫入數(shù)據(jù)都會經(jīng)過RegionServer的log syncer,然后寫入到Hlog之中,然后在寫入到Region之中。
》WAL解決了hbase的什么問題?
1、它解決了HBase的高可用(HA)的問題,就是說當系統(tǒng)故障的時候,可以通過日志重放,恢復到故障前的狀態(tài)。
2、它實現(xiàn)了HBase的replaction,遠程備份功能。具體實現(xiàn)是,當客戶端觸發(fā)一個對數(shù)據(jù)改動的操作,比如put、delete操作,這些修改操作被封裝在一個key-value實例里面,然后通過rpc調用發(fā)送給RegionServer,RegionServer接收到調用后,先去寫log,再去寫Region。從而實現(xiàn)這個遠程備份的方案。可以簡單的理解為,遠程備份其實就是講log同步到備份的目標機器上去。
》HLog的解析
WAL是通過HLog模塊實現(xiàn)的,我們需要對HLog的內(nèi)在原理做個介紹,便于我們理解HBase日志運行原理。
》HLog是什么?
HLog是實現(xiàn)WAL的類,一個Region Server對應唯一一個HLog的實例,當Region初始化的時候,HLog會作為一個參數(shù),傳遞給HRegion的構造函數(shù),這樣HRegion就獲取到了HLog的引用,可以實現(xiàn)日志打印。
》HLog的工作步驟
HLog最核心的是調用它的append方法,完成對日志記錄的追加寫入。出于對性能的考慮,put、delete、increatement有一個開關函數(shù)setWriteToWAL(boolean flag),傳遞的是boolean類型的值,當設置為false時,則會禁用WAL。HLog通過序列化的number去追蹤數(shù)據(jù)的改變。
》HLogKey
》HLogSyncer
HLogSyncer是日志同步刷寫類,數(shù)據(jù)是以keyvalue的形式到達RegionServer,寫入WAL的操作默認是直接寫入到文件系統(tǒng)里面的,有些時候為了性能,會暫時將日志保存在內(nèi)存中,這時候就需要有個專門負責將這部分日志刷寫到磁盤的機制,而HLogSyncer就擔此重任。刷寫日志有兩種方式,一種是達到內(nèi)存預值時去刷寫,另一種是定時去刷寫。
》HLogRoller
log的滾動間隔時間可以通過配置文件設置,默認是一個小時滾動一個新文件,所以HBase系統(tǒng)運行一段時間之后,會產(chǎn)生一大堆的log文件需要維護,HLogRooller作為后臺線程去運行。
它主要實現(xiàn)了兩個功能:
第一、特定的時間去滾動日志,形成新的日志文件,避免單個日志文件過大。
第二、根據(jù)HLog的序列化number對比已經(jīng)持久化的HFile的序列號,刪除舊的不需要的日志。
HBase日志體系,總體的模塊比較多,但并不復雜,而且實現(xiàn)了HBase非常多的重要特性,這在以后我們自己在設計系統(tǒng)的時候也可以好好借鑒一下。不僅僅追求系統(tǒng)的高效,還要保證系統(tǒng)的高可用。
HBase Compaction(合并)解析
》什么是Compaction?
Commpaction會從一個Region的Store中,選擇一些HFile文件進行合并,合并的原理很簡單。先從這些待合并的文件中讀出key-value數(shù)據(jù),再按照由小到大排列后寫入到一個新的HFile文件中去。之后這個新的文件就會取代之前的文件對外提供服務。
》為什么需要Compaction操作?
隨著系統(tǒng)不停的刷寫,會導致存儲目錄中保存過多的存儲目錄文件,文件太多會導致維護困難而且不利于查找,會大大降低數(shù)據(jù)查詢的效率。所以需要有這樣一種文件合并機制,將數(shù)據(jù)文件由多變少。
假如,你有十個數(shù)據(jù)文件,如果你想從這十個文件中找出一條數(shù)據(jù),那么你需要依次對這10個文件進行打開-關閉的操作。每次對文件進行io的時候是效率非常低的,尤其是打開這個動作非常耗費資源。當我們合并成一個文件時,那么我們就可以節(jié)省下來其他9次打開的資源浪費以及時間消耗,從而達到高效查找的目的。
》Compaction的分類
第一類:MinorCompaction
這種合并類型是選取一些小的、相鄰的StoreFile,將他們合并成多個更大一些的StoreFile。
第二類:MajorCompaction
1、這種合并類型是將所有的StoreFile合并成一個較大的StoreFile,也就是你Store中不論有多少個StoreFile都無所謂,他只將所有的StoreFile合并成一個大的StoreFile。
2、這個過程還會清理三類沒有意義的數(shù)據(jù),
第一類:是被刪除的數(shù)據(jù)即KeyType類型為delete類型的數(shù)據(jù)。
第二類:TTL過期的數(shù)據(jù),也將會被刪除。
第三類:版本號超過設定版本號的數(shù)據(jù),也將會被刪除。比如說當你的列族設定版本個數(shù)是3,那么當你第四次存放數(shù)據(jù)的時候,也會保存在系統(tǒng)中,但是當大合并到來的時候,你最早存入的那個版本的數(shù)據(jù)將會被刪除。
一般情況下,MajorCompaction的合并操作耗時比較長,會消耗大量的系統(tǒng)資源,對上層業(yè)務有比較大的影響。因此線上業(yè)務都會講自動觸發(fā)的MajorCompaction功能關閉掉,改為手動在業(yè)務低峰期的時候觸發(fā)。同事這也是一個非常大的系統(tǒng)優(yōu)化點。
》Compaction的觸發(fā)時機
觸發(fā)compaction的因素很多,最常見的因素有三種:
第一種:MemStore Flush觸發(fā)
Compaction操作源頭就是來自于Flush操作,也就是內(nèi)存中的數(shù)據(jù)Flush到硬盤上。MemStore Flush會產(chǎn)生HFile文件,文件越來越多就需要Compaction。因此在每次執(zhí)行完Flush操作之后,都會對當前Store中的文件進行判斷,一旦文件的數(shù)量超過預值就會觸發(fā)一個Compaction。這里需要注意的是,Compaction都是以Store為單位進行的。而在Flush觸發(fā)條件下,這個Region的所有Store都會執(zhí)行Compaction,所以會在短時間內(nèi)執(zhí)行很多次Compaction。
第二種:Compaction checker(后臺線程周期性的檢查)觸發(fā)
它會定期的觸發(fā)檢查,當前store是否需要執(zhí)行compaction,它和Flush有點不同的是,這個線程會優(yōu)先檢查文件數(shù)是否大于預值,一旦大于就會觸發(fā)compaction。如果不滿足他就會接著檢查是否滿足MajorCompaction大合并的條件。簡單來說,如果當前Store中HFile的最早更新時間,早于某個值,這個值就叫Mc-time,到了就會觸發(fā)大合并。HBase通過Mc-time這種機制來定期刪除過期數(shù)據(jù),Mc-time是個浮動值默認取值區(qū)間是
[7-7*0.2,7+7*0.2],七天時間進行一次大合并。
7對應的配置屬性:hbase.hregion.majorcompaction,如果想要禁用大合并,只需要在這里設置為0即可。
0.2對應的配置屬性:hbase.hregion.majorcompaction.jitter
第三種:手動觸發(fā)
1、由于擔心某些線上業(yè)務,會受到大合并的影響,因此會選擇低峰期手動完成觸發(fā)。
2、由于開發(fā)人員改變了數(shù)據(jù)表結構之后,希望立刻生效,執(zhí)行下手動觸發(fā)MajorCompaction,讓數(shù)據(jù)清理合并下,讓業(yè)務重新生效。
3、HBase管理員發(fā)現(xiàn)硬盤容量不夠的前提下,會手動觸發(fā)MajorCompaction,這樣會刪除大量的過期數(shù)據(jù)。