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. hdu 5446 lucas+crt+按位乘

    http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意:题目意思很简单,要你求C(n,m)mod p的值 p=p1*p2*...pn; 题解:对于C(n,m ...

  2. 【ES6 】ES6 解构赋值--函数参数解构赋值

    函数的参数也可以使用解构赋值. function add([x, y]){ return x + y; } add([1, 2]); 上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻 ...

  3. CSS用户界面样式之cursor/outline/resize

    1. 鼠标样式cursor 检测鼠标指针在对象上移动的鼠标指针采用何种系统预定于的光标形状 常用属性: default 小白 hands小手 /pointer move移动 text文本 2. 轮廓 ...

  4. 兼容各种浏览器的hack写法

    1.Firefox @-moz-document url-prefix() { .selector { property: value; } }上面是仅仅被Firefox浏览器识别的写法 具体如:@- ...

  5. Flutter——Image组件(图片组件)

    Image组件有很多构造函数,这里只说两个. Image.asset  本地图片 1.在根目录新建文件夹 /images 2.在 images 文件夹下建立两个文件夹 /images/2.0x  /i ...

  6. 前端基础(八):Font Awesome(图标)

    一.font awesome简介 目前图标总数共有519个; 不依赖Javascript 矢量图形,无限缩放 免费,可用于商业 CSS控制样式,自定义图标颜色,大小,阴影,一切可能实现的效果 支持re ...

  7. (二十四)Ubuntu16.04配置ADB调试环境

    一.安装adb 1.可以通过 apt-get install android-tools-adb 来安装adb sudo add-apt-repository ppa:nilarimogard/web ...

  8. UCOSII 之 任务统计

    UCOSII 使用空闲任务的计数值(OSIdleCtr)来实现CPU使用率的统计,首先统计一个固定时间内的计数值保存下来为 (MAX),然后再开启一个固定的时间段,当时间到达时得到另外一个(OSIdl ...

  9. TCP 的三次握手和四次挥手,TCP 的流量控制和拥塞控制

    70.TCP协议的三次握手与四次挥手70.1.TCP报文结构   1.源端口号:表示发送端端口号,字段长为16位.  2.目标端口号:表示接收端口号,字段长为16位.  3.序列号:表示发送数据的位置 ...

  10. 05—动态sql

    1.创建表 CREATE TABLE tb_employee ( ID INT(11) PRIMARY KEY AUTO_INCREMENT, loginname VARCHAR(18), PASSW ...