HDFS下海量小文件高效存储与索引方法

(整期优先)网络出版时间:2024-01-11
/ 2

HDFS下海量小文件高效存储与索引方法

陈明星 代旭高

云南工商学院 云南省昆明市651700

摘要:随着互联网的不断发展,数字信息正在呈爆炸式增长,如何高效地处理和存储海量数据成为一个亟待解决的问题。分布式文件系统 HDFS为当前众多主流的分布式应用提供了稳定的存储层服务,有着非常良好的扩展性和容错性.但是 HDFS 是为大文件的存储和流式访问而设计的,海量小文件的存储将会极大地消耗 NameNode 的内存从而影响性能。在查询性能上优于 HBase,高效地实现了 HDFS 下海量小文件的存储、管理和检索,MDCI 方案适用于需要在 HDFS 下存储、管理和查询包含多维元信息并且文件数随时间线性递增的海量小文件存储应用。

关键词:HDFS;海量小文件;索引

近年来,企业和个人数据都呈现爆炸性增长的趋势,现在全球每两天所创造的数据量等同于从人类文明产生的数据量的总和。如何存储海量的数据,成为当前存储系统所面临的巨大挑战。传统集中存储方式已经满足不了数据存储的需求,于是出现了用于大规模数据存储的分布式文件系统,如 Google File System(GFS)、Hadoop File System(HDFS)、PVFS、Luster 等。分布式文件系统具有良好的可扩展性和容错特性,能够满足海量数据存储的需求。但是在很多应用场合除了要求支持海量大文件的存储,还需要支持海量小文件的存储。虽然 GFS、HDFS 等分布式文件系统能够满足大文件的高效存储,但在存储海量小文件时,效率却很低。针对此问题,工业界和学术界提出了很多方法,但普遍存在性能低,系统可靠性不高,不能高效存储小文件元数据等问题。

一、HDFS

HDFS 是一个高度容错性的系统,适合部署在廉价的计算机上。HDFS 提供了高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS 支持流式读取文件系统的数据。

1、硬件错误。对于普通 PC 服务器而言,硬件错误是常态的而非异常,在 Hadoop大型集群系统中,成百上千的服务器出现硬件问题是不可避免的。面对由很多的组件组成的系统,任何一个组件都有可能瘫痪。因此错误的快速检测和修正是HDFS 系统体系结构核心的设计目标。

2、流式数据访问。运行在 HDFS 的应用和普通的应用不同,需要流式访问它们的数据集。HDFS 设计中更多的考虑数据批量处理,而不是用户交互处理。比之数据访问的低延迟问题,更关键的问题是数据访问的高吞吐量。POSIX 标准设置的很多硬件约束对 HDFS 应用系统不是必须的,所以在一些关键方面需要对 POSIX语义进行一定的修改。

3、大规模数据集。运行在 HDFS 上的应用程序具有很大的数据集,HDFS 上一个典型文件大小一般都在 G 字节到 T 字节之间。因此,HDFS 被设计为支持大文件存储。它应该能够提供高的传输带宽,能在一个集群里扩展到数百个节点。一个单一的 HDFS 应该支撑数以千万计的文件。

二、HDFS 下海量小文件高效存储索引方法

海量小文件存储系统通过设计数据文件将同一目录下的小文件数据进行合并存储,同时系统生成小文件索引。小文件索引记录的是小文件数据的存储位置,以及其他与小文件相关的属性。小文件的索引需要系统去维护管理。如果小文件数量的规模非常庞大,集中式管理小文件的索引,就会产生与 HDFS 在存储海量小文件时产生相似问题。因此,本文将小文件的索引交由各个数据结点进行维护管理并由数据结点对客户端提供索引服务。

1、小文件索引。小文件的索引记录着小文件在具体数据文件中的位置以及小文件的其他属性,它是用户在存储完小文件的数据后必须要为其创建的,索引记录中包含小文件的名称、小文件所在的数据文件路径以及在数据文件中的偏移量。数据文件名所占的位数决定了一个目录下数据文件的数量,偏移量所占的位数决定了数据文件的大小。以上说明了一个目录下存储数据的容量是有限的。

