首页> 中国专利> 一种分布式环境下避免全局排序的海量数据分页查询方法

一种分布式环境下避免全局排序的海量数据分页查询方法

摘要

本发明涉及一种分布式环境下避免全局排序的海量数据分页查询方法。该方法包括索引构建和分页检索。其中索引构建方法包括:1)根据待排序的不同属性,将数据复制成相应的份数;2)根据待排序的属性对相应的每一份数据进行排序,并将排序后的每一份数据保存在不同的文件夹;3)将每一份数据拆分成多个数据文件,每个数据文件分配一个唯一的索引编号IndexNo;4)对每一个数据文件添加一列,该列的值与数据文件的索引编号IndexNo相同;5)根据数据文件构建索引文件,索引文件的每一条记录描述一个数据文件的信息。针对排序列分页检索,本发明可以避免全局排序和大量数据结果收集;针对条件列过滤,本发明可以避免全局数据扫描。

著录项

  • 公开/公告号CN107103032A

    专利类型发明专利

  • 公开/公告日2017-08-29

    原文格式PDF

  • 申请/专利权人 中国科学院计算机网络信息中心;

    申请/专利号CN201710169498.8

  • 发明设计人 王学志;周园春;黎建辉;王逢阳;

    申请日2017-03-21

  • 分类号G06F17/30(20060101);

  • 代理机构11200 北京君尚知识产权代理事务所(普通合伙);

  • 代理人邱晓锋

  • 地址 100190 北京市海淀区中关村南四街4号

  • 入库时间 2023-06-19 03:10:37

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-02-28

    授权

    授权

  • 2017-09-22

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20170321

    实质审查的生效

  • 2017-08-29

    公开

    公开

说明书

技术领域

本发明涉及数据库和大数据领域,具体涉及一种基于分布式海量数据的检索及分页方法。

背景技术

分页查询一般需要两个结果,其一是根据查询条件命中的查询条数Count,Count用来计算总页数,为页码导航栏提供数据;其二是当前页(PageNo)数据,该数据一般直接反馈给用户(例如显示到Web平台)。在应用程序中对数据分页查询的传统处理方法是一次性从数据库中检索出所有符合条件的结果,并将结果数据从数据库服务器端传输到客户端缓存,然后客户端通过应用程序内部编程对查询的结果进行分页显示。在大数据环境下该种方式存在两个问题。第一个问题是,如果查询结果数据量很大,很难缓存所有数据结果。第二个问题是,在利用数据库查询时,如果分页查询必须进行排序(Order by)操作,这导致计算非常缓慢。

大数据指的是数据规模庞大,通常达到PB级以上级别。在大数据下分页查询面临三个问题。其一,在利用集群进行计算时,例如利用Spark的OrderBy操作对数据进行排序,要花费大量时间。其二,在查询结果很多时,要从集群的各个节点收集数据,这导致非常频繁的网络IO和磁盘IO,计算缓慢,很难到达实时查询。其三,查询结果集庞大,全部缓存到内存很困难。同时,大量用户对不同查询条件在匹配大量数据时,大量用户和每个用户查询结果都过大,因此很难全部缓存到内存中。

Spark是基于内存的分布式并行计算框架,诞生于2009年,由加州大学伯克利分校AMP实验室开发,现在是Apache软件基金会旗下的顶级开源项目。Spark抽象出了弹性分布式数据集RDD(Resilient Distributed Datasets),它是一种基于内存的集群计算容错抽象。Spark基于RDD的内存计算拥有Hadoop MapReduce计算模型的所有优点,但不同于Hadoop MapReduce的是中间结果和最终结果不需要保存到HDFS,可以直接保存到内存中;海量数据很难在数据库中查询,利用Spark可以进行高效的分布式计算,因此本发明的实施阶段采用Spark技术。

发明内容

针对大数据在分布式下分页查询时命中数据量大,每次查询需要全局排序和从集群的各个机器上收集大量结果数据问题。本发明设计了一种基于分布式环境下数据查询的索引结构和分页检索方法,该方法可以很好的解决上述问题。针对排序列(相当于在数据库中对该列OrderBy操作)分页检索,该方法可以避免全局排序和大量数据结果收集;针对条件列过滤(相当于数据库where语句中的条件列语句),该方法可以避免全局数据扫描。

本发明采用的技术方案如下:

一种分布式环境下海量数据的索引构建方法,其步骤包括:

1)根据待排序的不同属性,将数据复制成相应的份数;

2)根据待排序的属性对相应的每一份数据进行排序,并将排序后的每一份数据保存在不同的文件夹;

3)将每一份数据拆分成多个数据文件,拆分规则是:从第一条数据开始每M条数据保存成一个数据文件,每个数据文件分配一个唯一的索引编号IndexNo,索引编号IndexNo从1开始依次累加分配;

4)对步骤3)形成的每一个数据文件添加一列,该列的值与数据文件的索引编号IndexNo相同;

5)根据数据文件构建索引文件,索引文件的每一条记录描述一个数据文件的信息,包括索引编号IndexNo、最小值、最大值、数据条数总和、所在磁盘路径。

