更新时间:2023-11-07 GMT+08:00

HDFS开源增强特性

HDFS开源增强特性:文件块同分布(Colocation)

离线数据汇总统计场景中,Join是一个经常用到的计算功能,在MapReduce中的实现方式大体如下:

  1. Map任务分别将两个表文件的记录处理成(Join Key,Value),然后按照Join Key做Hash分区后,送到不同的Reduce任务里去处理。
  2. Reduce任务一般使用Nested Loop方式递归左表的数据,并遍历右表的每一行,对于相等的Join Key,处理Join结果并输出。

    以上方式的最大问题在于,由于数据分散在各节点上,所以在Map到Reduce过程中,需要大量的网络数据传输,使得Join计算的性能大大降低,该过程如图1所示:

图1 无同分布数据传输流程

由于数据表文件是以HDFS Block方式存放在物理文件系统中,如果能把两个需要Join的文件数据块按Join Key分区后,一一对应地放在同一台机器上,则在Join计算的Reduce过程中无需传递数据,直接在节点本地做Map Join后就能得到结果,性能显著提升。

HDFS数据同分布特性,使得需要做关联和汇总计算的两个文件FileA和FileB,通过指定同一个分布ID,使其所有的Block分布在一起,不再需要跨节点读取数据就能完成计算,极大提高MapReduce Join性能。

图2 无同分布与同分布数据块分布对比

HDFS开源增强特性:硬盘坏卷设置

在开源版本中,如果为DataNode配置多个数据存放卷,默认情况下其中一个卷损坏,则DataNode将不再提供服务。配置项“dfs.datanode.failed.volumes.tolerated”可以指定失败的个数,小于该个数,DataNode可以继续提供服务。

“dfs.datanode.failed.volumes.tolerated”取值范围为-1~DataNode上配置的磁盘卷数,默认值为-1,效果如图3所示。

图3 选项设置为0

例如:某个DataNode中挂载了3个数据存放卷,“dfs.datanode.failed.volumes.tolerated”配置为1,则当该DataNode中的其中一个数据存放卷不能使用的时候,该DataNode会继续提供服务。如图4所示。

图4 选项设置为1

这个原生的配置项,存在一定的缺陷。当DataNode的数据存放卷数量不一致的时候,就需要对每个DataNode进行单独配置,而无法配置为所有节点统一生成配置文件,造成用户使用的不便。

例如:集群中存在3个DataNode节点,第一个节点有3个数据目录,第二个节点有4个数据目录,第三个节点有5个数据目录,如果需要实现当节点有一个目录还可用的时候DataNode服务依然可用的效果,就需要如图5所示进行设置。

图5 未增强前属性设置

在自研增强版本的HDFS中,对该配置项进行了增强,增加了-1的值选项。当配置成-1的时候,所有DataNode节点只要还有一个数据存放卷,DataNode就能继续提供服务。

所以对于上面提到的例子,该属性的配置将统一成-1,如图6所示。

图6 增强后属性配置

HDFS开源增强特性:HDFS启动加速

在HDFS中,NameNode启动需要加载元数据文件fsimage,然后等待DataNode完成启动并上报数据块信息。当DataNode上报的数据块信息达到设定百分比时,NameNode退出Safemode,完成启动过程。当HDFS上保存的文件数量达到千万甚至亿级以后,以上两个过程都要耗费大量的时间,致使NameNode的启动过程变得非常漫长。该版本对加载元数据fsimage这一过程进行了优化。

在开源HDFS中,fsimage里保存了所有类型的元数据信息,每一类元数据信息(如文件元数据信息和文件夹元数据信息)分别保存在一个section块里,这些section块在启动时是串行加载的。当HDFS上存储了大量的文件和文件夹时,这两个section的加载就会非常耗时,影响HDFS文件系统的启动时间。HDFS NameNode在生成fsimage时可以将同一类型的元数据信息分段保存在多个section里,当NameNode启动时并行加载fsimage中的section以加快加载速度。

HDFS开源增强特性:基于标签的数据块摆放策略(HDFS Nodelabel)

用户需要通过数据特征灵活配置HDFS文件数据块的存储节点。通过设置HDFS目录/文件对应一个标签表达式,同时设置每个DataNode对应一个或多个标签,从而给文件的数据块存储指定了特定范围的DataNode。当使用基于标签的数据块摆放策略,为指定的文件选择DataNode节点进行存放时,会根据文件的标签表达式选择出将要存放的Datanode节点范围,然后在这些Datanode节点范围内,选择出合适的存放节点。

  • 支持用户将数据块的各个副本存放在指定具有不同标签的节点,如某个文件的数据块的2个副本放置在标签L1对应节点中,该数据块的其他副本放置在标签L2对应的节点中。
  • 支持选择节点失败情况下的策略,如随机从全部节点中选一个。

