大数据 频道

HDFS系列之DataNode磁盘管理解析及实践!

  【IT168 评论】在单一DataNode管理多个磁盘的情况下,执行普通写操作时的每个磁盘用量比较平均。但是,添加或者更换磁盘将会导致DataNode磁盘用量严重不均衡,传统的HDFS均衡器关注点是DataNode之间(inter-)而不是intra-,但是Hadoop 3.0及以上版本中,新的HDFS Intra-DataNode磁盘平衡器可以很好得解决上述问题。

  HDFS现在包括(在CDH 5.8.2及更高版本中提供)全面的存储容量管理方法,用于跨节点移动数据。熟悉Hadoop简单配置的同学应该都知道hdfs-site.xml,在HDFS中,DataNode将数据块扩展到本地文件系统目录,可以使用hdfs-site.xml中的dfs.datanode.data.dir指定。在一个典型的安装过程中,每个目录(在HDFS术语中称作卷)位于不同的设备上(例如,在单独的HDD和SSD上)。

  当我们将新块写入HDFS时,DataNode使用卷选择策略为块选择磁盘。目前支持两种策略类型:轮询(round-robin)和可用空间(available space)(HDFS-1804)。

  简而言之,如上图所示,轮询策略在可用磁盘上均匀分配新块,而可用空间策略优先将数据写入具有最多可用空间(按百分比)的磁盘。

  默认情况下,DataNode使用基于轮询的策略来编写新块。但是,在长时间运行的集群中,由于HDFS中的大量文件删除或通过磁盘热交换功能添加新的DataNode磁盘等事件,DataNode仍然可能创建了显著不平衡的卷。即使使用基于可用空间的卷选择策略,卷不平衡现象仍然会导致磁盘I/O效率降低:例如,每个新的写入都转到新添加的空磁盘而其他磁盘空闲,这会给新磁盘造成瓶颈。

  Apache Hadoop社区开发了服务器脱机脚本以缓解数据不平衡问题。但是,由于在HDFS代码库之内,这些脚本要求DataNode在磁盘间移动数据前处于脱机状态。因此,HDFS-1312引入了在线磁盘平衡器,旨在根据各种指标重新平衡正在运行的DataNode上的卷。与HDFS Balancer类似,HDFS磁盘平衡器作为DataNode中的线程运行,以跨具有相同存储类型的卷移动块文件。

  磁盘平衡器101

  让我们使用示例逐步探索该功能。首先,确认所有DataNode上的dfs.disk.balancer.enabled配置都设置为true。从CDH 5.8.2开始,用户可以通过Cloudera Manager中的HDFS安全阀片段指定此配置:

  在此示例中,我们将向预加载的HDFS DataNode(/ mnt / disk1)添加新磁盘,并将新磁盘装入/mnt/disk2。在CDH中,每个HDFS数据目录都在一个单独的磁盘上,因此用户可以使用df来显示磁盘使用情况:

  # df -h …. /var/disk1 5.8G 3.6G 1.9G 66% /mnt/disk1 /var/disk2 5.8G 13M 5.5G 1% /mnt/disk2

  显然,是时候让磁盘再次平衡!传统的磁盘平衡器任务涉及三个步骤(通过HDFS diskbalancer命令实现):计划,执行和查询。在第一步中,HDFS客户端从NameNode读取有关指定DataNode的必要信息,以生成执行计划:

  # hdfs diskbalancer -plan lei-dn-3.example.org 16/08/19 18:04:01 INFO planner.GreedyPlanner: Starting plan for Node : lei-dn-3.example.org:20001 16/08/19 18:04:01 INFO planner.GreedyPlanner: Disk Volume set 03922eb1-63af-4a16-bafe-fde772aee2fa Type : DISK plan completed.Th 16/08/19 18:04:01 INFO planner.GreedyPlanner: Compute Plan for Node : lei-dn-3.example.org:20001 took 5 ms 16/08/19 18:04:01 INFO command.Command: Writing plan to : /system/diskbalancer/2016-Aug-19-18-04-01

  从输出中可以看出,HDFS 磁盘平衡器通过数据节点将磁盘使用信息报告给NameNode,并计算指定DataNode上的数据移动步骤。每个步骤都指定要移动数据的源卷和目标卷,以及预期要移动的数据量。

  在撰写本文时,HDFS支持的唯一规划器是GreedyPlanner,它不断地将数据从最常用的设备移动到最少使用的设备,直到所有数据均匀分布在所有设备上。用户还可以在plan命令中指定空间利用率的阈值,如果空间利用率的差异低于阈值,则规划人员会认为磁盘是平衡的。(另一个值得注意的选择是通过在规划过程中指定--bandwidth来限制磁盘平衡器任务I / O,以免磁盘平衡器I/O影响前台工作。)

  磁盘平衡器执行计划生成为存储在HDFS中的JSON文件。默认情况下,计划文件存储在/system/diskbalancer目录中:

  # hdfs dfs -ls /system/diskbalancer/2016-Aug-19-18-04-01 Found 2 items -rw-r--r-- 3 hdfs supergroup 1955 2016-08-19 18:04 /system/diskbalancer/2016-Aug-19-18-04-01/lei-dn-3.example.org.before.json -rw-r--r-- 3 hdfs supergroup 908 2016-08-19 18:04 /system/diskbalancer/2016-Aug-19-18-04-01/lei-dn-3.example.org.plan.json

  要在DataNode上执行计划,请运行:

  $ hdfs diskbalancer -execute /system/diskbalancer/2016-Aug-17-17-03-56/172.26.10.16.plan.json 16/08/17 17:22:08 INFO command.Command: Executing "execute plan" command

  此命令用于将JSON计划文件提交给DataNode,后者在BlockMoverthread线程的后台执行。

  要检查DataNode上diskbalancer任务的状态,请使用query命令:

  # hdfs diskbalancer -query lei-dn-3:20001 16/08/19 21:08:04 INFO command.Command: Executing "query plan" command. Plan File: /system/diskbalancer/2016-Aug-19-18-04-01/lei-dn-3.example.org.plan.json Plan ID: ff735b410579b2bbe15352a14bf001396f22344f7ed5fe24481ac133ce6de65fe5d721e223b08a861245be033a82469d2ce943aac84d9a111b542e6c63b40e75 Result: PLAN_DONE

  输出(PLAN_DONE)表示磁盘平衡任务已完成。如果要验证磁盘平衡器的有效性,可以再次使用df -h查看跨两个本地磁盘的数据分布情况:

  # df -h Filesystem Size Used Avail Use% Mounted on …. /var/disk1 5.8G 2.1G 3.5G 37% /mnt/disk1 /var/disk2 5.8G 1.6G 4.0G 29% /mnt/disk2

  只要输出确认磁盘平衡器成功地将磁盘空间使用量差异减少到10%以下,那就意味着任务完成了。

  结论

  凭借HDFS-1312中的DataNode内部磁盘平衡器功能,CDH 5.8.2及更高版本中的HDFS提供了一个全面的存储容量管理解决方案,该解决方案能够跨越节点(balancer),存储类型(mover), 在单个DataNode的磁盘(Disk Balancer)移动数据。

0
相关文章