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. DateTime.TryParse 日期时间字符串验证

    DateTime applicationDatetime = new DateTime(); bool applicationDate = DateTime.TryParse("2019-0 ...

  2. poj 3468 整理一下线段树的写法

    // 对于延迟更新,我们在updata 和query的时候 pushdown和pushup两个东西都要存在 #include <iostream> #include <cstdio& ...

  3. TCP协议探究(一):报文格式与连接建立终止

    一 TCP:传输控制协议报文格式 1 TCP服务 提供面向连接.可靠的字节流服务 面向连接意味着两方通信,不支持多播和广播 可靠性的支持: 应用数据被分割成TCP认为最适合发送的数据块.由TCP传递给 ...

  4. Linux环境下安装Nginx及其使用

    https://www.jb51.net/article/136161.htm 一.查看CentOS的版本 ? 1 cat /etc/redhat-release 二.添加资源库 在 CentOS 系 ...

  5. C++性能榨汁机之虚函数的开销

    C++性能榨汁机之虚函数的开销 来源  http://irootlee.com/juicer_vtable/ 虚函数的实现 虽然C++标准并没有规定编译器实现虚函数的方式,但是大部分编译器均是采用了虚 ...

  6. C++ 构造函数后面的冒号的作用

    其实冒号后的内容是初始化成员列表,一般有三种情况:     1.对含有对象成员的对象进行初始化,例如,     类line有两个私有对象成员startpoint.endpoint,line的构造函数写 ...

  7. 一个SDL2.0程序的分析

    //把图片加载到SDL_Texture SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){       ...

  8. 抽奖JQ

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  9. 流媒体服务器搭建 ffmpeg + nginx

    第一部分: mkdir ~/working 切换到~/working目录下 cd ~/working 获取nginx源码: wget http://nginx.org/download/nginx-1 ...

  10. Codeforces 845G Shortest Path Problem?

    http://codeforces.com/problemset/problem/845/G 从顶点1dfs全图,遇到环则增加一种备选方案,环上的环不需要走到前一个环上作为条件,因为走完第二个环可以从 ...