做者 | yhf20071java
【Arthas 官方社区正在举行征文活动,参加即有奖品拿~点击投稿】node
公司新搭 HDFS 集群,namenode作ha,可是在启动 StandbyNamenode 节点的时候出现奇怪的现象:空集群加载 Editlog 很慢,每次重启几乎耗时都在二三十分钟apache
为了方便你们理解,大体说下 StandbyNamenode(如下简称 SNN)启动过程:网络
问题就出在第 2 步,在从 JournalNode 拉取 EditLog 过程当中出现固定 15s 延迟。通常来讲,空集群几乎没有操做, editlog 不会太大,不该该出现每次从 JournalNode 拉取 EditLog 都耗费 15s 的时间,日志以下(为了方便观察截取部分日志):socket
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 seconds
trace org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader loadFSEdits
profiler start/stop
函数
trace org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream$URLLog$1 run
trace --skipJDKMethods false sun.net.www.http.HttpClient parseHTTPHeader
trace --skipJDKMethods false java.net.SocketInputStream socktRead '#cost > 10000'
stack *SocketInputStream socketRead "#cost > 10000"
发现因为 StandbyNameNode 的网络读取数据形成阻塞,到此已经碰到 native 函数,在 java 层面已经没有有效方法进行分析。oop
这时我看到 StandbyNameNode 的日志:spa
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
.net
同时想起了 @赫炎 提出的思路,有多是在 JournalNode 端读取 EditLog 文件的时候有阻塞。调试
trace --skipJDKMethods false org.apache.hadoop.hdfs.qjournal.server.GetJournalEditServlet doGet '#cost > 10000'
发如今调用 java.net.InetSocketAddress.getHostName
处耗时 15s,至此找到了罪魁祸首。
为了验证猜测,在每一个 JournalNode 节点 hosts 文件配置 0.0.0.0 0.0.0.0,重启 SNN,速度提高了 20 倍
不得不说,Arthas 做为动态追踪调试 java 进程的神器,真的很方便开发人员定位问题。赞一个!