Datanode的磁盘写满了怎么办?

2023-11-22 20:10
文章标签 磁盘 datanode 写满

本文主要是介绍Datanode的磁盘写满了怎么办?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【背景】


回家路上,接到运维兄弟的电话,说一线上环境,某个DN异常了,原因是有个磁盘写满了,他准备将这个盘剔除出去,重启下DN,问我数据会不会丢失。

我说数据不会丢,我们的数据都是多副本的。

这位兄弟再三确认不会丢数据后,挂了电话就去操作了。

可我回头一想,磁盘异常导致DN异常倒是碰到过,磁盘写满也能导致DN异常?

带着疑问做了一番梳理,接下来我们就来聊聊。

【DN运行过程中磁盘写满会怎样】


首先,DN运行时,单块磁盘写满,是否会引发问题?

答案是不会的,DN内部处理写block逻辑时,会过滤可用空间不满足条件的磁盘(准确的说法应该是卷目录,但一般而言DN会配置多个卷目录,不同的目录位于不同的磁盘上,为了方面理解,后面都先称为磁盘)。

例如:先将某个磁盘写满(如下图所示)

7eb422a6d0ae51ae0cf592e5223778f0.png

此后,继续向hdfs写入文件,发现写入的文件都正常,已经写满的磁盘不会继续存储新的数据

72a3e4a438da43ca9c7d8e389389fe96.png

【DN写block时的磁盘分配策略】


DN中磁盘分配有两种策略:轮询分配和按可用容量分配。

  • 轮询分配

    顾名思义,就是从配置的磁盘中,轮流选择一个作为block的存储位置。

    当然,选择的磁盘的时候,会进行一次容量的判断,如果不满足条件,则跳过该磁盘。

    对应源码为RoundRobinVolumeChoosingPolicy类的chooseVolume函数中。关键代码如下所示:

    while (true) {final V volume = volumes.get(curVolume);curVolume = (curVolume + 1) % volumes.size();long availableVolumeSize = volume.getAvailable();if (availableVolumeSize > blockSize) {return volume;}if (availableVolumeSize > maxAvailable) {maxAvailable = availableVolumeSize;}if (curVolume == startVolume) {throw new DiskOutOfSpaceException("Out of space: "+ "The volume with the most available space (=" + maxAvailable+ " B) is less than the block size (=" + blockSize + " B).");}
    }
  • 按可用容量分配

    该策略先按照一定的计算方式将所有磁盘划分为高可用容量和低可用容量两部分(先计算所有磁盘中的最小可用容量Min,对于可用容量小于等于Min加指定容量大小的磁盘就属于低可用容量)。

    然后根据block数据的大小,从中选择不同的部分,最后再轮询选择一个具体的磁盘作为最终存储block的路径。

    相比轮询策略而言,该策略有了一定优化,能一定程度保证磁盘间存储空间的平衡。

    核心代码在AvailableSpaceVolumeChoosingPolicy类中(篇幅原因,就不全部贴出来了,可自行查看)

【磁盘写满可能存在的潜在问题】


既然单个盘写满不会引发什么问题,那是不是意味着没什么隐患,完全不用管了呢?

显然不是这样的,磁盘写满可能存在一些潜在问题。

例如,如果dn直接使用系统盘(根目录所在盘)作为数据存储路径,那么系统盘写满,可能导致部分命令无法执行,从而引发一些问题。

如果NodeManager和Datanode运行在一个结点上,并且配置了相同的磁盘目录,那么单个磁盘写满,可能导致NodeManager处于unhealth状态,从而引起该结点无法运行yarn任务(原因可以从这篇文章中找答案)。

【处理和规避方法】


对于磁盘写满,我们该如何处理呢?

在Hadoop3.0版本之前,我们只能停止DN,然后将一部分block数据从写满的磁盘目录移动到另外一个磁盘的相同目录下,最后再启动DN完成数据加载。

例如,如下图所示,两个目录均有数据

00df91577eecfeed00e4590c5a6d66b3.png

将一个目录的block数据移动到另外一个目录下(两个目录在不同的磁盘上),这样DN重新启动后,其存储的block数据仍旧不变。

5048e1f1002063006192ed93535bbc88.png

这里有几个注意事项:

  • 移动后的目录(即目的目录)也必须是dn用于存储block的卷目录,即配置项

    dfs.datanode.data.dir指定目录集合中的其中一个目录。

  • 允许按需以block为单位进行移动,但是block存储的路径必须保持一致,同时必须将block数据文件和block的checksum文件一起移动。(原因可以从这篇文章中找答案)

hadoop3.0之后的版本,自带提供了disk balance 命令行工具,可以对dn磁盘进行均衡处理,这里不展开介绍,有兴趣的可以看看官网文档。

上面讲了磁盘已经写满要如何处理,那么更好的一种方式是事前进行规避。

一种简单有效的方式是,通过对磁盘空间进行一定预留,确保不会写满,hadoop也确实提供了相应功能的配置:

