本篇內容主要講解“Hbase compact和split跟蹤舉例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Hbase compact和split跟蹤舉例分析”吧!
為了準確了解HBASE內部工作原理,我們需要做一些測試,在大量數據插入的情況下,HBASE內部到底有什么表現? 比如插入速度, hstore compact,split等相關活動,了解了這些才能更好的維護HBASE系統本身。
此次測試會有幾輪,所以測試到哪里就寫到哪里,我隨便找了一張大概120W來的表,我會寫一個mapreduce任務,來讀取這張表,再寫入另外一個測試表: test2, 沒有選擇更大的表是因為畢竟整個拷貝是需要時間,通常20分鐘-30分鐘,太大的表,不太利于跟蹤。 拷貝過程,HBASE會針對此表有相關的活動日志,依據日志,我們來看看HBASE到底在干什么。
測試開始, 下面是我的mapreduce任務進度,reduce開始的時間,實際就是寫入HBASE的時間,那么從11:36開始,應該HBASE在插入
17/06/29 11:31:41 INFO mapreduce.Job: map 71% reduce 0%
17/06/29 11:32:07 INFO mapreduce.Job: map 81% reduce 0%
17/06/29 11:32:08 INFO mapreduce.Job: map 86% reduce 0%
17/06/29 11:32:19 INFO mapreduce.Job: map 86% reduce 29%
17/06/29 11:36:07 INFO mapreduce.Job: map 95% reduce 29%
17/06/29 11:36:11 INFO mapreduce.Job: map 96% reduce 29%
跟蹤日志過程
1. 11:36分日志顯示flush一個memstore,大小為129M, 這個和設置的參數值是一樣的,hbase.hregion.memstore.flush.size=128M, flush之后,會生產一個hfile,實際文件大小為48.9M, 另外注意最后的compaction requested=false
2017-06-29 11:36:34,505 INFO org.apache.hadoop.hbase.regionserver.HRegion: Flushing 1/1 column families, memstore=129.14 MB
2017-06-29 11:36:36,157 INFO org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher: Flushed, sequenceid=54, memsize=129.1 M, hasBloomFilter=true, into tmp file hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/.tmp/047e3c0dad4940788b97b203495c1536
2017-06-29 11:36:36,182 INFO org.apache.hadoop.hbase.regionserver.HStore: Added hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/cf/047e3c0dad4940788b97b203495c1536, entries=644303, sequenceid=54, filesize=48.9 M
2017-06-29 11:36:36,185 INFO org.apache.hadoop.hbase.regionserver.HRegion: Finished memstore flush of ~129.14 MB/135411576, currentsize=36.78 MB/38569776 for region test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94. in 1681ms, sequenceid=54, compaction requested=false
2. 第二次刷新, 注意最后的compaction requested=false,
2017-06-29 11:36:41,766 INFO org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher: Flushed, sequenceid=107, memsize=128.7 M, hasBloomFilter=true, into tmp file hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/.tmp/57d95a2f46454109b336161e9ae9bc14
2017-06-29 11:36:41,786 INFO org.apache.hadoop.hbase.regionserver.HStore: Added hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/cf/57d95a2f46454109b336161e9ae9bc14, entries=636412, sequenceid=107, filesize=49.5 M
2017-06-29 11:36:41,788 INFO org.apache.hadoop.hbase.regionserver.HRegion: Finished memstore flush of ~128.74 MB/134994216, currentsize=26.27 MB/27549840 for region test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94. in 1318ms, sequenceid=107, compaction requested=false
3. 第三次刷新, 此時日志明確的表示,要進行合并, 當有3個HFILE的時候,HBASE會合并,這是因為默認我們的參數hbase.hstore.compactionThreshold=3 ,此時發生的是minor合并
2017-06-29 11:36:48,023 INFO org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher: Flushed, sequenceid=160, memsize=128.7 M, hasBloomFilter=true, into tmp file hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/.tmp/1fa335caa3144c8da5e0ca7697f551cf
2017-06-29 11:36:48,041 INFO org.apache.hadoop.hbase.regionserver.HStore: Added hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/cf/1fa335caa3144c8da5e0ca7697f551cf, entries=636412, sequenceid=160, filesize=49.9 M
2017-06-29 11:36:48,054 INFO org.apache.hadoop.hbase.regionserver.HRegion: Finished memstore flush of ~128.74 MB/134994216, currentsize=31.53 MB/33059808 for region test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94. in 1343ms, sequenceid=160, compaction requested=true
跟蹤HFILE合并, 日志顯示,3個文件合并在一起,一共148M,花費的時間為3秒,很顯然minor合并的速度還是很快的。
2017-06-29 11:36:48,058 INFO org.apache.hadoop.hbase.regionserver.HStore: Starting compaction of 3 file(s) in cf of test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94. into tmpdir=hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/.tmp, totalSize=148.3 M
2017-06-29 11:36:51,792 INFO org.apache.hadoop.hbase.regionserver.CompactSplitThread: Completed compaction: Request = regionName=test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94., storeName=cf, fileCount=3, fileSize=148.3 M, priority=7, time=17006286308699473; duration=3sec
4. flush
5. flush
6. 要求合并(此時第一個合并之后只有一個文件,加上flush的2個文件,一共3個,達到了合并條件)
7. 要求split (split之后為2個文件)
8. flush
9. 要求合并(之前split為2個文件,加上flush的一個為3個文件,達到合并條件)
10. 要求split
以上是根據日志顯示得到的一個跟蹤過程。 我們可以看到minor compact速度很快,根據參數設置,每3個文件就會合并一次。 至于major compact由hbase.hregion.majorcompaction來控制,
默認是7天時間,0表示關閉major compact. 所以從理論來講,minor compact對于一個數據量大的系統,可能時時刻刻在合并, 因為memstore 默認128M可能1分鐘就滿了,刷出之后產生HFILE,然后達到合并條件就合并。
而split有3個策略,默認是IncreasingToUpperBoundRegionSplitPolicy , 還有KeyPrefixRegionSplitPolicy, ConstantSizeRegionSplitPolicy, 根據規則在128M的時候就應該split,但是實際從日志來看,并沒有,后續再做觀察。
通常我們會提到手動拆分,也就是關閉自動拆分,從拆分策略來看,只有ConstantSizeRegionSplitPolicy能完全禁止自動拆分,設置這個策略之后,然后修改region的max filesize,比如100G,那么基本就可以關閉自動拆分。
根據以上合并以及拆分理論知識,我們假設有一個系統負載極大,不停的大量數據寫入,那么我們可以知道,HBASE內部在不停的合并,達到拆分規則又拆分,又合并,又拆分,周而復始。
在拆分的時候,1個大region拆分成2個小region, 然后修改meta,再online2個小region, 刪除大的region. 但是在這過程,我們知道數據還在不停的寫入,hbase.hstore.blockingStoreFiles默認為10,這個參數是用來控制當一個region下超過多少個文件就BLOCK更新插入,等待合并結束,問題是這個參數不會一直BLOCK,hbase.hstore.blockingWaitTime 默認90秒,超過這個時間又會放行插入和更新。很顯然,出現這種情況之后,小region如果出現了需要split的情況怎么辦? 開始的合并還沒有結束,大region還沒有offline, 小region又要拆分。
如果出現了上面的情況,我不知道具體HBASE是什么規則,但是我想這是一個極度復雜的處理,簡單處理的話只有BLOCK插入和更新,等待合并或者拆分結束。目前我還沒找到有完全BLOCK HBASE插入和更新的參數, 所以為了更好管理HBASE, 建議關閉自動拆分,為什么? 不僅僅是為了說SPLIT可能會影響性能,如果說SPLIT會影響,那么合并也會影響,更多的是,拆分和合并我們要有取舍,關閉了自動拆分,人為來控制,那么在HBASE內部僅僅存在合并,至少不會出現上述極度復雜的情況。
最后,如果系統負載極大的時候,rowkey分配不規則,大量線程往一個region寫數據,默認單個memstore是128M,最大大小為128*2=256M, 這個時候按照規則會BLOCK寫入,甚至出現org.apache.hadoop.hbase.RegionTooBusyException: org.apache.hadoop.hbase.RegionTooBusyException: Above memstore limit memstoreSize=269744800, blockingMemStoreSize=268435456 之類的錯誤。
這里簡單說一下memstore block寫入規則,默認memstore size=128M, 結合hbase.hregion.memstore.block.multiplier=2 ,也就是說memstore最大大小為256M, 將BLOCK寫入,阻止大量寫入避免出現outofmemory錯誤. 上面你看到的above memstore size > 256M.
所以預先分區以及估算寫入量就顯的非常重要,如果你的系統負載并沒有那么大,那么就顯的不是那么重要了。
到此,相信大家對“Hbase compact和split跟蹤舉例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。