BUG修复:HDFS-13112

这两天排查了小集群Crash的问题,这里先总结下这两天排查的结果

一、查看日志

首先查看了Namenode Crash的时候的日志

(一)以下是patch hdfs-11306输出的日志:可以看出还保存在bufCurrent中的op是CancelDelegationTokenOp

2019-09-10 03:50:16,403 WARN org.apache.hadoop.hdfs.server.namenode.EditsDoubleBuffer: The edits buffer is 85 bytes long with 1 unflushed transactions. Below is the list of unflushed transactions:

2019-09-10 03:50:16,408 WARN org.apache.hadoop.hdfs.server.namenode.EditsDoubleBuffer: Unflushed op [0]: CancelDelegationTokenOp [token=token for yarn: HDFS_DELEGATION_TOKEN owner=yarn/chdd520.bigdata.pab.com.cn@PASC.COM, renewer=yarn, realUser=, issueDate=1567970236988, maxDate=1568575036988, sequenceNumber=621170591, masterKeyId=108, opCode=OP_CANCEL_DELEGATION_TOKEN, txid=5061382841]

2019-09-10 03:50:16,409 FATAL org.apache.hadoop.hdfs.server.namenode.FSEditLog: Error: finalize log segment 5060982535, 5061382841 failed for required journal (JournalAndStream(mgr=QJM to [10.0.67.216:8485, 10.0.67.217:8485, 10.0.67.218:8485], stream=QuorumOutputStream starting at txid 5060982535))

java.io.IOException: FSEditStream has 85 bytes still to be flushed and cannot be closed.

(二)以下是patch hdfs-11292输出的日志:

2019-09-10 03:46:03,830 INFO org.apache.hadoop.hdfs.server.namenode.FSEditLog: logSyncAll toSyncToTxId=5060853010 lastSyncedTxid=5060853007 mostRecentTxid=5060853010

2019-09-10 03:46:03,864 INFO org.apache.hadoop.hdfs.server.namenode.FSEditLog: Done logSyncAll lastWrittenTxId=5060853010 lastSyncedTxid=5060853010 mostRecentTxid=5060853010

2019-09-10 03:48:10,273 INFO org.apache.hadoop.hdfs.server.namenode.FSEditLog: logSyncAll toSyncToTxId=5060982534 lastSyncedTxid=5060982511 mostRecentTxid=5060982534

2019-09-10 03:48:10,290 INFO org.apache.hadoop.hdfs.server.namenode.FSEditLog: Done logSyncAll lastWrittenTxId=5060982534 lastSyncedTxid=5060982534 mostRecentTxid=5060982534

2019-09-10 03:50:16,323 INFO org.apache.hadoop.hdfs.server.namenode.FSEditLog: logSyncAll toSyncToTxId=5061382825 lastSyncedTxid=5061371306 mostRecentTxid=5061382825

2019-09-10 03:50:16,402 INFO org.apache.hadoop.hdfs.server.namenode.FSEditLog: Done logSyncAll lastWrittenTxId=5061382841 lastSyncedTxid=5061382840 mostRecentTxid=5061382841

以上每两行是一组操作,表示一次rolleditlog同步的日志,从日志中我们可以发现问题

正常情况下,第一行的toSyncToTxId(5060853010)是等于第二行的lastWrittenTxId(5060853010),toSyncToTxId(5060853010)表示OP_END_LOG_SEGMENT的txid,代表一个editlog文件最后一个操作

但是在出错的情况下,第一行的toSyncToTxId(5061382825)是不等于第二行的lastWrittenTxId(5061382841),表示在rolleditlog将OP_END_LOG_SEGMENT写入缓冲区后,还有其他线程在写,即rolleditlog和其他线程同时工作。这个现象从已有的认知是不可能发生,我们下面可以分析下。另外lastWrittenTxId(5061382841)与 lastSyncedTxid(5061382840)不等,也说明还有数据没持久化。

下面我们看下一般操作的流程:

可以看到处理setAcl 的Handler线程在logSync的flush阶段,处理setPermission的Handler线程是有机会把op写入缓冲区的

 

