海量结构化数据存储检索系统

荣成历史解密网 2020-08-05 09:29:47

引言

Big Data是近年在云计算领域提出的对数据的加载效率、存储规模以及数据的检索效率有很高要求的应用场合,通常数据的加载效率在Mb/s甚至Gb/s量级,数据的存储规模在TB甚至PB规模,本文称这种模式为大数据集管理。大数据集的一类重要应用针对结构化数据的存储与检索。典型的应用如海量日志、络报文以及web2,0框架下的SNS,电子商务,数据挖掘等应用场合。传统的RDBMS由于数据一致性的约束,在管理大规模数据集存储条件下,在数据更新、局部数据失效以及系统扩展性等方面工作效率低下。目前的解决思路是:通过放宽对于数据一致性的要求,取消复杂的关联查询,结合具体的应用场景,提高系统的可用性。但是由于大量的记录存放于同一个表空间中,会达到数十亿条甚至上百亿条记录的规模。在如此大规模数据存储条件下,如何高效的实现数据的存储、检索都面临着新的挑战。

Google对这一问题进行深入分析,结合Google的业务背景,提出Bigtable数据管理方法,建立列存储数据结构,提供基于Row-Key的数据检索接口。此后,业界也纷纷提出分布式结构化数据存储管理模型,也称为No-SQL(Not Only Sql)数据库。典型的No-SQL数据库包括Dynamo,Cassandra, PNUTS,Hbase以及Hypertable等:但是目前的海量结构化数据管理系统对于数据检索的多属性支持较弱,通常仅提供基于Key的读取GET和写入PUT操作,不具备多属性查询,数值统计、分析等复杂的查询功能。

目前基于Hadoop提出的数据仓库工具HIVE、PIG等,可以支持复杂的查询条件,但是不适用于流数据的高效存储与检索。如HIVE仅支持文本文件的批量导入,不支持流数据频繁加载操作。在复杂条件的检索过程中HIVE会把查询条件分解成多个MapReduce任务,每个Map过程以及Reduce结果都要把文件写入到集群文件系统中进行缓存,导致系统检索效率低,不适用于流数据的高效存储与查询。

针对该问题,本文基于Hadoop建立面向结构化流数据提出具有数据加载和快速检索的分布式数据存储系统MDSS(Massive Data Storage System),建立二维表空间数据管理模型,重点解决数据的分布存储与复杂条件的快速查询问题。

1 MDSS系统工作原理

大数据集要求较高的数据加载效率、数据存储效率以及数据检索效率,目前主要的解决思路是利用多机协同的分布式存储环境提高系统的处理效率。MDSS分布式系统结构如图1所示,系统包括三个部分:加载机集群、查询机集群、元数据节点集群以及存储节点集群。

图1 MDSS系统结构图

加载机集群:整个系统的数据加载端。可以以进程为单位,在多台设备上同时建立多个并发数据加载客户端,通过并发加载提高系统整体加载效率。在MDSS中,加载机集群同时缓存近期入库的数据,经过固定的时间周期,把缓存数据通过Gb Ethernet写到数据存储管理装置中。

查询机集群:用户在查询机上发出查询指令,查询机根据元数据节点集群保存的元数据信息,向存储节点分发查询任务,最后汇总多个存储节点返回的查询结果,提交给用户;

存储节点集群:持久存储长期保存的历史数据。把数据源进行分块存储,通常把一次或几次从加载机刷新到集群中的数据作为数据分块。

[page] 元数据节点集群:用来协调整个集群的工作,查询子任务的并发执行,保存整个系统工作所需的元数据信息。元数据节点集群存储的元数据包括:系统节点状态信息;索引分片具体的存储位置信息;表空间元数据、每个表空间的一些辅助信息以及系统的工作日志等。MDSS系统主要支持分布式的数据存储和检索,具体数据查询流程如图2所示。

①用户在查询机上提交查询请求;

②查询机根据具体的查询任务,向元数据节点查询对应表空间元数据和检索所需的元数据信息;

③元数据节点集群根据查询条件,提供检索所需的元数据,例如:对应的表空间结构数据,索引分块与节点的映射关系等;

④查询机根据元数据信息,建立查询规划,决定向哪些存储节点发送查询命令。某些查询可以利用元数据信息优化查询过程。由于加载机会缓存有近期的数据,针对近期数据的查询会发送到加载机;

⑤数据存储节点根据检索条件,检索符合条件的数据集,并发回给查询机,查询机对查询结果进行最后的汇总、统计,以及必要的后期数据处理工作;

