修复HDFS主备节点edits不一致导致的无法进行checkpoint的问题

news/2024/5/20 3:09:29 标签: hdfs, hadoop, 大数据

背景

项目上一套HDFS环境,从4月起会偶发HDFS namenode宕机的问题,后来出现的越来越频繁,最后甚至启动后四五分钟就会宕机,接到需求开始进行排查。

排查过程

日志报错

2023-05-27 22:50:21,844 FATAL namenode.FSEditLog (JournalSet.java:mapJournalsAndReportErrors(390)) - Error: flush failed for required journal (JournalAndStream(mgr=QJM to [192.xxx.xxx.xxx:8485, 192.xxx.xxx.yyy:8485, 192.xxx.xxx.zzz:8485], stream=QuorumOutputStream starting at txid 8169027))
java.io.IOException: Timed out waiting 20000ms for a quorum of nodes to respond.
        at org.apache.hadoop.hdfs.qjournal.client.AsyncLoggerSet.waitForWriteQuorum(AsyncLoggerSet.java:137)
        at org.apache.hadoop.hdfs.qjournal.client.QuorumOutputStream.flushAndSync(QuorumOutputStream.java:109)
        at org.apache.hadoop.hdfs.server.namenode.EditLogOutputStream.flush(EditLogOutputStream.java:113)
        at org.apache.hadoop.hdfs.server.namenode.EditLogOutputStream.flush(EditLogOutputStream.java:107)
        at org.apache.hadoop.hdfs.server.namenode.JournalSet$JournalSetOutputStream$8.apply(JournalSet.java:525)
        at org.apache.hadoop.hdfs.server.namenode.JournalSet.mapJournalsAndReportErrors(JournalSet.java:385)
        at org.apache.hadoop.hdfs.server.namenode.JournalSet.access$100(JournalSet.java:55)
        at org.apache.hadoop.hdfs.server.namenode.JournalSet$JournalSetOutputStream.flush(JournalSet.java:521)
        at org.apache.hadoop.hdfs.server.namenode.FSEditLog.logSync(FSEditLog.java:710)
        at org.apache.hadoop.hdfs.server.namenode.FSEditLogAsync.run(FSEditLogAsync.java:188)
        at java.lang.Thread.run(Thread.java:748)

怀疑是namenode与journalnode通信超时了
参考其他博客,尝试调整dfs.qjournal.write-txns.timeout.ms参数至一分钟(默认是20s)。namenode宕机的频率下降到4-6小时一次,没有从根本上解决问题

二次排查

2023-05-29 22:00:25,517 WARN  client.QuorumJournalManager (QuorumCall.java:waitFor(186)) - Waited 58044 ms (timeout=60000 ms) for a response for sendEdits. Succeeded so far: [192.xxx.xxx.xxx:8485]
2023-05-29 22:00:26,518 WARN  client.QuorumJournalManager (QuorumCall.java:waitFor(186)) - Waited 59045 ms (timeout=60000 ms) for a response for sendEdits. Succeeded so far: [192.xxx.xxx.xxx:8485]
2023-05-29 22:00:27,474 FATAL namenode.FSEditLog (JournalSet.java:mapJournalsAndReportErrors(390)) - Error: flush failed for required journal (JournalAndStream(mgr=QJM to [192.xxx.xxx.xxx:8485, 192.xxx.xxx.yyy:8485, 192.xxx.xxx.zzz:8485], stream=QuorumOutputStream starting at txid 8180981))
java.io.IOException: Timed out waiting 60000ms for a quorum of nodes to respond.
        at org.apache.hadoop.hdfs.qjournal.client.AsyncLoggerSet.waitForWriteQuorum(AsyncLoggerSet.java:137)
        at org.apache.hadoop.hdfs.qjournal.client.QuorumOutputStream.flushAndSync(QuorumOutputStream.java:109)
        at org.apache.hadoop.hdfs.server.namenode.EditLogOutputStream.flush(EditLogOutputStream.java:113)
        at org.apache.hadoop.hdfs.server.namenode.EditLogOutputStream.flush(EditLogOutputStream.java:107)
        at org.apache.hadoop.hdfs.server.namenode.JournalSet$JournalSetOutputStream$8.apply(JournalSet.java:525)
        at org.apache.hadoop.hdfs.server.namenode.JournalSet.mapJournalsAndReportErrors(JournalSet.java:385)
        at org.apache.hadoop.hdfs.server.namenode.JournalSet.access$100(JournalSet.java:55)
        at org.apache.hadoop.hdfs.server.namenode.JournalSet$JournalSetOutputStream.flush(JournalSet.java:521)
        at org.apache.hadoop.hdfs.server.namenode.FSEditLog.logSync(FSEditLog.java:710)
        at org.apache.hadoop.hdfs.server.namenode.FSEditLogAsync.run(FSEditLogAsync.java:188)
        at java.lang.Thread.run(Thread.java:748)