SetAcl Thread

SetPermission Thread

fslock.writerlock.lock

have not fslock.writerlock

SetAcl operation

FSEditlog.logEdit()

FSEditLog synchronized enter

txid++

editLogStream.write(op)

FSEditLog synchronized exit

 

fslock.writerlock.unlock

FSEditLog.logSync()

FSEditLog synchronized enter

fslock.writerlock.lock

while mytxid > synctxid && isSyncRunning -> wait
mytxid <= synctxid return
isSyncRunning=true

SetPermission operation

FSEditLog synchronized
exit

 

editLogStream.flush()

FSEditLog synchronized
enter

 

txid++

 

editLogStream.write(op)

 

FSEditLog synchronized
exit

FSEditLog synchronized
enter

fslock.writerlock.unlock

isSyncRunning=false

 

FSEditLog synchronized
exit

 

 

SetAcl Finished

FSEditLog synchronized
enter

while mytxid >
synctxid && isSyncRunning -> wait
mytxid <= synctxid return
isSyncRunning=true

FSEditLog synchronized
exit

editLogStream.flush()

FSEditLog synchronized
enter

isSyncRunning=false

FSEditLog synchronized
exit

然后看下当发生rolleditlog时的情况

由于rolleditlog整个操作都在fslock内,所以处理setPermission的Handler线程是没有任何机会进行任何操作的

 

rolleditlog Thread

SetPermission Thread

fslock.writerlock.lock

have not
fslock.writerlock

FSEditLog synchronized
enter

endCurrentLogSegment

logedit(OP_END_LOG_SEGMENT)

logsync()

finalizeLogSegment

startCurrentLogSegment

logedit(OP_START_LOG_SEGMENT)

logsync()

 

FSEditLog synchronized
exit

fslock.writerlock.unlock

二-查看监控

查看ganglia监控,发现在发生crash的时候,journalnode的每秒txid的写入量都很大

chdd374在9月8日的06:48左右

chdd374在9月10日的03:50左右

然后发现其实每隔一小时,都有这个高峰

登录服务器验证editlog文件大小,可以看到15:53和16:52的文件大小确实比其他文件大很多

使用edilog工具查看,发现OP_CANCEL_DELEGATION_TOKEN的操作有55W

查看服务端日志,namenode Crash的时候,并没有cancleDelegationToken RPC请求处理的相关日志,说明记录cancleDelegationToken操作还有其他地方

继续查看源码,终于发现产生这么多cancleDelegationToken的原因:

Namenode里有个DelegationTokenSecretManager,会每隔一小时删除过期的token,而删除过期token的操作,而调用logEdit将日志记录到缓冲区,而这个操作只获取了FSEditlog锁对象,但是没有获取FSLock的写锁,而rolleditlog操作在logedit和logsync都有可能释放锁,这样DelegationTokenSecretManager就有机会将删除token的操作写入缓冲区,从而导致最开始的日志错误

明天会先看下高版本hadoop代码中,这个流程是否还是这样;然后看下为什么会有这么多过期的delegationToken,基本一台机器对应的delegationToken有900多次操作,我们有490台,差不多总计55W。然后考虑下怎么修复这个问题

