vlambda博客
学习文章列表

小数据运维之HDFS磁盘下线


HDFS 磁盘目录配置


在HDFS中最重要的配置之一就是dfs.datanode.data.dir,

dfs.datanode.data.dir:设置datanode节点存储数据块文件的本地路径,通常可以设置多个,用逗号隔开。一般情况下为了优化,是每块磁盘设置一个目录。

在CDH HDFS中Service Configuration里面配置的这个参数时候,这些配置的目录会应用到所有的数据节点, 如果目录不存在,会自动创建这些目录。


HDFS 磁盘配置故障溯源


最近就就因为这个dfs.datanode.data.dir配置,遇到了一点小麻烦:(  公司新上线了HDFS数据节点,但新节点和之前的节点磁盘配置不同,在服务器上也mount到了不同的目录下,在上线的时候我们就把新旧节点的不同数据盘目录都写入到了dfs.datanode.data.dir中,例如:/data_hdfs/dfs/dn(旧数据节点磁盘路径), /data1/dfs/dn(新数据节点磁盘路径)。上线一段时间后几台数据节点的根目录磁盘空间开始报警, 一看才发现原来是CDH在所有的数据节点都配置了同样的数据目录,新节点的数据盘目录在老节点上是不存在,但这些目录仍然被CDH 自动创建在系统盘根目录下, HDFS数据持续写入的过程中直接把根目录写满了。


HDFS磁盘下线


为了解决这个问题,我们针对不同的数据节点中dfs.datanode.data.dir参数配置不同的路径, 同时我们还需要先下线那些根目录下的磁盘目录。

为了下线dfs.datanode.data.dir中的磁盘目录,我们采用的方案是 Cloudera的数据节点磁盘热插拔的方案:

Performing Disk Hot Swap for DataNodes

https://docs.cloudera.com/documentation/enterprise/latest/topics/admin_dn_swap.html

这个方案本身是为了解决Hadoop集群在磁盘出现故障时候,能够实现不停机的更换磁盘(This new feature gives Hadoop admins the commonplace ability to replace failed DataNode drives without unscheduled downtime.)。在我们这里我们只是使用这个方案的前部分步骤下线单个磁盘


在开始注意操作之前, 有二点需要注意下:


下线单个节点的磁盘目录的步骤如下:

  • 去CDH 的HDFS Instance 需要下线磁盘所在的节点的配置页面,从dfs.datanode.data.dir配置中删除掉需要下线的磁盘目录。这里特别需要注意是具体数据节点的配置页,而不是Service的配置页面,如果在Service配置页面进行了删除会在所有节点进行删除。(Warning: Change the value of this property only for the specific DataNode instance where you are planning to hot swap the disk. Do not edit the role group value for this property. Doing so will cause data loss.)

  • 在下线的数据节点执行刷新HDFS配置的操作,Actions > Refresh DataNode configuration.

  • 然后在任意一台节点使用hdfs fsck / 命令检查Hdfs集群数据块的完整性。这个时候大家HDFS replicas设置的不同会导致不同的结果:

    • 我们的集群在刚上线初期,因数据节点数量不足,将dfs replication 设为了1,检查结果就提示多个目录下的hdfs block丢失了。hdfs fsck / 指令会列出所有的丢失block的文件,也可以使用hdfs fsck -list-corruptfileblocks。这个时候如果这些数据不重要的话可以直接使用hdfs fsck / -delete 删除掉所有corrupted的文件,再次运行hdfs fsck / 会发现集群恢复healthy, 但那些文件也就丢失了,所以需要谨慎处理。在不重新上线这块磁盘的情况下想直接修复这些丢失block的文件很困难,我再网上找了下,也测试hdfs debug recoverlease -path 等指令都没有成功找回丢失的block。

    • 在dfs replication 设为 >=2 的时候,会发现显示有些文件处于under replicated blocks的状态, 我的理解是因为下线数据磁盘后会导致部分数据文件的副本级数低于了2,这时候HDFS重新开始为这些文件恢复副本集,等待恢复操作结束后,重新使用hdfs fsck / 再检查一次,就应该都正常了。


到此磁盘下线就结束了, 步骤比较简单,修改下线节点磁盘配置,刷新该节点Hdfs配置,最后检查HDFS集群数据的完整性就可以了, HDFS会自动修复丢失的那些数据副本集, 所以说设置HDFS副本集大于2至关重要, 否则有可能丢失数据。


总结一下,HDFS 磁盘的配置会直接影响到整个Hadoop集群的运行情况,在开始规划搭建Hadoop集群的初期就应该进行系统性的规划,关于dfs.datanode.data.dir 的配置Cloudera给出的建议可以参考:

  • Typical values are /data/N/dfs/dn for N = 1, 2, 3.... 

  • In CDH 5.7 and higher, these directories can be optionally tagged with their storage types, for example, [SSD]/data/1/dns/dn. HDFS supports the following storage types: [DISK], [SSD], [ARCHIVE], [RAM_DISK]. The default storage type of a directory will be [DISK] if it does not have a storage type tagged explicitly.

  • These directories should be mounted using the noatime option, and the disks should be configured using JBOD. RAID is not recommended.