Namenode服务挂
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 |
SetPermission operation |
|
|
FSEditLog synchronized |
|
|
|
editLogStream.flush() |
FSEditLog synchronized |
|
|
|
txid++ |
|
|
|
editLogStream.write(op) |
|
|
|
FSEditLog synchronized |
|
|
FSEditLog synchronized |
fslock.writerlock.unlock |
|
|
isSyncRunning=false |
|
|
|
FSEditLog synchronized |
|
|
|
|
SetAcl Finished |
FSEditLog synchronized |
|
while mytxid > |
||
|
FSEditLog synchronized |
||
|
editLogStream.flush() |
||
|
FSEditLog synchronized |
||
|
isSyncRunning=false |
||
|
FSEditLog synchronized |
然后看下当发生rolleditlog时的情况
由于rolleditlog整个操作都在fslock内,所以处理setPermission的Handler线程是没有任何机会进行任何操作的
|
|
rolleditlog Thread |
SetPermission Thread |
|
fslock.writerlock.lock |
have not |
|
|
FSEditLog synchronized |
||
|
endCurrentLogSegment |
logedit(OP_END_LOG_SEGMENT) |
|
|
logsync() |
||
|
finalizeLogSegment |
||
|
startCurrentLogSegment |
logedit(OP_START_LOG_SEGMENT) |
|
|
logsync() |
||
|
|
FSEditLog synchronized |
|
|
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服务挂的更多相关文章
- hadoop集群namenode同时挂datanode
背景:(测试环境)只有两台机器一台namenode一台namenode,但集群只有一个结点感觉不出来效果,在namenode上挂一个datanode就有两个节点,弊端见最后 操作非常简单(添加独立节点 ...
- 【SQLSERVER】服务挂起解决办法
一. 问题描述:某项SQLSERVER服务,运行状态为“正在挂起更改”,导致该服务无法使用,也不能启动.停止.重新启动. 二.解决方法 方法一:从任务管理器 → 进程 (勾上 显示所有用户进程) → ...
- VS2013开发 windows服务 挂到服务器上执行
这是百度经验的链接,本人主要参考的他.http://jingyan.baidu.com/article/cd4c2979e9330d756f6e6070.html 1 创建windows服务项目 2 ...
- 服务挂后Dump日志
JAVA_HOME=/usr/java OUTPUT_HOME=~/output DEPLOY_HOME=`dirname $0` HOST_NAME=`hostname` DUMP_PIDS=`ps ...
- NameNode和SecondaryNameNode工作原理剖析
NameNode和SecondaryNameNode工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.NameNode中的元数据是存储在那里的? 1>.首先,我 ...
- hadoop namenode ha--手动切换(转)
1.hadoop的dfs.nameservices如何配置?2.集群配置中hdfs://mycluster的作用是什么?3.如何将namenode2切换为active状态? 在参考本手册前请确保Had ...
- HDFS 2中Namenode启动时WebUI的变化
在HDFS1中NameNode启动顺序是这样的: 1. 读取Fsimage文件 2. 读取edit logs文件,逐行执行里面的操作 3. 写checkpoint,生成新的Fsimage(老的Fs ...
- Window服务项目脚手架
本人最近工作用到window服务程序,于是尝试分享下经验,开源了一个window服务脚手架项目,把window服务程序必不可少的组件集成进去,如日志组件log4net,window服务挂在后台,用日志 ...
- 大数据框架hadoop服务角色介绍
翻了一下最近一段时间写的分享,DKHadoop发行版本下载.安装.运行环境部署等相关内容几乎都已经写了一遍了.虽然有的地方可能写的不是很详细,个人理解水平有限还请见谅吧!我记得在写DKHadoop运行 ...
随机推荐
- 怎样获取当前文档所有的元素节点(即html标签节点)
方法1. 使用 document.getElementsByTagName("*"); 方法2. 使用document.querySelectorAll("*" ...
- 复习最短路 spfa+dijstra堆优化
题目很简单,, 但是wa了三次,, 用<vector>之前一定要记得clear()...简单说下 spfa的问题 和bell_forman有点类似 每次取出一个点 然后更新 并把更新了的节 ...
- Java实现发邮件功能---网易邮箱
目录 Java实现发邮件功能 前言 开发环境 代码 效果 结束语 Java实现发邮件功能 前言 电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单.通过邮件找回密码.监听后台程序,出现异常自 ...
- Redis缓存策略设计及常见问题
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选 ...
- PCQQ - 发送自定义的XML卡片消息
效果: 原理: qq分享产生的xml卡片消息存储在qq内存中,可以在qq运行内存中搜索找到其xml源码,记录源码相应的内存地址,通过内存地址修改掉内存数据,再次转发这条分享的消息就会发现内容的变化. ...
- iPhone 11来了
- EasyUi Datagrid中footer renderFooter
默认的'rowStyler' 选项不支持footer,想让footer支持rowStyler的话,dategird就得重写.代码如下. var myview = $.extend({}, $.fn.d ...
- shell字符串处理
一.字符串切片: ${#var}:返回字符串变量var的长度${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offse ...
- python渗透测试工具集
下载地址:https://github.com/githubmaidou/tools
- [ZJOI2019]语言——树剖+树上差分+线段树合并
原题链接戳这儿 SOLUTION 考虑一种非常\(naive\)的统计方法,就是对于每一个点\(u\),我们维护它能到达的点集\(S_u\),最后答案就是\(\frac{\sum\limits_{i= ...