dfs.datanode.du.reserved

该配置作用于每个存储block的磁盘,进行一定空间的预留。

【总结】


回过头,再看运维兄弟给我反馈的问题,说磁盘写满导致DN异常,应该是不会出现这种情况的。

第二天重新找该兄弟进行了确认,确认了是磁盘故障,而不是磁盘写满导致。

好了,本文就介绍到这里,原创不易,点赞,在看,分享是最好的支持, 谢谢~

2ed2af7cb8da019465d3eefa5bd5abe8.png

这篇关于Datanode的磁盘写满了怎么办?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412619

相关文章

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

Linux 安全弹出外接磁盘

命令行操作 首先,需要卸载硬盘上的所有分区,可以使用umount来卸载分区 清空系统缓存,将所有的数据写入磁盘 sync 列出已挂载的文件系统 使用lsblk或者df命令来查找要卸载的分区 lsblk or df -h 确保没有文件正在使用 使用lsof 命令来检查 sudo lsof |grep /dev/sdc 卸载分区 假设硬盘的分区是 /dev/sdc1,使用u

Android/Linux 磁盘写入缓存/等待时间 参数修改

Linux系统当进行文件写操作时,并不会将数据立马写入磁盘,而是写写到缓存,等待达到占用内存一定比例或超过一定时间才会批量将这些缓存数据写入磁盘,这样可以减少IO操作,提升性能和磁盘寿命。如果数据还没来得及写入磁盘发生硬件掉电,这些数据就会丢失。应用可以调用sync实时将内容写入磁盘避免丢失。排查丢失问题可以在断电前执行sync命令,看能不能复现,若无法复现,说明就是缓存没有及时写入磁盘导致。

PageOfficeCtrl支持直接打开服务器磁盘文件

一般来说,PageOfficeCtrl控件的WebOpen方法的第一个参数是待打开文档的URL,此URL可以是相对于当前页面的相对URL,也可以是相对于整个网站根的相对URL,还可以是http开头的完整URL,但是这个URL必须是当前网站的URL,不能跨域。 现在为了更加方便开发者编程,WebOpen支持打开服务器磁盘文件。也就是说,第一个参数可以写成服务器文件的绝对磁盘路径。例如: P

Win10磁盘出现小锁和感叹号的解决办法

很多说在设置-系统安全,但是我的么有,只能上命令了,管理员身份运行powerShell:  su 速度比较慢,耐心等待会,每次查看状态加密的百分比都是减少哦  manage-bde -off G: manage-bde -status

【linux 磁盘管理】Linux磁盘管理常用三个命令为df、du和fdisk。

Linux磁盘管理好坏管理直接关系到整个系统的性能问题。 Linux磁盘管理常用三个命令为df、du和fdisk。 df:列出文件系统的整体磁盘使用量du:检查磁盘空间使用量fdisk:用于磁盘分区 [root@izbp1f0leha0lvmqfhigzpz code]# dfFilesystem 1K-blocks Used Available Use% Mounted

erlang学习:用ETS和DETS存储数据3,保存元组到磁盘

学习内容 ETS表把元组保存在内存里,而DETS提供了把Erlang元组保存到磁盘上的方法。DETS的最大文件大小是2GB。DETS文件必须先打开才能使用,用完后还应该正确关闭。如果没有正确关闭,它们就会在下次打开时自动进行修复。因为修复可能会花很长一段时间,所以先正确关闭它们再结束程序是很重要的。 DETS表有着和ETS表不同的共享属性。DETS表在打开时必须赋予一个全局名称。如果两个或更多

【Hadoop|HDFS篇】DataNode

1. DataNode的工作机制 1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。 2)DataNode启动后向NameNode注册,通过后,周期性(6h)的向NameNode上报所有块信息。 DN向NN汇报当前解读信息的时间间隔,默认6小时。 DN扫描自己节点块信息列表的时间,默认为

Linux df命令详解,Linux查看磁盘使用情况

《网络安全自学教程》 df 一、字段解释二、显示单位三、汇总显示四、指定目录五、指定显示字段六、du和df结果不一样 df(disk free)命令用来查看系统磁盘空间使用情况。 参数: -h:(可读性)显示单位,换算单位1024字节-H:(可读性)显示单位,换算单位1000字节-k:以KB为单位,显示磁盘大小-m:以MB为单位,显示磁盘大小--total:汇总-i:

linux 文件系统与磁盘

总结 文件系统(1)磁道(2)扇区:一个磁道上分多个扇区,目前有 512bytes 和 4k 两种格式(3)分区:把多个扇区组合 做分区,每种分区类型下的分区表决定最大支持的磁盘容量,如MBR,GPT分区(4)文件系统:对每个分区格式化成不同的文件系统,如EXT2(5)inode /block/superblock:文件系统通常将文件数据和文件属性 这两部分数据放置到不同的区块,权限与属性放置到