HDFS磁盘写满问题分析

news2024/12/23 13:55:41

HDFS磁盘写满问题分析

  • 1. 问题说明
    • 1.1 namenode常规分配datanode策略
    • 1.2 DFS Used很大时是否能够继续写入数据
  • 2 问题修复
    • 2.1 集群均衡操作
    • 2.2 配置系统预留参数
  • 3. 疑问和思考
    • 3.1. 是否需要配置`dfs.datanode.du.reserved`?
  • 4. 参考文档

探讨hdfs的datanode节点磁盘被写满的原因分析和相关规避方案。关于常见分布式组件高可用设计原理的理解和思考


1. 问题说明

在生产上遇到了这样的一个问题,通过hdfs dfsadmin -report命令可以获取hdfs集群的磁盘使用情况统计信息。

Rack: /idc1
Decommission Status : Normal
Configured Capacity: 35722170777600 (32.49 TB)
DFS Used: 33921395016733 (30.85 TB)
Non DFS Used: 1800771816419 (1.64 TB)
DFS Remaining: 3944448 (3.76 MB)
DFS Used%: 94.96%
DFS Remaining%: 0.00%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 7
Last contact: Sat Mar 16 22:52:41 CST 2024

这里的几个关键信息

  • Configured Capacity: 35722170777600 (32.49 TB),代表当前节点能够使用的最大磁盘容量,由当前节点所有磁盘加合获取
  • DFS Used%: 94.96%,代表当前节点,在hdfs系统中的磁盘使用率,namenode会根据该参数判断该节点是否还能继续写入。由于使用率已经很高,namenode在分析新的数据写入时,通常不会继续给这个节点分配数据(不是绝对)
  • Non DFS Used: 1800771816419 (1.64 TB),指的是DataNode上除了HDFS数据存储之外的其他用途所占用的空间。这可能包括操作系统、日志、临时文件、Hadoop数据缓存等。Non DFS Used很大通常是由于这些因素导致的,可能是由于数据缓存、日志文件或其他临时文件占用了大量空间。
  • DFS Remaining: 3944448 (3.76 MB),指HDFS中尚未使用的剩余存储空间

其中 Configured Capacity = DFS Used + Non DFS Used + DFS Remaining
同时 Configured Capacity = (单个磁盘总量 - dfs.datanode.du.reserved) * 磁盘数量

DFS Used = DFS Used / Configured Capacity

再来看对应节点的磁盘使用情况
在这里插入图片描述
实际上磁盘已经写满,不能继续写入数据。

1.1 namenode常规分配datanode策略

在HDFS中,写入数据时排除不合适的DataNode通常是通过网络拓扑、数据节点状态和负载等信息来实现的。HDFS会根据这些信息选择最佳的DataNode来存储数据。具体细节需要参考HDFS源码中涉及块放置的部分,这里简要概述一下:

  1. 网络拓扑感知:HDFS会考虑数据节点和客户端的网络拓扑位置,尽可能选择靠近客户端的数据节点,以减少网络传输延迟。
  2. 数据节点状态:HDFS会检查数据节点的状态,比如存储容量、负载情况等,避免选择负载过重或不稳定的数据节点。
  3. 块复制因子:HDFS默认会将数据块复制到多个数据节点以实现容错性。在选择数据节点时,会考虑确保块的复制因子得到满足。
  4. 源码实现:具体逻辑涉及HDFS源码中的块放置相关部分,例如在 org.apache.hadoop.hdfs.server.blockmanagement 包中的类。源码涉及块的选择逻辑,包括如何评估数据节点的可用性、负载和网络位置等。详细的源码实现需要在HDFS源代码中查找相关部分。

总的来说,HDFS使用一系列策略来选择最佳的数据节点进行数据写入,以优化性能和可靠性。

1.2 DFS Used很大时是否能够继续写入数据

在hdfs管理磁盘容量中, Non DFS Used占用了很大比例,从而导致DFS Used能够使用的磁盘很小,统计出来的实际 DFS Used使用率只有94.96%

  • 即使DFS Used% 达到94.96%,NameNode仍然会写入数据,因为HDFS的设计并不会在存储接近满时停止写入操作。相反,NameNode会触发一系列措施来管理数据块的复制和移动,以确保系统的正常运行。
  • 当DFS Used% 达到 100% 时,NameNode 将不再写入数据。当存储空间达到饱和时,HDFS 将拒绝新的写入请求,以保护数据的完整性。