2、小文件的索引位置。小文件索引分布到各个数据结点来管理。海量小文件的索引数据虽然很庞大,但是分布到数据结点上后,单一结点上的索引数据就相对很小,并且集群存储海量小文件的能力取决于集群的规模。集群规模的大小不仅能够决定存储容量的大小,更能体现存储海量小文件数量的大小。数据结点维护小文件的索引,并向客户端提供索引服务。小文件的索引位置描述维护小文件索引的数据结点。小文件的索引按照其所在的父目录进行分类,其目的是将同一目录下的小文件索引由同一数据结点进行管理。索引位置映射表由元数据结点进行管理,客户端在查询小文件索引时,首先需要知道维护该小文件索引的数据结点位置。它通过将小文件的路径传给元数据结点,然后元数据根据小文件路径的父目录查询索引位置映射表找到数据结点位置。在元数据结点设计索引位置维护模块如图。

专门用于为目录分配数据结点,维护索引位置映射表。索引位置维护模块根据元数据结点维护的全部数据结点从中选择分配给目录。索引位置映射表持久化到本地磁盘上,当它的数据发生变化时,其磁盘上的内容也要重新进行更新。如果索引位置维护模块在给目录分布数据结点时找不到足够的数据结点,该模块会将未分配的目录插入到目录等待分配队列中,同时该队列的内容也要持久化到磁盘上,队列一旦有新的目录添加或删除都需要重新更新到磁盘上。元数据结点启动时需要将磁盘上队列数据读取到内存中。该队列的目的是等待分布式文件系统有新的数据结点注册加入时,索引位置模块对队列中的目录进行重新分配。同样队列每次更新也需进行持久化。数据结点与元数据结点通过心跳的方式来进行结点健康检测,当元数据结点在一定的时间内收不到某一数据结点的心跳,该数据结点就会被元数据结点记录为“死”结点,直到重新接受到心跳。这样元数据结点就会维护一个完整的数据结点信息列表。在元数据结点检测到一个“死”结点时,索引位置维护模块它需要扫描索引位置映射表,将该“死”结点从索引位置映射表中剔除并寻找一个新的数据结点进行替代。

3、系统实现。

(1)上传。上传流程: Client 端向 Server 端发送文件元信息并获取到文件存储路径,然后直接通过 HDFSClient 将文件上传到HDFS 上. 未合并的小文件对应了多个临时元信息文件,我们将这些未合并的文件元信息缓存在 Server 的内存中以避免查询时读取大量的临时元信息文件( 小文件) ,降低查询响应时间 . 当Server中保存的临时元信息队列的长度到达一定数量时再对这些小文件进行合并。

(2)查 询。对查询时的多个查询条件,MDCI 采用了列存储中不可见连接的思想实现多个维度的查询条件的过滤,对于检索条件中的每一个查询维度,扫描对应维度的列索引信息得到位向量,然后将所有查询维度的位向量( 包括删除状态索引) 进行与计算,得到目标向量。最终根据目标向量在记录定位索引中查找文件元信息的位置,再从文件元信息表中的对应位置读取出文件元信息,最后返回查询结果 List,算法如下:算法 query输入: SearchCondition,包含多个维度的查询过滤条件,不同维度上可支持等值查询或范围查询.输出: List < FileInfo > ,符合条件的文件元信息 List.

1. bool[]targetVec = DSIDX. readAll( ) / /删除标记

2. for( filter: SearchCondition)

3. bool[]tmp = SCIDX. filter( filter) / /过滤

4. targetVec = targetVec & tmp / /与操作

5. endfor

6. long[]posArr = RPIDX. getPos( targetVec)

7. List < FileInfo > resultList = MIT. read( posArr)

8. return resultList

查询时索引文件的扫描都是 Server 端通过 HDFSClient读取 HDFS 上的多维列索引和文件元信息表完成的。

通过HDFS 下海量小文件高效存储与索引方案,通过将大量小文件合并为大文件进行存储,Server 后台自动合并和删除小文件,实现了小文件的自动管理和用户的透明访问. 通过文件元信息表和多维列索引,实现了小文件在多个维度上的快速自由检索。

参考文献:

[1] 泰冬梅. 基于 Hadoop 的海量小文件处理方法的研究[D]. 辽宁: 辽宁大学,2018,10.

[2] 文艾,王磊.HDFS: Hadoop 分布式文件系统深度实践[M]. 北京: 清华大学出版社,2018: 27.

[3] 范东来. Hadoop 海量数据处理技术详解与项目实战[M]. 北京: 人民邮电出版社,2019: 20-21.

[4] 蔡斌,陈湘萍. 深入解析 HadoopCommon 和 HDFS 架构设计与实现原理[M].北京: 机械工业出版社,2019.11.