一次HDFS JournalNode transaction lag問題分析排查

前言


衆所周知,在HDFS集羣中,NameNode服務是其中的核心服務。NameNode的性能處理效率的高低直接影響着其對外提供的服務能力。鑑於過往筆者已經寫過諸多NameNode優化系列的文章,本文筆者來聊聊另外與NameNode相關的服務JournalNode(簡稱JN)服務。JournalNode是在HDFS HA模式下用來做共享editlog的存儲的。別看JN服務功能單一,但是其所造成的影響可以很大。NN寫JN editlog慢不僅會影響Standby NN的最新狀態的同步,而且還會影響Active NN的正常RPC處理效率。因爲在NN處理RPC寫請求的時候,在每次請求處理完畢,會寫一條對應的transaction log信息。本文筆者來簡單分享一次最近發生在工作中的NN寫JN transaction出現延時的問題,主要給大家分享分享裏面問題排查的思路過程,給大家帶來一些參考意義。

背景


問題的背景很簡單,平時正在正常運行的HDFS集羣,突然有一天頻繁的發生了JN lag(即Active NN寫JN editlog出現延時現象)的情況,然後我們觀察到了此現象,開始了問題的排查。

JN lag的樣例截圖
在這裏插入圖片描述
上圖中最後一個JN出現xx txns/xxms behind字樣的即爲lag的JN。

在JN lag問題排查之前,我們首先羅列出了所有可能導致此情況發生的原因:

  • 1)JN服務本身問題,如code bug的問題。
  • 2)NN服務問題,寫此JN的邏輯出現問題。
  • 3)JN所在機器的硬件層面出現問題,比如磁盤,網絡問題。
  • 4)JN受所在機器其它服務的影響。

JN lag的問題大致上逃不出上面提到的這4種情況。後面,筆者開始進行逐一情況的排查。

問題追蹤排查分析


排查一:JN服務本身問題


要排查是否是JN服務本身的問題,基本會使用到的手段無非jstack打個thread dump,判斷是否出現死鎖或者操作hung住的情況。另外進程的GC情況也是需要去觀察和留意的。這步排查完畢,沒有看到明顯的異常。

另外對於JN服務本身,我們還看了JN的log和它自身暴露的一些JMX指標,log裏沒有看到有用的信息。但是出問題的JN JMX指標和正常的JMX指標存在略微差異。

 # Lag JN的JMX指標
 {
   
       
    "name" : "Hadoop:service=JournalNode,name=RpcActivityForPort8485",
    "modelerType" : "RpcActivityForPort8485",
    "tag.port" : "8485",
    ...
    "RpcQueueTimeNumOps" : 46466784,
    "RpcQueueTimeAvgTime" : 0.03773584905660377,
    "RpcLockWaitTimeNumOps" : 46466784,
    "RpcLockWaitTimeAvgTime" : 0.0,
    "RpcProcessingTimeNumOps" : 46466784,
    "RpcProcessingTimeAvgTime" : 0.02342225113858165,
    ...
    "RpcSlowCalls" : 32251,
    "NumOpenConnections" : 6,
    "CallQueueLength" : 0,
    "ReadCallQueueLength" : 0,
    "WriteCallQueueLength" : 0
  }
# 正常JN的JMX指標
 {
   
       
    "name" : "Hadoop:service=JournalNode,name=RpcActivityForPort8485",
    "modelerType" : "RpcActivityForPort8485",
    "tag.port" : "8485",
    ...
    "RpcQueueTimeNumOps" : 6193612644,
    "RpcQueueTimeAvgTime" : 1.3103095828670942E-4,
    "RpcLockWaitTimeNumOps" : 6193612644,
    "RpcLockWaitTimeAvgTime" : 0.0,
    "RpcProcessingTimeNumOps" : 6193612644,
    "RpcProcessingTimeAvgTime" : 0.059417520460616005,
    ...
    "RpcSlowCalls" : 2706685,
    "NumOpenConnections" : 6,
    "CallQueueLength" : 0,
    "ReadCallQueueLength" : 0,
    "WriteCallQueueLength" : 0
  }

通過對上面JMX的指標對比,我們還是能夠得到一些相當有用的信息的。首先是JN RPC的process time處理時間上,2個JN的時間是在一個數量級上的,甚至出問題的JN的process time更快。

爲了進一步不是JN服務本身的問題,我們決定重啓JN服務,來觀察是否JN lag現象能夠消失。結果不幸的是,JN lag依然存在。因此基本排除是JN服務自身的問題。

排查二:NN 服務問題