⑥查询机对结果集按照用户指定的格式封装,返回给查询用户,完成一次完整的数据查询过程。 在上述检索过程,涉及两个核心的问题是:存储系统采用何种数据存储模型以及针对复杂查询条件的具体的任务分解方法,下面分别在第3部分介绍MDSS采用的数据模型;在第4部分介绍复杂查询条件的任务分解机制。

2 MDSS中数据模型与存储结构

2.1数据模型

MDSS为用户提供二维表空间数据管理模型,以记录为单位,每个记录内包含多个字段或属性,表空间利用表结构描述字段类型。

数据类型由表结构文件描述。表结构文件在创建表空间时生成,保持到元数据节点集群中,MDSS设计了一种针对单表空间内面向流记录的数据统计与分析语言,语法规则与标准的SQL相同,但是取消了标准SQL中关联查询、嵌套查询、视图等复杂的检索功能,本文简称为MQL语言,具体支持的查询功能如表1所示:

图2 基本数据模型

表1 MDSS基本操作方法描述

[page] 2.2数据存储组织结构

数据存储格式主要分为两种类型:STORE类型和字符类型。STORE类型直接存储文件信息,对数据内容的解析由用户完成。字符类型存储方式把数据源以字符方式分块存储。字符存储方式可以在异构存储环境中自由的迁移,具有更大的灵活性。字符类型可以处理数据类型包括:INDEX,IPFIELD,TIMESTAMP以及INTEGER等,在数据加载时根据表结构定义的数据类型进行数据转换。比如整数10在字符类型中需要存储。这部分的转换工作在加载机上实现。

在每个索引分片内部引入块内索引,用来标记索引分块内部不同字段属性数据的具体存储位置。索引块的大小通常使用固定大小空间存储,便于一次性加载到内存中进行数据统计,目前是4K大小。索引分片在存储节点上采用gzip压缩算法进行数据压缩,由于内容相同的字段根据字典序排序后相邻存储,因此引入压缩技术会显著提高数据的存储效率。

在日志、流记录等应用场合,时间属性是最常用的检索属性,MDSS采用时间属性对数据进行分区管理,索引分片之间保持时间有序。同时建立基于时间属性的分布式B+ Tree,加快分区数据的检索过程。B+ Tree的叶节点保存每个索引分片对应的最大时间属性和索引分片的存储节点的位置。分布式B+ Tree保存在元数据节点集群中。具体结构如图4所示。

图3 数据组织结构图

索引分片数据作为基本的调度和计算单位,持久存储到存储节点上。当数据从加载机刷新到存储节点集群时,根据设置的副本冗余度和集群存储节点列表,按序选择可用的存储节点,写入数据。当设置副本冗余度时,加载机会选择不同的节点分别写入数据。

在数据检索时,一个索引分片检索结果如果超过返回时间限制,可以选择对应的索引分片的副本重新执行检索操作,实现数据容错功能。限于篇幅,关于数据详细的组织方式不再详述。

3. MDSS数据检索方法

MDSS执行复杂查询条件的基本原则是对查询条件划分成查询子任务,每个子任务在分布式环境下的不同层次上并发实现。查询条件的分解和查询子任务的划分,既要保证查询语义的正确性,同时需要充分考虑分布式环境下影响数据检索的多种因素,充分发挥分布式环境下并发、并行的计算能力。

3.1查询条件分解

MDSS把具体的查询条件分解为三类基本条件,每类基本条件作为一类查询子任务。

分区查询条件:分区查询条件直接定位于满足查询条件的目标索引文件,大大缩小海量数据的查询范围。MDSS选择时间属性作为分区查询条件;

过滤查询条件:结构化数据每条记录由多个字段组成,每个字段可以独立设置查询条件。字符类属性支持模糊查询,数字类的支持比较查询等。多个过滤查询条件之间通过逻辑运算符号AND OR NOT进行连接,构成多个逻辑组合查询条件。AND OR NOT之间满足基本的集合运算关系;

统计分析查询条件:统计分析类查询条件主要用于经过分区查询条件、过滤查询条件后返回的结果集,实现面向全局数据集的统计、分析操作。

具体的查询条件包括:数据分组操作(GROUP BY),数据排序操作(ORDER BY),TOP-K,以及统计函数,如SUM,AVG,MAX,MIN等。

[page] 3.2查询子任务的并发执行与数据汇总

在分布式环境下,可以把一个具体的复杂查询任务按照上述分类方法分解成三类基本查询条件,每类查询条件对应一种查询子任务,利用分布式环境下的不同层次执行具体的查询子任务。

