0494-如何恢复HDFS中节点正常解除授权丢失的数据

作者:唐辉

1 文档编写目的

在Hadoop集群中提供有主机解除授权和将节点移除集群的操作,正常情况下节点的解除授权不会导致blocks丢失的情况,但是在某些特殊场景中还是会出现小量blocks的丢失,本篇文章主要介绍如何恢复HDFS中节点正常解除授权的丢失数据如何恢复和正常解除授权时可能造成blocks 丢失的原因以及如何规避这些风险

  • 文章概述

1.模拟blocks 丢失

2.重新上线已解除授权下线的节点恢复数据

3.正常解除授权下线可能造成数据丢失的原因分析

4.如何在对DataNode解除授权前调优HDFS

  • 测试环境

1.CM和CDH5.15.1

2.现有集群操作系统RedHat7.2

3.正常下线的节点本地磁盘的数据并未删除

2 模拟blocks丢失

1.首先模拟blocks 丢失,在HDFS找到原文件的blocks 的名称和存放的位置

hadoop fsck /user/test/a.txt -files -blocks -locations

扫描二维码关注公众号,回复: 8546914 查看本文章

2.然后再本地磁盘中find 到这个文件名,包括文件和元文件,也就是文件中blk_100376901 和blk_100376901_28795.meta,找到文件后将其中两个节点上的副本mv 到其他路径,这测试直接移动到了data1 目录下

find  /data1/dfs/dn -name blk_100376901*

3.然后正常解除最后一个节点的副本授权,再CM 上先停止主机角色>然后解除授权(解除授权会可能会再完成HDFS 解除授权的步骤卡住,如果很久都没有解除,请重试) >然后从集群中删除主机,注意:正常下线的节点本地盘中的HDFS 存储的数据还保留在本地磁盘中

4.由于HDFS 整理元数据信息过程比较慢,这里我直接重启了HDFS ,然后执行检查命令,发现如下图blocks 已经丢失

3 重新上线节点恢复数据

该文件blocks 已经3副本丢失2个,还有一个存在已经下线的节点上,下线的节点数据还在本地磁盘上,没有删除,那么该节点重新装回来HDSF能找到吗?于是就去尝试下线重新将节点加回集群

1.在CM 中选择向集群添加新主机:

2.等待完成一系列的步骤后

4.加回集群并启动角色后查看,发现blocks 已经自动恢复3副本

去其他节点上查找副本,发现已经重新拷贝了一个副本生成到原来的路径下

分析:HDFS的 NameNode中有记录blocks 副本存放的节点和blocks名称,节点重新加回集群后,能够重新找到之前存放的blocks。如果你的数据并没有丢失,而下线了一个节点,再将该节点重新加回集群可以看到该 blocks 会同时存在4个副本,保留一段时间后删除多余的一个副本。

4 正常解除授权下线可能造成数据丢失的原因分析

1.同时下线的节点数量太多,如果副本数为3,建议最多同时停用2个DataNode进行下线操作,等待下线完成后,进行副本检查没有问题后再下线其他节点

2.下线前数据副本不完整,建议下线前和下线后都需要对副本进行检查,详情查看第5章如何在对DataNode解除授权前调优HDFS

3.网络带宽原因,集群内作业数量大,占用带宽高,导致副本没有拷贝到其他节点,如果有数据平衡操作,需要停止数据平衡操作,数据平衡会移动blocks的副本。

5 如何在对DataNode解除授权前调优HDFS

1.减少同时下线的节点数量

建议以较小的数量并行停用DataNode。例如,如果副本数为3,建议最多同时停用2个DataNode进行下线操作,等待下线完成后,进行副本检查

hdfs fsck / -list-corruptfileblocks -openforwrite -files -blocks -locations 2>&1 > /tmp/hdfs-fsck.txt  

2.在下线节点检查是否有异常的副本和blocks,如果有请修复

当一个DataNode退役时,NameNode确保来自DataNode的每个blocks仍然可以在复制因子的指示下在整个群集中可用。此过程涉及以小批量从DataNode复制块。如果DataNode有数千个块,则退役可能需要几个小时。在使用Cloudera Manager对DataNode解除授权之前,应首先调整HDFS:

运行以下命令以识别HDFS文件系统中的问题:

hdfs fsck / -list-corruptfileblocks -openforwrite -files -blocks -locations 2>&1 > /tmp/hdfs-fsck.txt  
#如果存在丢失的块
hdfs fsck file_name -move 
#或者执行
hdfs fsck file_name -delete

以下参数增大主要是加快HDFS的balance的速度,实际也就会加快DataNode的下线速度。

3.提高DataNodes的堆栈大小。DataNodes的heap size应配置至少4 GB,从而加快数据拷贝的周期以及每次的最大数据传输量。

  • 转到HDFS服务页面。
  • 单击“Configuration ”选项卡
  • 选择Scope > DataNode
  • 选择Category > Resource Management
  • 按照建议在**“Java Heap Size of DataNode in Bytes”属性中设置数据Java Heap Size**大小。
  • 单击“保存更改”以提交更改。

4.设置DataNode平衡带宽并停止数据平衡操作:

  • 选择Scope > DataNode
  • 展开“Category > Performance ”类别。
  • 根据实际情况增大DataNode Balancing Bandwidth(默认10MB比较小),当然你也可以设置为较小的值,以便最大限度地减少退役对集群的影响,但代价是退役将需要更长时间。
  • 单击“保存更改”以提交更改。

5.调大Maximum Iteration Size参数(默认值为2,但建议为10):

  • 选择Scope > NameNode
  • 展开“Category > Advanced”类别。
  • 将“Replication Work Multiplier Per Iteration ”属性配置为值10,例如10。
  • 单击“保存更改”以提交更改。

6.增加复制最大线程数和最大复制线程硬限制:

  • 选择Scope > NameNode
  • 展开“Category > Advanced”类别。
  • 配置Maximum number of replication threads on a DataNodeHard limit on the number of replication threads on a DataNode分别为50和100。当然也可以减少线程数(或使用默认值)以最小化退役对群集的影响,但代价是退役将需要更长时间。
  • 单击“保存更改”以提交更改。

7.重启HDFS服务用来使配置生效

参考文章:

https://www.cloudera.com/documentation/enterprise/5-12-x/topics/cm_mc_decomm_host.html#concept_grc_1tw_cy

提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查

发布了315 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Hadoop_SC/article/details/103945446
今日推荐