hdfs datanode decomission引发的block missing

最近在帮公司下线离线计算集群的机器,逐台decomiss,下到第四台机器时,cdh告警来了,丢失块大于集群的1%,算了一下集群有400多台,下线一台不应该告警,以为下线步骤有问题,点了中止下线,后来看了下其实步骤是没问题的,由于下线的机器配置比较好,所以确实这台机器上存储了集群1%以上的block,于是终止了datanode的decomission,但是集群还是出现了14个 missing block,按照常理,hdfs上的文件丢失副本只要不是所有副本全丢,过段时间hdfs都会把这些副本从其他节点copy一份,但是这些block随着时间的增加永远不会恢复。
确认了下线步骤没有问题以后,选择原来的datanode继续decomission,但是这一步会一直卡住,不会完成,看了下datanode的日志,确实是在移动数据,但是看节点的io很小,完全达不到正常下线节点时的io。于是这个节点先略过,下线其他节点,发现也出现同样情况,看来继续下线是不行了。
看了一下clouddera社区的一个issue,这好像是cdh的一个bug,上面cdh的官方人员说要把datanode删掉再重新加回来就可以下线了。
于是我把datanode停了,通过cdh监控按到节点上的block全部复制完以后,直接把datanode删除掉了, 没有走正常decomission的流程。弄完之后去hdfs的监控看了下,这个节点直接没了,也不会存在僵死的节点。那就不用再安装回来重新decomission一遍了。用如此的方式,把下线节点的工作都完成之后。来好好查看一下这个问题。
丢块的提示是在hdfs的ui看到的

既然有丢块,那我们就用hdfs fsck /这个命令检查一下,检查的结果竟然没有丢失块,
于是用hdaoop dfsadmin -report 这个命令检查了一下,提示说丢失了14个block,检查的结果是和hdfs界面上的提示是相符的。
既然2个命令的结果不同,那就说明至少有一个是有问题的,所以2个命令都被假设有可能结果是不准确的。
后来通过了解还有一种可能就是文件在被写入的过程中client异常挂掉了,导致租约没有释放,写入没有正常关闭,也有可能造成块无法使用。
参考https://www.cnblogs.com/cssdongl/p/6700512.html
如果这种情况,可以通过hdfs debug recoverLease -path <path-of-the-file> -retries <retry times> 可以恢复文件租约。
但是我们只知道有block有问题,不知道这些块属于哪些文件,怎么验证我们的猜想呢
通过命令 hdfs fsck / -openforwrite |grep -i openforwrite |awk ‘{print $1}‘,把当前正在写入的文件找出来,写个循环脚本,对里面的文件进行恢复租约,
就可以对所有被正在写入的文件去恢复租约,脚本运行完之后,果然这些block missing消失了。

原文地址:https://blog.51cto.com/xiaolanlan/2472323

时间: 2024-11-10 11:03:18

hdfs datanode decomission引发的block missing的相关文章

Datanode启动问题 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool &lt;registering&gt;

2017-04-15 21:21:15,423 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: supergroup = supergroup 2017-04-15 21:21:15,467 INFO org.apache.hadoop.ipc.CallQueueManager: Using callQueue: class java.util.concurrent.LinkedBlockingQueue queueCapacity:

hdfs datanode 启动失败

hadoop-root-datanode-ubuntu.log中: 2015-03-12 23:52:33,671 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to localhost/127.0.0.1:9000. Exiting.java.io.IOExc

Hadoop学习笔记_7_分布式文件系统HDFS --DataNode体系结构

分布式文件系统HDFS --DataNode体系结构 1.概述 DataNode作用:提供真实文件数据的存储服务. 文件块(block):最基本的存储单位[沿用的Linux操作系统地概念].对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block. 与Linux操作系统不同的是,一旦上传了一个小于Block大小的文件,则该文件会占用实际文件大小的空间. 2.进入hdfs-default.xml <prope

HDFS概述(1)————Block块大小设置

以下内容转自:http://blog.csdn.net/samhacker/article/details/23089157?utm_source=tuicool&utm_medium=referral http://snglw.blog.51cto.com/5832405/1643587 小文件BLOCK占用 [小于块大小的小文件不会占用整个HDFS块空间.也就是说,较多的小文件会占用更多的NAMENODE的内存(记录了文件的位置等信息):再者,在文件处理时,可能会有较大的网络开销.] 一个常

后端分布式系列:分布式存储-HDFS DataNode 设计实现解析

前文分析了 NameNode,本文进一步解析 DataNode 的设计和实现要点. 文件存储 DataNode 正如其名是负责存储文件数据的节点.HDFS 中文件的存储方式是将文件按块(block)切分,默认一个 block 64MB(该大小可配置).若文件大小超过一个 block 的容量可能会被切分为多个 block,并存储在不同的 DataNode 上.若文件大小小于一个 block 的容量,则文件只有一个 block,实际占用的存储空间为文件大小容量加上一点额外的校验数据.也可以这么说一个

Hadoop之HDFS(DataNode) (面试开发重点)

1 DataNode工作机制 DataNode工作机制,如图所示. 1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳. 2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息. 3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块.如果超过10分钟没有收到某个DataNode的

HDFS概述(2)————Block块大小设置

参考: HDFS概述(4)----HDFS权限 HDFS概述(3)----HDFS Federation HDFS概述(1)----HDFS架构 问题 Q: 一个常被问到的一个问题是: 如果一个HDFS上的文件大小(file size) 小于块大小(block size) ,那么HDFS会实际占用Linux file system的多大空间? A: 答案是实际的文件大小,而非一个块的大小. 以下内容转自: http://blog.csdn.net/samhacker/article/detail

hdfs datanode通过添加数据盘扩容

最近,在生产环境中,hdfs集群数据量已达到存储的90%,亟需对存储空间进行扩容. 通过调研和实验,确定添加datanoe的存储目录比较适合我们的生产环境!在这里记录一下添加数据目录的过程. 第一步:备份hdfs-site.xml配置文件 cp hdfs-site.xml hdfs-site.xml.20190330.bak 第二步:添加数据磁盘.格式化,并挂载到/data2目录 #格式化磁盘mkfs.ext4 /dev/sdb #挂载磁盘到/data2mount -t ext4 /dev/sd

记一次HDFS的block corrupt事件

还有最后两天班,明天晚上回家过年了,可是CDH突然报了一个block missing的错误,用 hdfs fsck /检查了一下,我们的块一共有500W个,missing了将近100W个,天呐,不过由于Hdfs的replication的机制,只要不是3份全丢就可以修复,这样,绝大部分的块都修复了,但是还是有3000多个块是3份都丢失了,3份全丢后,状态就为corrupt,直接导致小时报和日报收到影响,很多用户hive和impala查询直接报错了. 我和少华还有兆国赶紧去查找原因,先看了下CDH上