千家信息网

如何利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"如何利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家
千家信息网最后更新 2026年11月02日如何利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题

本篇内容主要讲解"如何利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题"吧!

公司新搭 HDFS 集群,namenode做ha,但是在启动 StandbyNamenode 节点的时候出现奇怪的现象:空集群加载 Editlog 很慢,每次重启几乎耗时都在二三十分钟

为了方便大家理解,大致说下 StandbyNamenode(以下简称 SNN)启动过程:

  • SNN 启动时,如果本地没有 FSImage会去 ANN(ActiveNamenode)拉取 FSImage

  • 如果本地有 FSImage,则会根据 transactionId 去 JournalNode 拉取 gap 的 editlog,在本地做合并

问题就出在第 2 步,在从 JournalNode 拉取 EditLog 过程中出现固定 15s 延迟。一般来说,空集群几乎没有操作, editlog 不会太大,不应该出现每次从 JournalNode 拉取 EditLog 都耗费 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 seconds

1.首先通过日志初步定位代码,粗略定位耗时方法

trace org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader loadFSEdits

2.上面的结果只能确定大致耗时方法块,不能精确定位实际耗时方法,如果要精确定位,需要一层一层展开,其中还涉及回调函数、native 函数;为了可以更方便的定位代码,我们先执行 profiler start,观察下耗时函数调用

profiler start/stop

3.继续追踪函数

trace org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream$URLLog$1 run

4.因为过程中涉及了 jdk 函数追踪,我们需要设置 options unsafe true

trace --skipJDKMethods false sun.net.www.http.HttpClient parseHTTPHeader
trace --skipJDKMethods false java.net.SocketInputStream socktRead '#cost > 10000'

5.我们最后通过调用栈确认代码执行路径

stack *SocketInputStream socketRead "#cost > 10000"

发现由于 StandbyNameNode 的网络读取数据造成阻塞,到此已经碰到 native 函数,在 java 层面已经没有有效方法进行分析。

这时我看到 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 侧追踪代码调用耗时

trace --skipJDKMethods false org.apache.hadoop.hdfs.qjournal.server.GetJournalEditServlet doGet '#cost > 10000'

发现在调用 java.net.InetSocketAddress.getHostName 处耗时 15s,至此找到了罪魁祸首。

结论:

  1. 经分析发现在在开启 Kerberos 的情况下,JournalNode 侧响应 getEditLog 接口调用时会进入方法 isValidRequestor,此时会去解析 SecondNameNode 的 hostName,据此搜索对应的 principal

  2. dns 域名解析服务不能获取 SecondNameNode 的默认地址 0.0.0.0:9868,也即不能解析 0.0.0.0 的 hostName,此处超时 15s 返回,这样每次通过 URLLog 获取 JournalNode的EditLog 时,总会有额外耗时 15s,导致 SNN 加载 EditLog 变慢。

为了验证猜想,在每个 JournalNode 节点 hosts 文件配置 0.0.0.0 0.0.0.0,重启 SNN,速度提升了 20 倍

到此,相信大家对"如何利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

函数 方法 定位 问题 代码 日志 过程 集群 精确 内容 实际 文件 时候 是在 节点 分析 学习 观察 阻塞 更深 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 互联网金融科技 广州大一互联网络科技有限公司 互联网佳科技有限公司 科技互联网龙头 亿策互联网科技 凡科互联网科技 撒么互联网科技公司 人人互联网科技是培训 卓越科技互联网 招聘 哈尔滨秒房互联网科技有限公司 天速互联网络科技有限公司 创业天下互联网科技有限公司 湖南诚度互联网科技有限公司 宁夏众和广鑫互联网科技有限公司 互联网公司黑科技创始人 群盈汇互联网科技有限公司 互联网科技融合创新 玉溪新华互联网科技怎么选 恒生科技互联网指数十大成分股 互联网为科技 西藏七维空间互联网科技有限公司 智腾互联网科技有限公司 呼和浩特新华互联网科技学院 中国互联网公司排名锤子科技 富国互联网金融科技混合基金 盐城市攀科互联网科技有限公司 青岛互联网科技园 前海云享互联网科技 科技发展第三阶段互联网时代
0