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

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

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

问题就出在第 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`](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fcbdp-online1.sdns.financial.cloud%3A8480%2FgetJournal%3Fjid%3Dhdfs-ha%26%3BsegmentTxId%3D213700%26storageInfo%3D-64%3A272699407%3A1603893889358%3ACID-aa8ec1b5-a501-4195-9299-e14abefbdc11%26inProgressOk%3Dtrue)`' 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 倍

参考链接:https://my.oschina.net/u/3874284/blog/4763265

利用 Arthas 解决启动 HDFS StandbyNameNode 加载 EditLog 慢的问题相关推荐

  1. 利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题

    作者 | yhf20071 [Arthas 官方社区正在举行征文活动,参加即有奖品拿~点击投稿] 公司新搭 HDFS 集群,namenode做ha,但是在启动 StandbyNamenode 节点的时 ...

  2. 解决eclipse环境下maven项目tomcat启动,未加载到项目的问题

    解决eclipse环境下maven项目tomcat启动,未加载到项目的问题 参考文章: (1)解决eclipse环境下maven项目tomcat启动,未加载到项目的问题 (2)https://www. ...

  3. 如何利用微信小游戏的分包加载机制突破4M代码包体积限制

    相信大家度过了一个不错的端午假期,在端午前夕,即6月15日晚上,微信小游戏宣布支持分包加载功能,白鹭引擎在端午节后第一天正式支持分包加载机制.在正式向开发者介绍如何使用前,我先为各位解读一下我对微信提 ...

  4. 完美解决IIS 服务器无法加载应用程序 '/LM/W3SVC/1/ROOT'。错误是 '没有注册类别

    完美解决IIS 服务器无法加载应用程序 '/LM/W3SVC/1/ROOT'.错误是 '没有注册类别 现象:         浏览ASP页面提示   500内部错误 事件查看器中:         [ ...

  5. web项目的启动时文件加载顺序

    web项目的启动时文件加载顺序 转自:http://www.cnblogs.com/yw-ah/p/5751509.html 一. 1.启动一个WEB项目,WEB容器会先去读取它的配置文件web.xm ...

  6. 阵列卡服务器启动不到pe桌面,制作启动u盘加载阵列卡驱动无法安装怎么办

    制作启动u盘加载阵列卡驱动无法安装怎么办?安装服务器时碰到没有阵列卡驱动无法安装的问题大家应该都碰到过.之前一次安装2003碰到没阵列卡驱动,解决的办法比较土,上网下了张别人做好的集成了raid驱动的 ...

  7. 利用Crowbar抓取网页异步加载的内容 [Python俱乐部]

    利用Crowbar抓取网页异步加载的内容 [Python俱乐部] 利用Crowbar抓取网页异步加载的内容 [Python俱乐部] 利用Crowbar抓取网页异步加载的内容 在做 Web 信息提取.数 ...

  8. Linux内核启动及文件系统加载过程

    当u-boot开始执行bootcmd命令,就进入linux内核启动阶段 与 u-boot 类似,普通 Linux 内核的启动过程也可以分为两个阶段,但针对压缩了的内核如 uImage 就要包括内核自解 ...

  9. 利用 JQuery的load函数动态加载页面

    利用JQuery的load函数动态加载页面 JQuery有好多Ajax函数,其中load是用来动态加载一个页面的内容到指定的dom元素上. 我们来做个例子: 做一个上下(左右)结构的页面,其中下左部分 ...

最新文章

  1. numpy、matplot、sklearn的安装与使用
  2. 如何用python“优雅的”调用有道翻译
  3. [html] 写一个垂直的三栏布局,第一栏固定顶部,中间铺满,第三栏固定底部
  4. git 怎么还原历史版本_4. Git--修改/回退等操作
  5. Python网页爬虫--
  6. 织梦DedeCMS使用SQL批量替换文章标题内容
  7. Windows “七大奇迹”:DNS Dynamic Updates 中的7个严重漏洞
  8. bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
  9. HeadFirstJava 7,8,9
  10. ps抠图头发丝 智能半径
  11. php 减号,PHP编码转换减号(连接符)无法转换问题
  12. java计算机毕业设计学生成绩管理系统源程序+mysql+系统+lw文档+远程调试
  13. 微信小程序之个人界面编写(2023.5.9版)
  14. 微信公众号运营助手,可以在手机上回复粉丝留言
  15. 如何根据SIM卡背面的10位序列号判断运营商,国家,地区,卡商
  16. 内核之旅:简单分析getsockopt系统调用
  17. Java引入第三方包
  18. 关于vue ui启动没反应问题
  19. vw 前端_Vw / Vh 更好的做前端适配
  20. CCS5.5出现unresolved symbol Qmss_programAccumulator,first referenced in ./src/cppi_qmss_mgmt.obj错误

热门文章

  1. python3的3D实战-基于panda3d(1)
  2. c++17(22)-reinterpret_cast和new动态空间内存申请
  3. 【深度学习】深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)...
  4. 【GNN】AAAI2021 | 图神经网络研究进展解读
  5. 你在做大数据?你有目标么?
  6. 【机器学习基础】算法工程师必备的机器学习--EM
  7. 【深度学习】一文看懂 (Transfer Learning)迁移学习(pytorch实现)
  8. 【论文解读】PFLD:高精度实时人脸关键点检测算法
  9. 简约而不简单|值得收藏的Numpy小抄表(含主要语法、代码)
  10. 2000 ~2019 年历届 CVPR 最佳论文汇总