HBase寫數據的異常問題以及優化

本篇文章來說道說道如何診斷HBase寫數據的異常問題以及優化寫性能。和讀相比,HBase寫數據流程倒是顯得很簡單:數據先順序寫入HLog,再寫入對應的緩存Memstore,當Memstore中數據大小達到一定閾值(128M)之后,系統會異步將Memstore中數據flush到HDFS形成小文件。

HBase數據寫入通常會遇到兩類問題,一類是寫性能較差,另一類是數據根本寫不進去。這兩類問題的切入點也不盡相同,如下圖所示:

寫性能優化切入點

1. 是否需要寫WAL?WAL是否需要同步寫入?

優化原理:數據寫入流程可以理解為一次順序寫WAL+一次寫緩存,通常情況下寫緩存延遲很低,因此提升寫性能就只能從WAL入手。WAL機制一方面是為了確保數據即使寫入緩存丟失也可以恢復,另一方面是為了集群之間異步復制。默認WAL機制開啟且使用同步機制寫入WAL。首先考慮業務是否需要寫WAL,通常情況下大多數業務都會開啟WAL機制(默認),但是對于部分業務可能并不特別關心異常情況下部分數據的丟失,而更關心數據寫入吞吐量,比如某些推薦業務,這類業務即使丟失一部分用戶行為數據可能對推薦結果并不構成很大影響,但是對于寫入吞吐量要求很高,不能造成數據隊列阻塞。這種場景下可以考慮關閉WAL寫入,寫入吞吐量可以提升2x~3x。退而求其次,有些業務不能接受不寫WAL,但可以接受WAL異步寫入,也是可以考慮優化的,通常也會帶來1x~2x的性能提升。

優化推薦:根據業務關注點在WAL機制與寫入吞吐量之間做出選擇

其他注意點:對于使用Increment操作的業務,WAL可以設置關閉,也可以設置異步寫入,方法同Put類似。相信大多數Increment操作業務對WAL可能都不是那么敏感~

2. Put是否可以同步批量提交?

優化原理:HBase分別提供了單條put以及批量put的API接口,使用批量put接口可以減少客戶端到RegionServer之間的RPC連接數,提高寫入性能。另外需要注意的是,批量put請求要么全部成功返回,要么拋出異常。

優化建議:使用批量put進行寫入請求

3. Put是否可以異步批量提交?

優化原理:業務如果可以接受異常情況下少量數據丟失的話,還可以使用異步批量提交的方式提交請求。提交分為兩階段執行:用戶提交寫請求之后,數據會寫入客戶端緩存,并返回用戶寫入成功;當客戶端緩存達到閾值(默認2M)之后批量提交給RegionServer。需要注意的是,在某些情況下客戶端異常的情況下緩存數據有可能丟失。

優化建議:在業務可以接受的情況下開啟異步批量提交

使用方式:setAutoFlush(false)

4. Region是否太少?

優化原理:當前集群中表的Region個數如果小于RegionServer個數,即Num(Region of Table) < Num(RegionServer),可以考慮切分Region并盡可能分布到不同RegionServer來提高系統請求并發度,如果Num(Region of Table) > Num(RegionServer),再增加Region個數效果并不明顯。

優化建議:在Num(Region of Table) < Num(RegionServer)的場景下切分部分請求負載高的Region并遷移到其他RegionServer;

5. 寫入請求是否不均衡?

優化原理:另一個需要考慮的問題是寫入請求是否均衡,如果不均衡,一方面會導致系統并發度較低,另一方面也有可能造成部分節點負載很高,進而影響其他業務。分布式系統中特別害怕一個節點負載很高的情況,一個節點負載很高可能會拖慢整個集群,這是因為很多業務會使用Mutli批量提交讀寫請求,一旦其中一部分請求落到該節點無法得到及時響應,就會導致整個批量請求超時。因此不怕節點宕掉,就怕節點奄奄一息!

優化建議:檢查RowKey設計以及預分區策略,保證寫入請求均衡。

6. 寫入KeyValue數據是否太大?

KeyValue大小對寫入性能的影響巨大,一旦遇到寫入性能比較差的情況,需要考慮是否由于寫入KeyValue數據太大導致。KeyValue大小對寫入性能影響曲線圖如下:

圖中橫坐標是寫入的一行數據(每行數據10列)大小,左縱坐標是寫入吞吐量,右坐標是寫入平均延遲(ms)。可以看出隨著單行數據大小不斷變大,寫入吞吐量急劇下降,寫入延遲在100K之后急劇增大。

說到這里,有必要和大家分享兩起在生產線環境因為業務KeyValue較大導致的嚴重問題,一起是因為大字段業務寫入導致其他業務吞吐量急劇下降,另一起是因為大字段業務scan導致RegionServer宕機。

案件一:大字段寫入導致其他業務吞吐量急劇下降

部分業務反饋集群寫入忽然變慢、數據開始堆積的情況,查看集群表級別的數據讀寫QPS監控,發現問題的第一個關鍵點:業務A開始寫入之后整個集群其他部分業務寫入QPS都幾乎斷崖式下跌,初步懷疑黑手就是業務A。

下圖是當時業務A的寫入QPS(事后發現腦殘忘了截取其他表QPS斷崖式下跌的慘象),但是第一感覺是QPS并不高啊,憑什么去影響別人!

于是就繼續查看其他監控信息,首先確認系統資源(主要是IO)并沒有到達瓶頸,其次確認了寫入的均衡性,直至看到下圖,才追蹤到影響其他業務寫入的第二個關鍵點:RegionServer的handler(配置150)被殘暴耗盡:

對比上面兩張圖,是不是發現出奇的一致,那就可以基本確認是由于該業務寫入導致這臺RegionServer的handler被耗盡,進而其他業務拿不到handler,自然寫不進去。那問題來了,為什么會這樣?正常情況下handler在處理完客戶端請求之后會立馬釋放,唯一的解釋是這些請求的延遲實在太大。

試想,我們去漢堡店排隊買漢堡,有150個窗口服務,正常情況下大家買一個很快,這樣150個窗口可能只需要50個服務。假設忽然來了一批大漢,要定制超大漢堡,好了,所有的窗口都工作起來,而且因為大漢堡不好制作導致服務很慢,這樣必然會導致其他排隊的用戶長時間等待,直至超時。

可回頭一想這可是寫請求啊,怎么會有這么大的請求延遲!和業務方溝通之后確認該表主要存儲語料庫文檔信息,都是平均100K左右的數據,是不是已經猜到了結果,沒錯,就是因為這個業務KeyValue太大導致。KeyValue太大會導致HLog文件寫入頻繁切換、flush以及compaction頻繁觸發,寫入性能急劇下降。

目前針對這種較大KeyValue寫入性能較差的問題還沒有直接的解決方案,好在社區已經意識到這個問題,在接下來即將發布的下一個大版本HBase 2.0.0版本會針對該問題進行深入優化,詳見 HBase MOB ,優化后用戶使用HBase存儲文檔、圖片等二進制數據都會有極佳的性能體驗。

案件二:大字段scan導致RegionServer宕機

案件現場:有段時間有個0.98集群的RegionServer經常頻繁宕機,查看日志是由于”java.lang.OutOfMemoryError: Requested array size exceeds VM limit”,如下圖所示:

原因分析:通過查看源碼以及相關文檔,確認該異常發生在scan結果數據回傳給客戶端時由于數據量太大導致申請的array大小超過JVM規定的最大值( Interge.Max_Value-2)。造成該異常的兩種最常見原因分別是:

表列太寬(幾十萬列或者上百萬列),并且scan返回沒有對列數量做任何限制,導致一行數據就可能因為包含大量列而數據超過array大小閾值

KeyValue太大,并且scan返回沒有對返回結果大小做任何限制,導致返回數據結果大小超過array大小閾值

有的童鞋就要提問啦,說如果已經對返回結果大小做了限制,在表列太寬的情況下是不是就可以不對列數量做限制呢。這里需要澄清一下,如果不對列數據做限制,數據總是一行一行返回的,即使一行數據大小大于設置的返回結果限制大小,也會返回完整的一行數據。在這種情況下,如果這一行數據已經超過array大小閾值,也會觸發OOM異常。

解決方案:目前針對該異常有兩種解決方案,其一是升級集群到1.0,問題都解決了。其二是要求客戶端訪問的時候對返回結果大小做限制(scan.setMaxResultSize(2*1024*1024))、并且對列數量做限制(scan.setBatch(100)),當然,0.98.13版本以后也可以對返回結果大小在服務器端進行限制,設置參數hbase.server.scanner.max.result.size即可