进一步地,步骤5)中最小值、最大值都是有序的,为非递减有序序列或者非递增有序序列,索引文件中每一条记录的最小值<=最大值。

进一步地,对于组合属性,如果组合属性有两个,则索引文件添加两列最小值和最大值;如果组合属性有多个,以此类推。

进一步地,采用分布式存储系统和分布式计算框架进行索引构建及数据存储。

一种采用上述方法的分布式环境下海量数据的分页查询方法,其步骤包括:

1)读取所有索引文件和数据文件,缓存到集群中各个机器的内存,并根据排序要求选择相应的文件;

2)从索引文件过滤符合条件的数据文件,并获取文件路径集合PathSet;

3)根据PathSet集合和步骤1)中缓存的数据文件,获取集群中缓存的数据集;

4)根据过滤条件对获取的数据集进行过滤计算,如果满足过滤条件则返回IndexNo;分别计算每个以IndexNo编号的数据文件中符合过滤条件的结果总和,并保存到数据结果分布集IndexNoSet;

5)对IndexNoSet按照IndexNo排序,并从第一个开始依次累加,获取总数据条数Total;

6)根据Total总和,计算查询结果中的分页个数PageSum;

7)根据页码PageNo和每页数据条数PageSize计算数据的第一条记录StartNo和最后一条记录EndNo;

8)根据StartNo和EndNo计算数据所在的文件的IndexNo,然后从索引文件查找对应的数据文件,计算数据文件中满足要求的数据,对数据进行排序;

9)根据步骤8)中获取的数据,计算出当前页所需要的数据,并返回给客户端系统。

进一步地,步骤1)中如果集群规模比较大,则将所有数据文件缓存到内存,如果集群规模较小,则缓存频繁读的数据文件。

进一步地,步骤3)判断过滤条件是否是排序属性,如果是排序属性,则直接根据索引文件中的最小值和最大值进行过滤,将过滤的数据文件路径保存到路径集PathSet中;如果过滤条件不是排序属性,则将索引文件中所有路径加入到PathSet中。

进一步地,步骤5)中数据结果分布集IndexNoSet的元素格式为(IndexNo,Count)二元组,其中Count代表以IndexNo编号的数据文件中符合过滤条件的结果总和。

进一步地,采用分布式存储系统和分布式计算框架实现分页查询。其中步骤4)可在分布式计算框架中计算;进行具体的分页数据查询的步骤7)、8)、9)是直接计算,而不是使用分布式集群计算。

本发明的有益效果如下:

1)有利地,由于Count计算的计算量大,采用集群进行分布式计算,可以大大减少计算时间。

2)有利地,在进行Count计算时,由于不需要收集所有结果数据,因此可以大大减少网络IO和磁盘IO,并且随着集群规模的增加,具有很强的扩展性。

3)有利地,由于数据是根据IndexNo提前排序的,因此避免了查询时全局排序,在进行查询时,避免了结果收集和全局排序对集群的压力,而且最终分页的结果数据也是排序的。

4)有利地,由于Count计算中已经计算了数据结果的分布情况,分页查询时要计算的数据很少,计算量也很小,不需要分布式并行计算,单机计算即可。因此可以减少集群的压力,减少集群的任务量。

5)有利地,由于在Count计算的时候,数据是按照IndexNo计算求和的,而每一个IndexNo数据都在一个文件中,因此每个IndexNo数据在集群中分布在少量的机器上,能够最大程度的满足数据的本地性,集群在Shuffle计算的时候能够最小程度的进行网络IO通信。

附图说明

图1是单列排序索引文件结构和数据文件结构图。

图2是组合属性排序索引文件结构和数据文件结构图。

图3是Spark集群下创建排序索引文件和数据文件流程图。

图4是分页查询流程图。

具体实施方式

下面通过具体实施例和附图,对本发明做进一步说明。

本发明设计了一种基于分布式环境下数据查询的索引结构和分页检索方法。该方法包括索引构建和分页检索等。

1、索引构建

1)对每一个要排序的属性复制一份,假如用户经常对属性1Field1升序,属性2Field2升序,或者组合属性3Field3升序,然后属性4Field4升序进行排序,那么对原始数据复制三份。然后对每一份数据进行如下操作。

2)分别对每一种排序属性进行排序。对第一份数据进行Field1升序排序,对第二份数据进行Field2升序排序,对第三份数据进行Field3升序和Field4升序排序。

3)分别保存第一份数据,第二份数据,第三份数据到不同的文件夹。文件夹名称分别为Field1,Field2,Field3_Field4。

4)对每一份数据,将数据拆分成多个数据文件。规则如下,从第一条开始每M条数据保存成一个数据文件,每个数据文件分配一个唯一的IndexNo编号,IndexNo编号从1开始依次累加分配。比如M等于10000,第一个文件为1.txt,保存的数据为1-10000条数据,第二个文件为2.txt,保存的数据为10001-20000条数据,以此类推。对每一个属性,最终将数据分别保存到对应的文件夹下。

5)对每一个数据文件添加一列,该列的值与数据文件的索引编号IndexNo相同。比如1.txt中每一行添加一列属性1,2.txt中每一行添加一列属性2,以此类推。

