利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题
作者 | yhf20071
【Arthas 官方社區(qū)正在舉行征文活動,參加即有獎品拿~點(diǎn)擊投稿】
公司新搭 HDFS 集群,namenode做ha,但是在啟動 StandbyNamenode 節(jié)點(diǎn)的時候出現(xiàn)奇怪的現(xiàn)象:空集群加載 Editlog 很慢,每次重啟幾乎耗時都在二三十分鐘
為了方便大家理解,大致說下 StandbyNamenode(以下簡稱 SNN)啟動過程:
- SNN 啟動時,如果本地沒有 FSImage會去 ANN(ActiveNamenode)拉取 FSImage
- 如果本地有 FSImage,則會根據(jù) transactionId 去 JournalNode 拉取 gap 的 editlog,在本地做合并
問題就出在第 2 步,在從 JournalNode 拉取 EditLog 過程中出現(xiàn)固定 15s 延遲。一般來說,空集群幾乎沒有操作, editlog 不會太大,不應(yīng)該出現(xiàn)每次從 JournalNode 拉取 EditLog 都耗費(fèi) 15s 的時間,日志如下(為了方便觀察截取部分日志):
2020-11-04 18:27:27,577 INFO namenode.RedundantEditLogInputStream (RedundantEditLogInputStream.java:nextOp(177)) - Fast-forwarding stream 'http://cbdp-online1.sdns.fin ancial.cloud:8480/getJournal?jid=hdfs-ha&segmentTxId=213656&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgressOk=true' to transaction ID 184269 2020-11-04 18:27:42,582 INFO namenode.FSEditLogLoader (FSEditLogLoader.java:loadEditRecords(289)) - replaying edit log: 1/44 transactions completed. (2%) 2020-11-04 18:27:42,583 INFO namenode.FSImage (FSEditLogLoader.java:loadFSEdits(162)) - Edits file http://cbdp-online1.sdns.financial.cloud:8480/getJournal?jid=hdfs-ha &segmentTxId=213656&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgressOk=true, http://cbdp-online2.sdns.financial.cloud:8 480/getJournal?jid=hdfs-ha&segmentTxId=213656&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgressOk=true, http://cbdp-onli ne3.sdns.financial.cloud:8480/getJournal?jid=hdfs-ha&segmentTxId=213656&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgres sOk=true of size 5981 edits # 44 loaded in 15 seconds......2020-11-04 18:27:42,583 INFO namenode.RedundantEditLogInputStream (RedundantEditLogInputStream.java:nextOp(177)) - Fast-forwarding stream 'http://cbdp-online1.sdns.financial.cloud:8480/getJournal?jid=hdfs-ha&;segmentTxId=213700&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgressOk=true' to transaction ID 184269 2020-11-04 18:27:57,588 INFO namenode.FSEditLogLoader (FSEditLogLoader.java:loadEditRecords(289)) - replaying edit log: 1/53 transactions completed. (2%) 2020-11-04 18:27:57,589 INFO namenode.FSImage (FSEditLogLoader.java:loadFSEdits(162)) - Edits file http://cbdp-online1.sdns.financial.cloud:8480/getJournal?jid=hdfs-ha&;segmentTxId=213700&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgressOk=true, http://cbdp-online2.sdns.financial.cloud:8480/getJournal?jid=hdfs-ha&;segmentTxId=213700&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgressOk=true, http://cbdp-online3.sdns.financial.cloud:8480/getJournal?jid=hdfs-ha&;segmentTxId=213700&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgressOk=true of size 7088 edits # 53 loaded in 15 seconds1.首先通過日志初步定位代碼,粗略定位耗時方法
trace org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader loadFSEdits2.上面的結(jié)果只能確定大致耗時方法塊,不能精確定位實(shí)際耗時方法,如果要精確定位,需要一層一層展開,其中還涉及回調(diào)函數(shù)、native 函數(shù);為了可以更方便的定位代碼,我們先執(zhí)行 profiler start,觀察下耗時函數(shù)調(diào)用
profiler start/stop
3.繼續(xù)追蹤函數(shù)
trace org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream$URLLog$1 run4.因?yàn)檫^程中涉及了 jdk 函數(shù)追蹤,我們需要設(shè)置 options unsafe true
trace --skipJDKMethods false sun.net.www.http.HttpClient parseHTTPHeader trace --skipJDKMethods false java.net.SocketInputStream socktRead '#cost > 10000'5.我們最后通過調(diào)用棧確認(rèn)代碼執(zhí)行路徑
stack *SocketInputStream socketRead "#cost > 10000"發(fā)現(xiàn)由于 StandbyNameNode 的網(wǎng)絡(luò)讀取數(shù)據(jù)造成阻塞,到此已經(jīng)碰到 native 函數(shù),在 java 層面已經(jīng)沒有有效方法進(jìn)行分析。
這時我看到 StandbyNameNode 的日志:
2020-11-04 18:27:42,583 INFO namenode.RedundantEditLogInputStream (RedundantEditLogInputStream.java:nextOp(177)) - Fast-forwarding stream 'http://cbdp-online1.sdns.financial.cloud:8480/getJournal?jid=hdfs-ha&;segmentTxId=213700&storageInfo=-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11&inProgressOk=true' to transaction ID 184269
同時想起了 @赫炎 提出的思路,有可能是在 JournalNode 端讀取 EditLog 文件的時候有阻塞。
6.我們在 JournalNode 側(cè)追蹤代碼調(diào)用耗時
trace --skipJDKMethods false org.apache.hadoop.hdfs.qjournal.server.GetJournalEditServlet doGet '#cost > 10000'發(fā)現(xiàn)在調(diào)用 java.net.InetSocketAddress.getHostName 處耗時 15s,至此找到了罪魁禍?zhǔn)住?/p>
結(jié)論:
為了驗(yàn)證猜想,在每個 JournalNode 節(jié)點(diǎn) hosts 文件配置 0.0.0.0 0.0.0.0,重啟 SNN,速度提升了 20 倍
不得不說,Arthas 作為動態(tài)追蹤調(diào)試 java 進(jìn)程的神器,真的很方便開發(fā)人員定位問題。贊一個!
總結(jié)
以上是生活随笔為你收集整理的利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RocketMQ 很慢?引出了一个未解之
- 下一篇: 阿里云在应用扩缩容下遇到的挑战与选型思考