2023-05-29 22:00:27,477 WARN  client.QuorumJournalManager (QuorumOutputStream.java:abort(74)) - Aborting QuorumOutputStream starting at txid 8180981
2023-05-29 22:00:27,482 INFO  util.ExitUtil (ExitUtil.java:terminate(210)) - Exiting with status 1: Error: flush failed for required journal (JournalAndStream(mgr=QJM to [192.xxx.xxx.xxx:8485, 192.xxx.xxx.yyy:8485, 192.xxx.xxx.zzz:8485], stream=QuorumOutputStream starting at txid 8180981))

发现是nanenode 向journalnode发送edit日志等待响应的时候超时报错,只有一台journalnode返回成功,其他两台没有响应,触发了namenode的shutdownHook,导致namenode进程中止。

进而排查journalnode 日志,发现是三个节点都正常完成了edits文件写入

2023-05-29 22:01:00,255 INFO  server.Journal (Journal.java:scanStorageForLatestEdits(211)) - Latest log is EditLogFile(file=/hadoop/hdfs/journal/journalid/current/edits_inprogress_0000000000008180981,first=0000000000008180981,last=0000000000008180985,inProgress=true,hasCorruptHeader=false) ; journal id: journalid
2023-05-29 22:01:00,308 INFO  server.Journal (Journal.java:getSegmentInfo(740)) - getSegmentInfo(8180981): EditLogFile(file=/hadoop/hdfs/journal/journalid/current/edits_inprogress_0000000000008180981,first=0000000000008180981,last=0000000000008180985,inProgress=true,hasCorruptHeader=false) -> startTxId: 8180981 endTxId: 8180985 isInProgress: true ; journal id: journalid
2023-05-29 22:01:00,308 INFO  server.Journal (Journal.java:prepareRecovery(784)) - Prepared recovery for segment 8180981: segmentState { startTxId: 8180981 endTxId: 8180985 isInProgress: true } lastWriterEpoch: 92 lastCommittedTxId: 8180984 ; journal id: journalid
2023-05-29 22:01:00,378 INFO  server.Journal (Journal.java:getSegmentInfo(740)) - getSegmentInfo(8180981): EditLogFile(file=/hadoop/hdfs/journal/journalid/current/edits_inprogress_0000000000008180981,first=0000000000008180981,last=0000000000008180985,inProgress=true,hasCorruptHeader=false) -> startTxId: 8180981 endTxId: 8180985 isInProgress: true ; journal id: journalid
2023-05-29 22:01:00,378 INFO  server.Journal (Journal.java:acceptRecovery(872)) - Skipping download of log startTxId: 8180981 endTxId: 8180985 isInProgress: true: already have up-to-date logs ; journal id: journalid
2023-05-29 22:01:00,386 WARN  util.AtomicFileOutputStream (AtomicFileOutputStream.java:close(96)) - Unable to delete tmp file /hadoop/hdfs/journal/journalid/current/paxos/8180981.tmp
2023-05-29 22:01:00,386 INFO  server.Journal (Journal.java:acceptRecovery(905)) - Accepted recovery for segment 8180981: segmentState { startTxId: 8180981 endTxId: 8180985 isInProgress: true } acceptedInEpoch: 93 ; journal id: journalid
2023-05-29 22:01:00,424 INFO  server.Journal (Journal.java:finalizeLogSegment(634)) - Validating log segment /hadoop/hdfs/journal/journalid/current/edits_inprogress_0000000000008180981 about to be finalized ; journal id: journalid
2023-05-29 22:01:00,426 INFO  namenode.FileJournalManager (FileJournalManager.java:finalizeLogSegment(143)) - Finalizing edits file /hadoop/hdfs/journal/journalid/current/edits_inprogress_0000000000008180981 -> /hadoop/hdfs/journal/journalid/current/edits_0000000000008180981-0000000000008180985
2023-05-29 22:01:00,566 INFO  namenode.TransferFsImage (TransferFsImage.java:copyFileToStream(396)) - Sending fileName: /hadoop/hdfs/journal/journalid/current/edits_0000000000008180981-0000000000008180985, fileSize: 1048576. Sent total: 1048576 bytes. Size of last segment intended to send: -1 bytes.