經過推理一結論,既然NN寫editlog出現lag現象的target JN沒問題,那麼是否有可能是源頭NN寫的問題呢?

我們簡單看了下NN的log,沒有發現與此強相關的異常信息。另外我們發現了額外的一個信息點:所有HDFS Federation NN往問題JN上寫的editlog都出現了lag的情況。這就再次表明了lag問題還是出在了JN這個機器本身上。但這次懷疑的目標從JN服務本身轉移到了JN機器層面的問題上了。

排查三:JN機器硬件層面問題


問題倘若真發生在機器層面上,排查的難度毫無疑問會加大許多,畢竟術業有專攻。不過,做大大數據的工程師,一些簡單的排查還是可以做一做的。

這裏我們做了簡單的分析,用iostat命令觀察機器的ioutil, iowait指標看看磁盤的性能。發現磁盤讀寫本身沒有多少問題,繼而看看是否存在網絡的問題。

針對網絡連接這類的問題排查,除了最爲常見測試連通性的ping,telnet命令。這裏給大家推薦另外2個極爲管用的工具命令:

  • 第一個,mtr命令。mtr不僅可以用來測試與目標地址的連通性,丟包率,它還能夠顯示packet在每一跳上的丟包率。
  • 第二個,traceroute命令。traceroute命令能夠直接展示在每一跳上的時間耗時。

這裏我們做了總共正反兩組的對比測試:

  • NN向所有JN的mtr, traceroute測試,以檢測NN對於其所屬JN的網絡連通性情況。
  • 問題JN,正常JN向NN的的mtr, traceroute測試,以檢測JN到NN的網絡連通性情況。

經過測試,我們沒有發現丟包達到情況,但是發現了一個明顯的差異在於JN到NN的測試,如下圖所示:

[ lag_jn]$ traceroute NN_node
traceroute to xxxx, 30 hops max, 60 byte packets
xxxx  8.132 ms  8.127 ms  8.174 ms
 
 
[ normal_jn]$  traceroute NN_node
traceroute to xxxx, 30 hops max, 60 byte packets
xxxx  0.107 ms  0.094 ms  0.087 ms

上面圖示結果表明,發送同樣數量的packets,lag jn的耗時遠遠大於正常JN的耗時。後續,我們馬上聯繫了網絡組的同學,請求幫助分析問題JN是否存在網絡層面類似交換機上的問題。

網絡組的同學在調試的過程中,也發現了這裏的latency問題,不過他們還額外檢測到一個異常的情況:問題JN的網絡接口的帶寬處於一個幾乎被打滿的情況,如下圖:
在這裏插入圖片描述
另外更爲重要的一點是,帶寬開始出現異常飆升的時間點和JN lag問題開始出現的時間是完全匹配的。

問題分析到這裏,我們關注的焦點鎖定在了這些異常的traffic流量上了。首先JN服務本身editlog寫的量是很小的,肯定不會造成這麼大的流量改變。於是我們逐級懷疑是此機器上的其它服務造成的,即上面的推論四。

推論四:JN受所在機器其它服務的影響


我們重新梳理了下此JN所在機器上部署的各個服務,其中最爲重量級的服務是YARN的RM服務。是否是RM在近端時間服務了更多的application請求,導致了traffic的上漲呢?在RM中涉及到網絡數據傳輸影響最大的是getApplications這類的API call。隨後我們對此call的頻率做了一個分析統計,類似如下log的記錄統計。

2020-12-29 04:01:21,687 WARN org.apache.hadoop.ipc.Server: Slow RPC : getApplications took 5MILLISECONDS to process from client org.apache.hadoop.yarn.api.ApplicationClientProt
ocolPB.getApplications from xx.xx.xx.xx Call#2471092 Retry#0
2020-12-29 04:01:21,692 WARN org.apache.hadoop.ipc.Server: Slow RPC : getApplications took 4MILLISECONDS to process from client org.apache.hadoop.yarn.api.ApplicationClientProt
ocolPB.getApplications from xx.xx.xx.xx Call#2471093 Retry#0

後續我們發現RM的getApplications確實比上個月同期增長了一倍之多。通過尋找裏面出現的高頻率的source ip地址找到了對應的業務部門。進行溝通了解後,確實是他們的業務流量在近期有了部分的調整,造成了大量getApplications call的增加,進而大幅度地導致RM機器traffic的上漲。

總結


問題分析至此,最終有了一個完美的答案。事後在回顧此問題的排查,假如事先我們就考慮懷疑是否可能是其他服務影響導致的,也許我們就能夠更加早地發現問題了。但是話說回來,其他情況的分析其實也是更加堅定了是推論四的可能性的。

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