1. 程式人生 > >HBase常見面試問題

HBase常見面試問題

1.hbase在從StoreMemery重新整理到HFile時候,是否對寫有影響??

memstore在不同的條件下會觸發資料刷盤,那麼整個資料在刷盤過程中,對region的資料寫入等有什麼影響?memstore的資料刷盤,對region的直接影響就是:在資料刷盤開始到結束這段時間內,該region上的訪問都是被拒絕的,這裡主要是因為在資料刷盤結束時,RS會對改region做一個snapshot,同時HLog做一個checkpoint操作,通知ZK哪些HLog可以被移到.oldlogs下。從前面圖上也可以看到,在memstore寫盤開始,相應region會被加上UpdateLock鎖,寫盤結束後該鎖被釋放。

2.觸發memstore的flush操作,實現的方式有哪些?

  • 1通過全域性記憶體控制,觸發memstore刷盤操作。memstore整體記憶體佔用上限通過引數hbase.regionserver.global.memstore.upperLimit進行設定,當然在達到上限後,memstore的刷寫也不是一直進行,在記憶體下降到hbase.regionserver.global.memstore.lowerLimit配置的值後,即停止memstore的刷盤操作。這樣做,主要是為了防止長時間的memstore刷盤,會影響整體的效能。
    在該種情況下,RS中所有region的memstore記憶體佔用都沒達到刷盤條件,但整體的記憶體消耗已經到一個非常危險的範圍,如果持續下去,很有可能造成RS的OOM,這個時候,需要進行memstore的刷盤,從而釋放記憶體。
  • 2手動觸發memstore刷盤操作
    HBase提供API介面,執行通過外部呼叫進行memstore的刷盤
  • 3 memstore上限觸發資料刷盤
    前面提到memstore的大小通過hbase.hregion.memstore.flush.size進行設定,當region中memstore的資料量達到該值時,會自動觸發memstore的刷盤操作。

3.HBase中的HFile為甚要合併成大檔案,然後有時候要拆分成小的檔案?

(1)系統層級的合併必要
資料量的持續寫入,造成memstore的頻繁flush,每次flush都會產生一個HFile,這樣底層儲存裝置上的HFile檔案數量將會越來越多。不管是HDFS還是Linux下常用的檔案系統如Ext4、XFS等,對小而多的檔案上的管理都沒有大檔案來的有效,比如小檔案開啟需要消耗更多的檔案控制代碼;在大量小檔案中進行指定rowkey資料的查詢效能沒有在少量大檔案中查詢來的快等等。
【提示:在hbase叢集搭建過程中,需要手動修改(調大)linux允許的檔案控制代碼數量】
(2)查詢層級的合併必要—壓實compact


大量HFile的產生,會消耗更多的檔案控制代碼,同時會造成RS在資料查詢等的效率大幅度下降,HBase為解決這個問題,引入了compact操作,RS通過compact把大量小的HFile進行檔案合併,生成大的HFile檔案。

4.minor compact和major compact的區別?

RS上的compact根據功能的不同,可以分為兩種不同型別,即:minor compact和major compact。

(1)Minor Compact
minor compact又叫small compact,在RS執行過程中會頻繁進行,主要通過引數hbase.hstore.compactionThreshold進行控制,該引數配置了HFile數量在滿足該值時,進行minor compact,minor compact只選取region下部分HFile進行compact操作,並且選取的HFile大小不能超過hbase.hregion.max.filesize引數設定。

(2)Major Compact
相反major compact也被稱之為large compact,major compact會對整個region下相同列簇的所有HFile進行compact,也就是說major compact結束後,同一個列簇下的HFile會被合併成一個。major compact是一個比較長的過程,對底層I/O的壓力相對較大。
major compact除了合併HFile外,另外一個重要功能就是清理過期或者被刪除的資料。前面提到過,HBase的delete操作也是通過append的方式寫入,一旦某些資料在HBase內部被刪除了,在內部只是被簡單標記為刪除,真正在儲存層面沒有進行資料清理,只有通過major compact對HFile進行重組時,被標記為刪除的資料才能被真正的清理。
compact操作都有特定的執行緒進行,一般情況下不會影響RS上資料寫入的效能,當然也有例外:在compact操作速度跟不上region中HFile增長速度時,為了安全考慮,RS會在HFile達到一定數量時,對寫入進行鎖定操作,直到HFile通過compact降到一定的範圍內才釋放鎖。

5.大的HFile為什麼要Split成小的HFile?

compact將多個HFile合併單個HFile檔案,隨著資料量的不斷寫入,單個HFile也會越來越大,大量小的HFile會影響資料查詢效能,大的HFile也會,HFile越大,相對的在HFile中搜索的指定rowkey的資料花的時間也就越長,HBase同樣提供了region的split方案來解決大的HFile造成資料查詢時間過長問題。

其實,split只是簡單的把region從邏輯上劃分成兩個,並沒有涉及到底層資料的重組,split完成後,Parent region並沒有被銷燬,只是被做下線處理,不再對外部提供服務。而新產生的region Daughter A和Daughter B,內部的資料只是簡單的到Parent region資料的索引,Parent region資料的清理在Daughter A和Daughter B進行major compact以後,發現已經沒有到其內部資料的索引後,Parent region才會被真正的清理。


參考文章:https://blog.csdn.net/dante_003/article/details/79135031