继续排查发现三台journalnode的的edits文件不一致,联想到一线反馈前期集群namenode重启过多次,结合Ambari告警,已经几个月没有checkpoint了,猜测可能导致edits文件与fsimage文件不匹配,导致的问题。于是决定手动重新大家standby namenode与journalnode。

重新搭建journal node

  • 停止两个namenode,停止3个journal node
  • 清空journal node current目录中所有的edits文件,包括已完成的和inprogress的
  • 启动journal node

重新搭建standby namenode

  • 清空standby namenode current目录,保留seen_txid与VERSION文件
  • 从active namenode中同步一份最新的fsimage与对应的md5过来,修改文件属组为hdfs:hadoop
  • 启动standby namenode,等待它从journal node同步edits文件,自动合并fsimage

问题解决

重新搭建journalnode 和standby namenode之后,namenode已正常运行超过24h,问题解决


http://www.niftyadmin.cn/n/379078.html

相关文章

关于字节对齐的总结

1、结构体字节对齐遵循的原则 某数据类型的变量存放的地址需要按有效对齐字节剩下的字节数可以被该数据类型所占字节数整除,char可以放在任意位置,int存放在剩下字节数可以被4整除的位置。这个对齐规则是内部一定的 结构体的大小一定要为有效对齐值的整…

【数据结构】插入排序详细图解(一看就懂)

💯 博客内容:【数据结构】插入排序详细图解(一看就懂) 😀 作  者:陈大大陈 🦉所属专栏:数据结构笔记 🚀 个人简介:一个正在努力学技术的准前端,…

centos 7.9 安装 postgresql 9.3.25 安装步骤(安装包)

centos 7.9 安装 postgresql 9.3.25 安装步骤(安装包) 如果你有 PostgreSQL 9.3.25 的安装包并且没有网络连接,你可以按照以下步骤在 CentOS 7.9 上安装 PostgreSQL: 1.将 PostgreSQL 9.3.25 的安装包上传到 CentOS 服务器上。假设安装包名为 postgres…

ARM-FS6818-点亮LED灯

点亮LED灯 1.开发板介绍 2.cpu控制硬件原理 六大指令里边,只有内存访问指令能访问cpu之外的内容。那cpu如何控制硬件? *load/store指令-->操作4G内存 任何一个芯片都有一个地址映射表。告诉地址空间是如何映射的,便于我们找到对应的硬件地…

Jenkins——maven 插件配置

文章目录 一、Maven 的集成二、在执行job的机器上安装好maven三、下载 maven 插件四、配置全局工具五、Maven 相关使用1、新建 job2、自由风格 job 中命令行使用 mvn 命令3、构建操作 一、Maven 的集成 在 Jenkins 上构建 Java 项目时需要使用 Maven 来进行构建打包 二、在执…

《计算机组成原理》唐朔飞 第8章 CPU的结构和功能 - 学习笔记

写在前面的话:此系列文章为笔者学习计算机组成原理时的个人笔记,分享出来与大家学习交流。使用教材为唐朔飞第3版,笔记目录大体与教材相同。 网课 计算机组成原理(哈工大刘宏伟)135讲(全)高清_…

kubernetes安装dashboard教程

kubernetes安装dashboard教程 前提: kubernetes集群安装完毕 安装: 1.到github获取配置文件 github下面给出方法说使用下面的直接执行就可以了,但是最近不知道为何找不到地址。 kubectl apply -f https://raw.githubusercontent.com/ku…

关于分数的二进制原反补码的求解

话不多说,上例子 求-53/64的原反补; 前奏:-53/64可以分解为符号位“-”和数字位53/64; 第一步:在计算机中,符号位用0表示“”用1表示“-” 第二步:求53/64的二进制数,过程如下图…