通常情况下,不会分配数据到该datanode,但是如果集群压力大时,还是会将相关的数据写入到对应的datanode节点,但是datanode的实际的磁盘使用率已经满了,因此对应的数据写入就会失败。

这就是为什么客户端写入数据失败的原因。

2 问题修复

知道了客户端数据写入失败的原因,就能够知道相关的修复方案。根据hdfs dfsadmin -report获取的集群的datanode磁盘使用率情况,能够知道,hdfs集群不同节点的磁盘使用率差异很大,这是由于集群中不同的datanode的磁盘配置不一致导致的。因此修复的策略分 2个步骤

  1. 触发集群数据均衡,将磁盘使用率高的节点数据迁移到其他节点
  2. 配置系统预留参数,避免磁盘被写满

2.1 集群均衡操作

可以使用均衡器 hdfs balancer,阈值默认是10%

threshold参数表示每个DataNode的HDFS使用率于集群的平均DFS利用率的偏差百分比。以任意一方式(更高或更低)超过该阈值将意味着该节点会被重新均衡。如下面的案例所示,可以运行不带任何参数的balancer命令,则此均衡器明朗了使用10%的默认阈值,这意味着均衡器通过将块从过度使用的节点移动到未充分使用的节点来均衡数据,直到每个Datanode的磁盘使用率不超过集群中平均磁盘使用率的正负10%。

有时,可能希望将阈值设置为不同的级别,例如,当集群中的可用空间变小,并且你希望将单个DataNode上使用的存储量保持在比默认的10%阈值更小的范围内时,可以这样指定阈值"hdfs balancer -threshold 5"

当运行均衡器时,它会查看集群中的两个关键HDFS使用情况值:

  • 平均DFS使用百分比: 可以通过计算得到集群中使用的平均DFS百分比:“Average DFS Used = (DFS Used * 100) / Present Capacity”
  • 节点使用的DFS百分比: 此度量显示每个节点使用的DFS百分比。
nohup hdfs balancer -threshold 20 &> /data/balancer.log & 

该命令需要执行均衡数据,通常需要执行很长时间,建议放到后台运行

Configured Capacity: 940550251233280 (855.43 TB)
Present Capacity: 893139195925042 (812.31 TB)
DFS Remaining: 424862122598400 (386.41 TB)
DFS Used: 468277073326642 (425.90 TB)
DFS Used%: 52.43%
Under replicated blocks: 122636
Blocks with corrupt replicas: 109
Missing blocks: 0
  • 如果一个datanode节点的DFS Used% > 集群的DFS Used% + threshold,就会触发均衡,将数据迁移到其他的节点
  • 最终会均衡到DFS Used% <= 集群的DFS Used% + threshold

说明

  • 默认的DataNode策略是在DataNode级别均衡存储,但均衡器不会在DataNode的各个存储卷之间均衡数据。
  • 仅当DataNode使用的DFS百分比和(由集群使用的)平均DFS之间的差大于(或小于)规定阈值时,均衡器才会均衡DataNode。否则,它不会重新均衡集群。
  • 均衡器运行多长时间取决于集群的大小和数据的不平衡程度。第一次运行均衡器,或者不经常调度均衡器,以及在添加一组DataNode之后运行均衡器,它将运行很长时间(通常是几天,如果数据量达到PB或者接近EB级别,可能需要一个多月的时间来均衡哟~)
  • 如果有一个数据写入和删除频繁的集群,集群可能永远不会达到完全均衡的状态,均衡器仅仅将数据从一个节点移动到另一个节点。
  • 向集群添加新节点后最好立即运行均衡器。如果一次添加大量节点,则运行均衡器需要一段时间才能完成其工作。
  • 如果确定阈值?这很容易,秩序选择整个集群中节点最低DFS使用百分比即可。不必花费大量的时间了解每个节点使用的DFS百分比,使用hdfs dfsadmin -report命令即可找出正确的阈值。阈值越小,均衡器需要执行的工作越多,集群就越均衡。

配套的优化配置,如下配置不能热加载,需要重启相关的datanode进程才能生效