寫異常問題檢查點

上述幾點主要針對寫性能優化進行了介紹,除此之外,在一些情況下還會出現寫異常,一旦發生需要考慮下面兩種情況(GC引起的不做介紹):

Memstore設置是否會觸發Region級別或者RegionServer級別flush操作?

問題解析:以RegionServer級別flush進行解析,HBase設定一旦整個RegionServer上所有Memstore占用內存大小總和大于配置文件中upperlimit時,系統就會執行RegionServer級別flush,flush算法會首先按照Region大小進行排序,再按照該順序依次進行flush,直至總Memstore大小低至lowerlimit。這種flush通常會block較長時間,在日志中會發現“ Memstore is above high water mark and block 7452 ms”,表示這次flush將會阻塞7s左右。

問題檢查點:

Region規模與Memstore總大小設置是否合理?如果RegionServer上Region較多,而Memstore總大小設置的很小(JVM設置較小或者upper.limit設置較小),就會觸發RegionServer級別flush。集群規劃相關內容可以參考文章《》

列族是否設置過多,通常情況下表列族建議設置在1~3個之間,最好一個。如果設置過多,會導致一個Region中包含很多Memstore,導致更容易觸到高水位upperlimit

Store中HFile數量是否大于配置參數blockingStoreFile?

問題解析:對于數據寫入很快的集群,還需要特別關注一個參數:hbase.hstore.blockingStoreFiles,此參數表示如果當前hstore中文件數大于該值,系統將會強制執行compaction操作進行文件合并,合并的過程會阻塞整個hstore的寫入。通常情況下該場景發生在數據寫入很快的情況下,在日志中可以發現” Waited 3722ms on a compaction to clean up ‘too many store files “

問題檢查點:

參數設置是否合理? hbase.hstore.compactionThreshold表示啟動compaction的最低閾值,該值不能太大,否則會積累太多文件,一般建議設置為5~8左右。 hbase.hstore.blockingStoreFiles默認設置為7,可以適當調大一些。

寫性能還能再提高么?

上文已經從寫性能優化以及寫異常診斷兩個方面對HBase中數據寫入可能的問題進行了詳細的解釋,相信在0.98版本的基礎上對寫入來說已經是最好的解決方案了。但是有些業務可能依然覺得不夠快,畢竟”更快”是所有存儲系統活著的動力,那還有提高空間嗎?當然,接下來簡單介紹HBase之后版本對寫性能優化的兩點核心改進:

Utilize Flash storage for WAL(HBASE-12848)

這個特性意味著可以將WAL單獨置于SSD上,這樣即使在默認情況下(WALSync),寫性能也會有很大的提升。需要注意的是,該特性建立在HDFS 2.6.0+的基礎上,HDFS以前版本不支持該特性。具體可以參考官方jira: https://issues.apache.org/jira/browse/HBASE-12848

Multiple WALs(HBASE-14457)

該特性也是對WAL進行改造,當前WAL設計為一個RegionServer上所有Region共享一個WAL,可以想象在寫入吞吐量較高的時候必然存在資源競爭,降低整體性能。針對這個問題,社區小伙伴(阿里巴巴大神)提出Multiple WALs機制,管理員可以為每個Namespace下的所有表設置一個共享WAL,通過這種方式,寫性能大約可以提升20%~40%左右。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

  • 參考:http://www.lxweimin.com/p/569106a3008f 最近在逐步跟進Hbase的相關...
    博弈史密斯閱讀 870評論 1 1
  • 最近在逐步跟進Hbase的相關工作,由于之前對Hbase并不怎么了解,因此系統地學習了下Hbase,為了加深對Hb...
    飛鴻無痕閱讀 50,291評論 19 272
  • HBase那些事 @(大數據工程學院)[HBase, Hadoop, 優化, HadoopChen, hbase]...
    分癡閱讀 3,970評論 3 17
  • HBase存儲架構圖 HBase Master 為Region server分配region 負責Region s...
    kimibob閱讀 5,605評論 0 52
  • 轉自別人的博客http://www.cnblogs.com/mockitobuilder/p/3754509.ht...
    JaeGwen閱讀 746評論 0 1