hbase寫入一段時間後變的越來越慢

一、概況

集羣環境如下表:

集羣 機器 存儲 內存 CPU 每日數據        
HW大數據平臺 160臺 6PB 10TB 8000 10億        

 

數據存儲在kafka中,130個分區,採用sparkstreaming將數據清洗後,通過phoneix批量寫入hbase。

 

二、kafka原因排查

sparkstreaming拉取kafka的時候,卡死在這一步,如下圖所示:

sparkstreaming讀取kafka的數據採用Direct 模式讀取kafka數據,檢查點在客戶端維護offset,任務運行不是很穩定,偶爾會出現延遲幾分鐘。

  • 推測執行
  • kafka客戶端版本
  • offset跳躍

三、hbase原因排查

hbase寫入慢的時候,查看線程堆棧,發現卡在這一步,如圖所示: 

  • 寫熱點
  • hbase的處理線程數
  • hbase的memstore大小
  • hbase的flush、合併、split
  • 代碼頻繁創建連接

四、規律蒐集

上述問題排查了已經一個月了,各種辦法都試過了,期間kafka端的阻塞已經解決了,寫入hbase慢。各種百度,以及hbase的原理也看了一遍又一遍,大數據平臺上的監控也一直盯着看,也沒有解決寫入慢的問題。

到這一步基本可以確定是hbase寫入延遲導致sparkstreaming任務延遲越來越高。

10s鍾一個批次的任務,5*26個處理core,基本從下午4點半到第二天早上9點半都很快,在3s中左右處理完成,期間雖然寫入有波動,但是基本都可以很快平穩,但是9點半以後基本每個批次都要10s以上,sparkstreaming延遲越來越高,每個批次寫入的數量和之前並無變化,也沒有數據傾斜。

                              

因爲sparkstreaming的日誌都比較散,很艱難的發現了。

#1, waiting for 2 actions to finish on table: WIFI_MAC_FAST_QUERY

Left over 2 task(s) are processed on server(s): [xlhd-b1805-hbase41,21302,1568195573413]

客戶端寫等待,這不是很正常嘛,可能是服務端內部活動,導致的吧?唉,於是想收集一下,看看是不是寫等待多的時候,導致sparkstreaming,這怎麼統計????。

幸好,現場之前基於elk做過日誌蒐集,採用擴展logback的插件,將數據直接從服務接引到es,並且成功集成了sparkstreaming,tomcat,springboot等框架,於是將o.a.h.h.c.AsyncProcess類打的日誌採集到es,去尋找規律。

                                           

上圖真是來的太及時了,蒐集了sparkstreaming散開的日誌,聚合在一起,發現寫等待還是比較大的,但是最重要的發現是寫等待的regionserver居然都是hbase41這個節點,難道有熱點寫,去大數據平臺查看,沒有發生熱點寫,每個regionserver的請求很平穩,於是登陸這臺機器進行一通linux命令,top,iostat,sar,ifconfig,ping等,發現丟包,哈哈。

                                          -

於是將該節點的regionserver停掉,發現基本每個批次3s左右都可以處理完,通知運維去機房解決網絡問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章