Namenode服务挂的更多相关文章

  1. hadoop集群namenode同时挂datanode

    背景:(测试环境)只有两台机器一台namenode一台namenode,但集群只有一个结点感觉不出来效果,在namenode上挂一个datanode就有两个节点,弊端见最后 操作非常简单(添加独立节点 ...

  2. 【SQLSERVER】服务挂起解决办法

    一. 问题描述:某项SQLSERVER服务,运行状态为“正在挂起更改”,导致该服务无法使用,也不能启动.停止.重新启动. 二.解决方法 方法一:从任务管理器 → 进程 (勾上 显示所有用户进程) → ...

  3. VS2013开发 windows服务 挂到服务器上执行

    这是百度经验的链接,本人主要参考的他.http://jingyan.baidu.com/article/cd4c2979e9330d756f6e6070.html 1 创建windows服务项目 2 ...

  4. 服务挂后Dump日志

    JAVA_HOME=/usr/java OUTPUT_HOME=~/output DEPLOY_HOME=`dirname $0` HOST_NAME=`hostname` DUMP_PIDS=`ps ...

  5. NameNode和SecondaryNameNode工作原理剖析

    NameNode和SecondaryNameNode工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.NameNode中的元数据是存储在那里的? 1>.首先,我 ...

  6. hadoop namenode ha--手动切换(转)

    1.hadoop的dfs.nameservices如何配置?2.集群配置中hdfs://mycluster的作用是什么?3.如何将namenode2切换为active状态? 在参考本手册前请确保Had ...

  7. HDFS 2中Namenode启动时WebUI的变化

      在HDFS1中NameNode启动顺序是这样的: 1. 读取Fsimage文件 2. 读取edit logs文件,逐行执行里面的操作 3. 写checkpoint,生成新的Fsimage(老的Fs ...

  8. Window服务项目脚手架

    本人最近工作用到window服务程序,于是尝试分享下经验,开源了一个window服务脚手架项目,把window服务程序必不可少的组件集成进去,如日志组件log4net,window服务挂在后台,用日志 ...

  9. 大数据框架hadoop服务角色介绍

    翻了一下最近一段时间写的分享,DKHadoop发行版本下载.安装.运行环境部署等相关内容几乎都已经写了一遍了.虽然有的地方可能写的不是很详细,个人理解水平有限还请见谅吧!我记得在写DKHadoop运行 ...

随机推荐

  1. 网络编程之NIO

    传统的BIO(Blocking IO)的缺点: 1.基于阻塞式IO建立起来的,导致服务端一直阻塞等待着客户端发起请求,如果客户端不发起,服务端的的业务线程会一直存. 2.弹性伸缩能力差,线程数和客户端 ...

  2. vue-cli3 本地数据模拟后台接口

    vue-cli3 本地数据模拟后台接口 原理: 将本地的json数据在前端模拟为后台接口,然后调用接口,完成前端操作.在后台接通后可以直接在api配置文件中修改路径,完成前后台对接. 配置: 1.文件 ...

  3. HTML Ueditor图片宽度超出编辑器

    问题描述 Ueditor上传图片宽度尺寸超出编辑器宽度,显示异常 解决方案 ueditor.all.js 添加img宽度限制(搜索body{margin:8px;font-family:sans-se ...

  4. Nginx如何配置禁止访问某个目录

    location ~* \.(txt|doc)${ root /data/www/wwwroot/test; deny all; }

  5. win10 增加一个新磁盘

    1.右键我的电脑,选择管理 可以看到C盘的空间相比较大,拿出来250G的空间做成E盘 2.选择OS(C:),右键,压缩卷,请稍后,点击压缩 3.此刻会看到,有一块黑色区域就是新建的未分配空间,这时我们 ...

  6. 随意软连接/home/users目录导致环境变量消失后的事故

    1 自己的用户zj下,把/home/zj 删除后用ln -s软连接其他目录,导致了当前用户的.bash_profile失效 2 解决思路 第一,删除软连接 rm -rf /home/zj   记住后面 ...

  7. 目标检测之RefineDet

    RefineDet 一.相关背景 中科院自动化所最新成果,CVPR 2018 <Single-Shot Refinement Neural Network for Object Detectio ...

  8. 解读Position

    首先Position在字面讲是位置的意思,在HTML中是定位的意思,它有四种属性:分别是static是静态的,也是默认的效果,没有特别的设定,遵循基本的定位规定,不能通过z-index进行层次分级. ...

  9. CSS基础学习 17.CSS动画

  10. 移动端性能监控方案Hertz

    移动端性能监控方案Hertz 吴凯 瑞利 富强 徐宏 ·2016-12-19 16:10 性能问题是造成App用户流失的罪魁祸首之一.App的性能问题包括崩溃.网络请求错误或超时.响应速度慢.列表滚动 ...