如何避免HBase寫入過快引起的各種問題

2021-09-20 12:32:03 字數 1432 閱讀 3910

整個寫入流程從客戶端呼叫api開始,資料會通過protobuf編碼成乙個請求,通過scoket實現的ipc模組被送達server的rpc佇列中。最後由負責處理rpc的handler取出請求完成寫入操作。寫入會先寫wal檔案,然後再寫乙份到記憶體中,也就是memstore模組,當滿足條件時,memstore才會被flush到底層檔案系統,形成hfile。

當寫入過快時會遇見什麼問題?

寫入過快時,memstore的水位會馬上被推高。

你可能會看到以下類似日誌:

這個是region的memstore占用記憶體大小超過正常的4倍,這時候會拋異常,寫入請求會被拒絕,客戶端開始重試請求。當達到128m的時候會觸發flush memstore,當達到128m * 4還沒法觸發flush時候會拋異常來拒絕寫入。兩個相關引數的預設值如下:

或者這樣的日誌:

這是所有region的memstore記憶體總和開銷超過配置上限,預設是配置heap的40%,這會導致寫入被阻塞。目的是等待flush的執行緒把記憶體裡的資料flush下去,否則繼續允許寫入memestore會把記憶體寫爆

當寫入被阻塞,佇列會開始積壓,如果運氣不好最後會導致oom,你可能會發現jvm由於oom crash或者看到如下類似日誌:

hbase這裡我認為有個很不好的設計,捕獲了oom異常卻沒有終止程序。這時候程序可能已經沒法正常執行下去了,你還會在日誌裡發現很多其它執行緒也拋oom異常。比如stop可能根本stop不了,rs可能會處於一種僵死狀態。

如何避免rs oom?

一種是加快flush速度:

當達到hbase.hstore.blockingstorefiles配置上限時,會導致flush阻塞等到compaction工作完成。阻塞時間是hbase.hstore.blockingwaittime,可以改小這個時間。hbase.hstore.flusher.count可以根據機器型號去配置,可惜這個數量不會根據寫壓力去動態調整,配多了,非匯入資料多場景也沒用,改配置還得重啟。

同樣的道理,如果flush加快,意味這compaction也要跟上,不然檔案會越來越多,這樣scan效能會下降,開銷也會增大。

增加compaction執行緒會增加cpu和頻寬開銷,可能會影響正常的請求。如果不是匯入資料,一般而言是夠了。好在這個配置在雲hbase內是可以動態調整的,不需要重啟。

上述配置都需要人工干預,如果干預不及時server可能已經oom了,這時候有沒有更好的控制方法?

直接限制佇列堆積的大小。當堆積到一定程度後,事實上後面的請求等不到server端處理完,可能客戶端先超時了。並且一直堆積下去會導致oom,1g的預設配置需要相對大記憶體的型號。當達到queue上限,客戶端會收到callqueuetoobigexception 然後自動重試。通過這個可以防止寫入過快時候把server端寫爆,有一定反壓作用。線上使用這個在一些小型號穩定性控制上效果不錯。

原文發布時間為:2018-06-1

聊一聊 HBase 是如何寫入資料的?

hbase client 訪問 zookeeper 獲取寫入 region 所在的位置,即獲取 hbase meta 表位於哪個 region server 訪問對應的 region server 獲取 hbase meta 表,並查詢出目標資料位於哪個 region server 中的哪個 reg...

如何避免學習linux必然會遇到的幾個問題

相信在看這篇文章的都是對linux系統所迷的志同道合的人,不管你是剛開始學,還是已經接觸過一些linux的知識,下面的問題是你在學習linux所必須遇到的,若是沒有的話那我只能說大神我服你了。下面我就作為乙個過來人分享下我學習後的經驗。相信大家接觸電腦的時候都是從windows開始,windows的...

如何避免學習linux必然會遇到的幾個問題

相信在看這篇文章的都是對linux系統所迷的志同道合的人,不管你是剛開始學,還是已經接觸過一些linux的知識,下面的問題是你在學習linux所必須遇到的,若是沒有的話那我只能說大神我服你了。下面我就作為乙個過來人分享下我學習後的經驗。一 無法擺脫windows的思維方式 相信大家接觸電腦的時候都是...