6)根据数据文件构建索引文件,索引文件的每一条数据描述了一个数据文件的信息。索引文件的每一条数据中包含索引编号IndexNo、数据文件中Field1的最小值Min1、数据文件中Field1的最大值Max1、数据文件数据条数总和Total、数据文件所在磁盘的路径Path。有利地,Min1和Max1都是非递减有序序列,索引文件中每一条记录Min1<=Max1;如果是组合属性,假如组合属性有两个,索引文件添加四列Min1、Max1和Min2、Max2。如果组合属性有多个,以此类推。如图1所示的单列排序索引文件结构和数据文件结构图,以及图2所示的组合属性排序索引文件结构和数据文件结构图。

2、分页检索

1)读取所有索引文件和数据文件,并缓存到集群中各个机器的内存。

2)根据排序要求选择文件。如果按照Field1排序,选择Field1文件夹下面的文件。如果按照Field2排序,选择Field2文件夹下面的文件。如果按照Field3排序和Field4排序,选择Field3_Field4文件夹下面的文件。

3)首先在索引文件中过滤。如果存在Where过滤条件,并且过滤条件是排序索引Field1,则首先从索引文件过滤符合条件的数据文件,并获取文件路径集合PathSet。如果满足Field1>=Min1并且Field1<=Max1则将Path加入到PathSet集合。

4)如果过滤条件不是排序索引Field1,则将所有索引文件中的所有Path路径加入到PathSet集合。

5)根据PathSet集合和1)中缓存的数据文件,获取集群中缓存的数据集。

6)根据过滤条件对步骤5)获取的数据集进行过滤计算。例如FieldX字符串类型,过滤文本是否含有指定的过滤字符串,类似数据库中的like操作等。

7)如果6)中满足过滤条件,则返回IndexNo。分别计算每个以IndexNo编号的数据文件中符合过滤条件的结果总和,并保存到数据结果分布集IndexNoSet。元素格式为(IndexNo,Count)二元组,其中Count代表以IndexNo编号的数据文件中符合过滤条件的结果总和。

8)对IndexNoSet按照IndexNo排序,并从第一个开始依次累加,获取总数据条数Total。

9)根据Total总和,计算查询结果共有多少个分页PageSum。

10)根据页码PageNo和每页数据条数PageSize计算数据的第一条记录StartNo和最后一条记录EndNo。StartNo=PageNo*pageSize。EndNo=PageNo*(PageSize+1)-1。

11)根据StartNo和EndNo计算数据所在的文件的IndexNo,然后根据IndexNo从索引文件查找对应的数据文件,计算数据文件中满足要求的数据,对数据进行排序。

12)根据11)中获取的数据,计算出当前页PageNo所需要的数据,并返回给客户端系统。

下面提供一个具体应用实例,本实例采用Spark技术。

1.索引构建及数据存储:

Spark集群下创建排序索引文件和数据文件的流程如图3所示,包括以下步骤:

(1)将原始数据上传到HDFS分布式文件系统中。

(2)根据排序列,利用spark分布式计算框架,将数据按照排序列排序,其中SortByKey的key指定为排序列,并利用ZipWithIndex分配排序编号ID。

(3)利用(2)中的ID对数据文件最大记录数SubFileMax取模(取余数),取模结果为文件索引编号IndexNo。

(4)对(3)的结果进行GroupByKey,其中key为IndexNo,然后将结果收集并保存到HDFS的DataPath中,其中文件名称为IndexNo.txt。

(5)对(3)的结果进行GroupByKey,其中key为IndexNo,然后对每一个key的list计算索引编号,最小值,最大值,总条数,以及分配文件路径,即分配(IndexNo,Min,Max,Total,Path)。

(6)利用SortByKey对IndexNo进行排序,然后将5元组结果保存到HDFS的IndexPath,当做索引文件。

2.分页检索:

分页查询流程如图4所示,包括以下步骤:

(1)利用Spark将所有索引文件缓存到内存中。选择要缓存的数据文件,如果集群规模比较大,可以将所有数据文件缓存到内存,如果集群规模较小,可以缓存频繁读的数据文件。

(2)判断过滤条件是否是排序属性,如果是排序属性,则直接根据索引文件进行过滤。即根据索引文件中的Min和Max属性进行过滤,将过滤的数据文件Path保存到路径集PathSet中。如果过滤条件不是排序属性,则将索引文件中所有Path加入到PathSet中。

(3)根据(2)中的PathSet加载数据集生成RDD,再次根据过滤条件对每一条数据进行filter过滤。利用map操作,返回二元组(IndexNo,1)。

(4)利用reduceByKey进行累加,其中key为IndexNo。将结果利用sortByKey进行排序并收集到driver端,保存为resultSet,并缓存到服务器端。

(5)根据常用的分页计算公式直接计算出当前页所需数据,读取当前页数据所在文件,从HDFS读取当前页数据,返回给客户端。

本发明也可以利用MongoDB、HBase、Hive等NoSQL数据库进行实施,实施效果和利用Spark效果类似,可以避免全局排序,对海量数据实现分页查询。

以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号