如何使用Apache Hadoop中的新HDFS数据节点内磁盘平衡器

> HDFS现在包括(在CDH 5.8.2及更高版本中提供)一种用于跨节点移动数据的综合存储容量管理方法。

   在hdfs中,datanode将数据块分散到本地文件系统目录中,可以使用hdfs-site.xml中的dfs.datanode.data.dir指定该目录。在典型的安装中,每个目录(在HDFS术语中称为卷)位于不同的设备上(例如,在单独的HDD和SSD上)。在将新块写入HDFS时,datanode使用卷选择策略来选择块的磁盘。目前支持两种这样的策略类型:循环或可用空间(HDFS-1804)。

   简而言之,如图1所示,循环策略将新块平均分布在可用磁盘上,而可用空间策略则优先将数据写入可用空间最大的磁盘(按百分比)。

如何使用Apache Hadoop中的新HDFS数据节点内磁盘平衡器

默认情况下,datanode使用基于循环的策略来写入新块。但是,在长时间运行的集群中,由于HDFS中的大量文件删除或通过磁盘热交换功能添加新的数据节点磁盘等事件,数据节点仍然有可能创建显著不平衡的卷。即使使用基于空间的可用卷选择策略,卷不平衡仍然会导致磁盘I/O效率降低:例如,在此期间,每次新写入都将转到新添加的空磁盘,而其他磁盘处于空闲状态,从而在新磁盘上造成瓶颈。

最近,ApacheHadoop社区开发了服务器离线脚本(如inhdf-1312、[email protected] list和github所讨论的那样),以缓解数据不平衡问题。但是,由于在HDFS代码库之外,这些脚本要求在磁盘之间移动数据之前,数据节点处于脱机状态。因此,HDFS-1312还引入了一个在线磁盘均衡器,该均衡器旨在根据各种指标重新平衡正在运行的数据节点上的卷。与HDFS平衡器类似,HDFS磁盘平衡器在数据节点中作为线程运行,以跨具有相同存储类型的卷移动块文件。

在此博客的其余部分中,您将了解为什么以及如何使用这个新特性。

>>  Disk Balancer 101

     让我们用一个例子来逐步探索这个有用的特性。首先,确认所有数据节点上的dfs.disk.balancer.enabled配置设置为true。从CDH 5.8.2开始,用户可以通过Cloudera Manager中的HDFS安全阀片段指定此配置:

如何使用Apache Hadoop中的新HDFS数据节点内磁盘平衡器

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

如何使用Apache Hadoop中的新HDFS数据节点内磁盘平衡器

显然,是时候让磁盘重新平衡了!

     典型的磁盘平衡器任务包括三个步骤(通过hdfs disk balancer命令实现):计划执行查询。在第一步中,HDFS客户机从namenode中读取有关指定数据节点的必要信息,以生成执行计划:

如何使用Apache Hadoop中的新HDFS数据节点内磁盘平衡器

从输出中可以看到,HDFS磁盘平衡器使用一个计划器来计算指定数据节点上数据移动计划的步骤,方法是使用数据节点向名称节点报告的磁盘使用信息。每个步骤指定要移动数据的源卷和目标卷,以及预期移动的数据量。

 

      在写这篇文章的时候,HDFS中唯一支持的规划者是贪婪计划器,它不断地将数据从使用最多的设备移动到使用最少的设备,直到所有数据均匀分布在所有设备上。用户还可以在plan命令中指定空间利用的阈值;因此,如果空间利用的差异低于阈值,规划人员会考虑磁盘平衡。(另一个值得注意的选项是通过在规划过程中指定带宽来限制disk balancer任务I/O,这样磁盘balancer I/O就不会影响前台工作。)

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

如何使用Apache Hadoop中的新HDFS数据节点内磁盘平衡器

要在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,后者在后台BlockMover线程中执行该文件。

要检查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

输出(计划完成)表示磁盘平衡任务已完成。要验证磁盘平衡器的有效性,请再次使用df-h查看两个本地磁盘之间的数据分布:

如何使用Apache Hadoop中的新HDFS数据节点内磁盘平衡器

输出确认磁盘平衡器成功地将跨卷的磁盘空间使用率差异降低到10%以下。任务完成!

要了解有关HDFS磁盘平衡器的更多详细信息,请阅读Cloudera文档和上游文档。

>>  结论

     随着HDFS-1312中引入了期待已久的数据内节点磁盘平衡器功能,CDH 5.8.2及更高版本中的HDFS版本提供了一个全面的存储容量管理解决方案,可以跨节点(平衡器)、存储类型(移动器)和单个数据节点(磁盘平衡器)内的磁盘移动数据。