# 移动的线程数,默认值是1
 <property>
   <name>dfs.datanode.balance.moverThreads</name>
   <value>4096</value>
 </property>
 # 移动的网络带宽限制,默认是10 MBytes/s,当前配置是100 MBytes/s
 <property>
   <name>dfs.datanode.balance.bandwidthPerSec</name>
   <value>104857600</value>
 </property>
 # 指定数据节点之间进行数据平衡操作时允许的最大并发移动任务数, 默认值是5
 <property>
   <name>dfs.datanode.balance.max.concurrent.moves</name>
   <value>50</value>
 </property>

更多配置说明可以参考 HDFS高可用架构涉及常用功能整理

2.2 配置系统预留参数

通过调整对应的datanode节点的参数dfs.datanode.du.reserved,该参数是针对单个节点的每个磁盘都预留相关数据。

  • 增加如下参数

    vim /usr/local/services/hadoop-*/etc/hadoop/hdfs-site.xml
    按照格式增加如下参数,每个磁盘预留1t空间
    <property>
        <name>dfs.datanode.du.reserved</name>
        <value>1073741824000</value>
     </property>
    
  • 重启datanode

当datanode重启后,通过hdfs dfsadmin -report可以看到对应节点的Configured Capacity变小了,因此能够写入的总的数据量变小(能够写入的理论上限是Configured Capacity),从而能够避免磁盘打满。

在这里插入图片描述

3. 疑问和思考

3.1. 是否需要配置dfs.datanode.du.reserved

有。

因为HDFS的设计并不会在存储接近满时停止写入操作,并且因为Non DFS Used存在,可能会导致DFS Used 比真实的磁盘使用率小,从而导致DFS Used 还没有100%,但是磁盘使用率100%,数据写入失败。

通常需要,设置dfs.datanode.du.reserved,至少预留200g(根据实际情况而定),并监控磁盘的使用率,及时清理数据或者进行数据均衡。

4. 参考文档

  • HDFS高可用架构涉及常用功能整理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue项目中点击下载】弹窗提示:离开此网站?系统可能不会保存您所做的更改,改为直接下载,不提示此弹窗内容,已解决

项目中用的是window.location.href实现下载 在Web浏览器中&#xff0c;当尝试通过window.location.href重定向到一个文件下载URL时&#xff0c;浏览器通常会显示一个确认对话框&#xff0c;询问用户是否要离开当前页面&#xff0c;因为下载的文件通常是在新窗口或新标签页中打…

【C语言】空心正方形图案

思路&#xff1a; 1&#xff0c;两行两列打印* &#xff1a;第一行和最后一行&#xff0c;第一列和最后一列。 2&#xff0c;其他地方打印空格。 代码如下&#xff1a; #include<stdio.h> int main() { int n 0; int i 0; int j 0; while (scanf("…

avue-crud顶部操作按钮插槽;avue-crud列数据插槽;avue-crud行操作按钮插槽

1.avue-crud顶部操作按钮插槽&#xff1b; <template slot"menuLeft" slot-scope"{ size }"><div class"left"><div class"btn"><el-button type"primary" size"small" click"onBatchR…

彻底学会系列:一、机器学习之梯度下降(1)

1 梯度下降概念 1.1 概念 梯度下降是一种优化算法&#xff0c;用于最小化一个函数的值&#xff0c;特别是用于训练机器学习模型中的参数&#xff0c;其基本思想是通过不断迭代调整参数的值&#xff0c;使得函数值沿着梯度的反方向逐渐减小&#xff0c;直至达到局部或全局最小…

【Linux】一文解决如何在终端查看 python解释器 的位置

【Linux】一文解决如何在终端查看 python解释器 的位置 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…

【Liunx-后端开发软件安装】Liunx安装nginx

【Liunx-后端开发软件安装】Liunx安装nginx 使用安装包安装 一、简介 nginx&#xff0c;这个家伙可不是你厨房里的那位大厨&#xff0c;它可是互联网世界的“煎饼果子摊主”。想象一下&#xff0c;在熙熙攘攘的网络大街上&#xff0c;nginx挥舞着它的锅铲——哦不&#xff0c;是…

KVM安装-kvm彻底卸载-docker安装Webvirtmgr

KVM安装和使用 一、安装 检测硬件是否支持KVM需要硬件的支持,使用命令查看硬件是否支持KVM。如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的 egrep ‘(vmx|svm)’ /proc/cpuinfo关闭selinux将 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改为 SELinux=d…

