HDFS某个节点的磁盘满了

前言

昨天还是周末,公司群里就有人@,说集群有问题了,敲完Hive一直卡在那里进不去,于是我很快登上WebUi,看到了这么一幕:
在这里插入图片描述
这台节点的磁盘满了,其他的数据分布都比较平均

为什么会这样

这里就不得不说一下HDFS复本存放策略了:

namenode如何选择在哪个datanode存储复本(replica)?这里需要针对可靠性、写入带宽和读取带宽进行权衡。例如,把所有复本都存储在一个节点损失的写入带宽最小(因为复制管线都是在同一节点上运行),但这并不提供真实的冗余(如果节点发生故障,那么该块中的数据会丢失)。同时,同一机架上服务器间的读取带宽是很高的。另一个极端,把复本放在不同的数据中心可以最大限度地提高冗余,但带宽的损耗非常大。及时在同一数据中心(到目前为止,所有Hadoop集群均运行在同一数据中心内),也有多重可能的数据布局策略。
Hadoop的默认布局策略是在运行客户端的节点上放第1个复本(如果客户端运行在集群之外,就随机选择一个节点,不过系统会避免挑选那些存储太满或太忙的节点)。第2个复本放在与第一个不同且随机另外选择的机架中节点上(离架)。第3个复本与第2个复本放在同一个机架上,且随机选择另外一个节点。其他复本放在集群中随机选择的节点上,不过系统会尽量避免在同一个的机架上放太多复本。
一旦选定复本的放置位置,就根据网络拓扑创建一个管线。如果复本数为3,则有下图所示的管线:

在这里插入图片描述
总结:

  • 第一个副本:放置在上传文件的 DN;如果是集群外提交,则随机挑选一台磁盘不太
    满,CPU 不太忙的节点。
  • 第二个副本:放置在于第一个副本不同的机架的节点上。
  • 第三个副本:与第二个副本相同机架的节点。
  • 更多副本:随机节点。

总的来说,这一方法不仅提供很好的稳定性(数据块存储在两个机架中)并实现很好的负载均衡,包括写入带宽(写入操作只需要遍历一个交换机)、读取性能(可以从两个机架中选择读取)和集群中块的均匀分布(客户端只在本地机架上写入一个块)

看到HDFS复本存放策略,问题就很明了了:该节点既是HDFS的客户端又是一个DataNode节点,因此每次往HDFS写入数据它都会存放一份

这样的好处,是写入的效率高,但是坏处就是会出现上面的问题

怎么解决

这个时候就不得不说HDFS的均衡器:

随着时间推移,各个datanode上的块分布会越来越不均衡。不均衡的集群会降低MapReduce的本地性,导致部分datanode相对更加繁忙。应避免出现这种情况。
均衡器(balancer)程序是一个Hadoop守护进程,它将块从忙绿的datanode移到相对空闲的datanode,从而重新分配块。同时坚持块复本放置策略,将复本分散到不同机架,以降低数据损坏率。它不断移动块,直到集群达到均衡,即每个datanode的使用率(该节点上已使用的空间与空间容量之间的比率)和集群的使用率(集群中已使用的空间与集群的空间容量之间的比率)非常接近,差距不超过给定的阈值。可调用下面指令启动均衡器:

% start-balancer.sh
  • 1
  • threshold 参数指定阈值(百分比格式),以判定集群是否均衡。该标记是可选的;若省略,默认阈值是10%。任何时刻,集群中都只运行一个均衡器。

均衡器会一直运行,直到集群变得均衡为止,此时,均衡器不能移动任何块,或失去与namenode的联络。均衡器在标准日志目录中创建一个日志文件,记录它所执行的每轮重新分配的过程(每轮次输出一行)。
为了降低集群负荷、避免干扰其他用户,均衡器被设计为后台运行。在不同节点之间复制数据的宽带也是受限的。默认值是很小的1MB/s,可以通过hdfs-site.xml文件中的dfs.datanode.balance.bandwidthPerSec属性重新设定(单位是字节)

于是我在CDH WebUi上面进行如下操作:

在这里插入图片描述
平衡器启动6h后:(我这个效率太低了,可以继续增加dfs.datanode.balance.bandwidthPerSec属性)
在这里插入图片描述
这个时候集群就可以使用了。现在这个节点和其他节点在HDFS上面的存储的数据已经平衡了,我们可以到当时配置的dfs.datanode.data.dir的路径下查看每个节点在HDFS存储的量,比如我的这个路径是/data/dfs切换到该目录,然后:

du -h --max-depth=1
  • 1

进行统计,我这里简单的进行了汇总:
在这里插入图片描述
可以看得出来我的threshold值现在也仅仅为0.02,这个值也是我设置的值。
不过,这样真的不如单独拿一台服务器作为客户端

如何给HDFS增加客户端

原生搭建的集群:
1、找一台新的虚拟机、服务器、。这台服务器必须能够与集群通信(与其余节点ping通)
2、将配置好的安装包原封不动的拷贝到新的服务器
3、配置环境变量 方便操作HDFS集群
4、在客户端正常操作HDFS集群就可以了

CDH搭建的集群:

posted @ 2021-02-19 17:11  Simon92  阅读(1262)  评论(0编辑  收藏  举报