MDSS采用时间属性作为分区类检索条件,根据检索条件中的时间属性可以直接检索到符合条件的目标索引分片,加速检索过程。这一点与目前的No-SQL数据库不同,目前No-SQL数据库通常按照关键字进行数据块分裂,并涉及到新老数据块的迁移、合并等操作。MDSS采用时间属性作为分区条件简化了数据管理策略,同时符合日志类数据,流数据的应用场景。

统计分析类查询条件主要针对具有分组,排序,数值分析,以及TOPK类的检索条件进行具体操作。这类查询操作需要根据全部的结果集进行统计后才能给出正确的查询结果。

MDSS针对部分查询做了特殊优化处理。比如仅对字段属性进行简单统计的分组、排序、去重等查询,如SELECT DOMAIN ? GROUP BY(ORDER BY) DOMAIN;SELECT DISTINCT *?,尽管具有统计分析函数标识,但是由于在存储节点上进行计算不会影响最后查询结果的正确性,MDSS会选择放到底层存储节点上同过滤类查询条件一起并行执行。此时返回的子查询结果集是已经分好组、排好序或去重后的结果集,最后的数据汇总阶段只做一次对应的统计操作,会大大提高数据汇总阶段的执行效率。

4. 实验结果与分析

为了测试系统的具体性能,针对某运营商DNS访问记录进行落地存储。实验环境为:加载机为两个节点, 配置为AMD Opteron 2378 8核800MHz 8G内存X 2;查询机一个节点,配置为AMD Opteron 2378 8核800MHz 16G内存;元数据集群一个节点,具体配置为AMD Opteron 2378 8核800Mhz 16G内存。四个存储节点,具体配置为AMD Opteron 8380 4核800MHz X 4。存储节点加载磁盘阵列,每个节点加载5T磁盘空间,集群提供20T的磁盘存储空间。

系统连续运行50天左右,平均每天入库数据量亿条记录,保存DNS记录230亿条左右,占用的存储空间14TB。在当前数据规模条件下进行具体的实验测试。

首先给出不同的检索时间间隔对检索效率的影响。针对:00:00:00到:24:00:00期间内,连续24个小时的数据进行实验分析。该时间段内的保存的记录数目为条。具体的检索条件包括下列条件:

模糊检索条件:DOMAIN=www.*.;

精确匹配属性检索:TYPE=A;

分区检索条件:TIME=T;

设检索时间为T为参数,当T取不同时间间隔时,检索效率与具体的时间关系如图4所示。

图4 不同检索时间间隔对应的检索效率

[page] 从图4可以看出检索效率基本上与检索条件的时间间隔成线性增长。在数据库规模为230亿记录存储空间为14TB四个存储节点条件下,对24个小时内的数据进行多属性检索时,检索时间在140s左右返回查询结果。该结果远远高于传统数据库的查询效率。其主要时间消耗在查询机从元数据节点查询元数据信息以及多查询节点间的数据通信和汇总上。

从图5中可以看出,MDSS检索效率与返回的结果集有关。当结果集过大时,不仅传输数据、数据汇总占用更多的时间,在使用列存储结构,重构整条原始记录都会占用更多的时间。

图5 检索效率与返回的结果集数目关系

图6显示,当使用多个逻辑条件组合时,检索条件通过OR或AND进行连接,检索效率与多检索条件个数之间的关系。通过图示可以看出,逻辑条件的个数增加时(实验中增加到32个检索条件),检索时间基本不发生变化。

图6 检索效率与过滤类检索条件的关系

由于过滤类检索条件在分布式存储节点上并发执行,每个节点针对具体的索引分片启动多线程检索,同时MDSS索引分片采用列存结构,适于应用在大数据集、复杂检索条件的分析应用中。

结合上述两个实验,可以得出MDSS具体的查询效率主要与检索结果集数目有关,当结果集过大,由分布式系统的数据通信、查询机上的数据汇总等操作会占用较多的时间,进而导致系统检索效率下降。对于相对复杂的检索条件可以根据具体索引结构、数据存储组织方式进行具体的优化。目前MDSS系统可以有效解决多属性数据检索需求,而对于更复杂的关联查询,正在进一步的研究设计中。

5 结束语

本文结合了传统关系型数据库设计思想并借鉴了云存储中常用的数据管理方式,建立面向结构化数据的海量数据存储检索系统。系统支持结构化数据的高效加载、分布存储与复杂条件的查询功能。进一步改进主要的改进方向包括,如何提高元数据的管理、访问效率;如何建立分布式环境下面向复杂条件的高效查询规划等方面。

云南白癜风医院哪家好
深圳治白癜风专科医院
贵港男科医院
友情链接