图7所示。

  • /HBase下的数据存储在A,B,D
  • /Spark下的数据存储在A,B,D,E,F
  • /user下的数据存储在C,D,F
  • /user/shl下的数据存储在A,E,F
图7 基于标签的数据块摆放策略样例

HDFS开源增强特性:HDFS Load Balance

HDFS的现有读写策略主要以数据本地性优先为主,并未考虑节点或磁盘的实际负载情况。HDFS Load Balance功能是基于不同节点的I/O负载情况,在HDFS客户端进行读写操作时,尽可能地选择I/O负载较低的节点进行读写,以此达到I/O负载均衡,以及充分利用集群整体吞吐能力。

写文件时,如果开启写文件的HDFS Load Balance功能,NameNode仍然是根据正常顺序(本地节点—本机架—远端机架)进行DataNode节点的选取,只是在每次选择节点后,如果该节点I/O负载较高,会舍弃并从其他节点中重新选取。

读文件时,Client会向NameNode请求所读Block所在的DataNode列表。NameNode会返回根据网络拓扑距离进行排序的DataNode列表。开启读取的HDFS Load Balance功能时,NameNode会在原先网络拓扑距离排序的基础上,根据每个节点的平均I/O负载情况进行顺序调整,把高I/O负载的节点顺序调整至后面。

HDFS开源增强特性:HDFS冷热数据迁移

Hadoop历来主要被用于批量处理大规模的数据。相比处理低时延,批处理应用更关注原始数据处理的吞吐量,因此,目前已有的HDFS模型都运作良好。

然而,随着技术的发展,Hadoop逐渐被用于以随机I/O访问模式的操作为主的上层应用上,如Hive、HBase等,而这种时延要求较高的场景中,低时延的高速磁盘(如SSD磁盘)可以得到广泛的应用。为了支持这种特性,HDFS现在支持了异构存储类型,这样用户就可以根据自己不同的业务需求场景来选择不同的数据存储类型。

因此,HDFS可以根据数据的热度,选择不同的存储策略。如将HDFS上频繁访问多次的数据被标识为ALL_SSD或HOT,被访问几次的可以标识为WARM,而只有访问1~2次甚至更少的可以被标识为COLD等,如下图为不同的数据热度,可以选择不同的数据存储策略。

但是,这些高速低时延磁盘,例如SSD磁盘,通常比机械磁盘贵很多。大部分用户希望只有那些经常被访问的热数据才能一直被存储在昂贵的高速磁盘上,而随着数据的访问热度下降以及时间的老化,这些数据应该被迁移到价格低廉的存储介质上。

以详单查询场景作为典型的用例场景,进行说明:当最新详单数据刚刚被导入HDFS上时,会被上层业务人员频繁查询,所以为了提高查询性能,可以将这些详单数据最先导入到SSD磁盘中;但是随着时间的迁移,这些数据逐渐被老化,访问频度越来越低,这时便不适合继续存储在高速硬盘上,需要迁移到廉价的存储介质,节省成本。

目前,如下图所示,HDFS无法很好的支持这些操作,需要自己根据业务类型手动识别数据的热度,并且手动设定数据的存储策略,最后手动触发HDFS Auto Data Movement工具进行数据迁移。

因此,能够基于数据的age自动识别出老化的数据,并将它们迁移到价格低廉的存储介质(如Disk/Archive)上,会给用户节省很高的存储成本,提高数据管理效率。

HDFS Auto Data Movement工具是HDFS冷热数据迁移的核心,根据数据的使用频率自动识别数据冷热设定不同的存储策略。该工具主要支持以下功能:
  • 根据数据的age,access time和手动迁移规则,将数据存储策略标识为All_SSD/One_SSD/Hot/Warm/Cold。
  • 根据数据age,access time和手动迁移规则,定义区分冷热数据的规则。
  • 定义基于age的规则匹配时要采取的行为操作。
    • MARK:表示只会基于age规则标识出数据的冷热度,并设置出对应的存储策略。
    • MOVE:表示基于age规则识别出相应的数据冷热度,并标记出对应的存储策略后,并触发HDFS Auto Data Movement工具进行数据搬迁,调用HDFS冷热数据迁移工具并跨层迁移数据的行为操作。
    • SET_REPL:为文件设置新的副本数的行为操作。
    • MOVE_TO_FOLDER:将文件移动到目标文件夹的行为操作。
    • DELETE:删除文件/目录的行为操作。
    • SET_NODE_LABEL:设置文件节点标签(NodeLabel)的操作。

使用HDFS冷热数据迁移功能,只需要定义age,基于access time的规则。由HDFS冷热数据迁移工具来匹配基于age的规则的数据,设置存储策略和迁移数据。以这种方式,提高了数据管理效率和集群资源效率。