python知识点总结(三)

python知识点总结三 1、有一个文件file.txt大小约为10G&#xff0c;但是内存只有4G&#xff0c;如果在只修改get_lines 函数而其他代码保持不变的情况下&#xff0c;应该如何实现? 需要考虑的问题都有那些?2、交换2个变量的值3、回调函数4、Python-遍历列表时删除元素的正确做…

编曲学习:如何编写钢琴织体 Cubase12逻辑预置 需要弄明白的问题

钢琴织体是指演奏形式、方式,同一个和弦进行可以用很多种不同的演奏方法。常用织体有分解和弦,柱式和弦,琶音织体,混合织体。 在编写钢琴织体前,先定好歌曲的调。 Cubase小技巧:把钢琴轨道向上拖动打和弦轨道,就可以显示和弦!如果你有一些参考工程,不知道用了哪些和…

jenkins Pipeline接入mysql

背景&#xff1a; jenkin pipeline进化过程如下&#xff1a; Jenkins Pipeline 脚本优化实践&#xff1a;从繁琐到简洁 >>>>> Jenkins Pipeline脚本优化&#xff1a;为Kubernetes应用部署增加状态检测>>>>>> 使用Jenkins和单个模板部署多个K…

Vue+SpringBoot打造康复中心管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

电子科技大学链时代工作室招新题C语言部分---题号D

1. 题目 这道题大概的意思就是对一个整形数组的元素进行排序&#xff0c;然后按新的顺序打印原本的下标&#xff1b; 例如&#xff0c;在题目给出的Note部分&#xff0c;{a1, a2, a3, a4, a5}进行排序之后变为了{a2, a1, a4, a3, a5}&#xff0c;于是输出2 1 4 3 5。 排序的规则…

【JavaScript编程实操07】1.查找一个字符串中是否具有某个字符 2.完成数组去重

前言 1、查找一个字符串中是否具有某个字符 代码&#xff1a; 实现效果&#xff1a; 2、完成数组去重 第一种方法 代码&#xff1a; 实现效果&#xff1a; 第二种方法 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次主要是针对Javascript阶段的字符串和数组…

Python图像处理:3.七种图像分割方法

一、常见图像分割方法 (1)传统算法 阈值分割&#xff08;Thresholding&#xff09;&#xff1a;这是最简单也是应用最广泛的一种分割方法&#xff0c;通过选定一个阈值将图像转换为二值图像&#xff0c;从而分割出目标区域。这种方法适用于图像的前景和背景对比明显的情况。 …

链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:分析力扣中有关链表的部分题目. 目录 前言一、链表中倒…

【冲击蓝桥篇】动态规划(下):你还在怕动态规划!?进来!答题模板+思路解析+真题实战

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

Java项目:60 ssm基于JSP的乡镇自来水收费系统+jsp

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统可以提供信息显示和相应服务&#xff0c; 其管理员管理水表&#xff0c;审核用户更换水表的请求&#xff0c;管理用户水费&#xff0c;包括抄表以…

运动想象 (MI) 迁移学习系列 (9) : 数据对齐(EA)

运动想象迁移学习系列:数据对齐&#xff08;EA&#xff09; 0. 引言1. 迁移学习算法流程2. 欧式对齐算法流程3. 与RA算法进行对比4. 实验结果对比5. 总结欢迎来稿 论文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/8701679 论文题目&#xff1a;Transfer Le…

【Spring Cloud】Sentinel限流

控制台下载https://github.com/alibaba/Sentinel/releases # 控制台启动 java -Dserver.port10888 -Dcsp.sentinel.dashboard.serverlocalhost:10888 -Dproject.namesentinel-dashboard -jar sentinel-dashboard.jar引入依赖 <dependency><groupId>com.alibaba.c…

hadoop分布式环境ssh设置免密登陆之后目标主机更换无法连接解决

在进行hadoop分布式环境搭建时&#xff08;三台机&#xff0c;master&#xff0c;slave1&#xff0c;slave2&#xff09;&#xff0c;后期slave2系统出现问题&#xff0c;更换新机后&#xff0c;master与slave2文件传输失败&#xff1a; 以为是秘钥过期的问题&#xff0c;更换…