背景技术
随着数据库技术的发展和应用,数据库存储的数据量与日俱增,同时快速、灵活地进行大数据量的复杂查询处理也成为新的需求。OLAP(On-Line Analytical Processing,联机分析处理),专门用于支持复杂的分析操作,侧重对决策人员和高层管理人员的决策支持。通常状况下,OLAP用户只需要查询少数的几个数据列,利用行式存储会加载很多无用的数据列,导致查询性能下降。分布式列式存储的基本查询方法首先从zookeeper中读取元信息,进而去集群中各个机器读取所有的数据文件,进而从每个数据文件中读取满足条件的记录,此方式直接导致数据访问量过大,影响了OLAP的查询性能。
申请内容
本申请的一个目的是提供一种基于索引表的查询的方法及设备,解决现有技术中查询数据时数据访问量过大,影响联机分析处理的查询性能的问题。
根据本申请的一个方面,提供了一种在主节点端基于索引表的查询的方法,所述方法包括:
根据用户的查询请求通过索引表的数据结构查找所述索引表的索引列,并判断所述索引列的值是否为确定值,得到判断结果;
根据所述判断结果确定所述索引表的类型;
通过所述索引表的类型确定所述索引表对应的索引文件所在的从节点;
根据所述索引表对应的元信息将所确定的从节点上的索引文件的位置信息发送至所述从节点,并根据所述数据表的元信息将所确定的从节点上的数据文件的位置信息发送至所述从节点。
进一步地,所述索引表的数据结构中索引文件的结构包括BPlusTree结构。
进一步地,所述BPlusTree结构包括叶子节点的键值和位置信息值,其中,所述键值根据所述索引表的索引列的值确定,
所述位置信息值根据所述索引列所属数据文件的文件名及所述索引列所在的行在所述数据文件中的偏移量确定。
根据本申请另一个方面,提供了一种在从节点端基于索引表的查询的方法,所述方法包括:
根据主节点发送的索引文件的位置信息通过索引文件的数据结构确定所述索引文件所在索引表中的索引列的值;
根据所述索引列的值获取所述索引表中所述索引文件的信息;
根据所述主节点发送的数据表的元信息中数据文件的位置信息,判断所述从节点中是否存在用户查询请求对应的数据文件,若是,则根据所述索引文件的信息获取所述数据文件。
进一步地,所述索引文件的信息包括所述索引文件的数据结构中的键值及位置信息值时,根据所述索引列的值获取所述索引表中所述索引文件的信息,包括:
根据所述索引列的值确定所述索引文件的数据结构中所述索引列的值对应的键值;
根据所述索引列的值对应的键值获取所述索引文件的数据结构中位置信息值。
进一步地,所述索引表的数据结构中的位置信息值,包括:
所述索引列所属数据文件的文件名及所述索引列所在的行在所述数据文件中的偏移量。
根据本申请的又一方面,还提供了一种基于索引表的查询的主节点设备,所述主节点设备包括:
判断装置,用于根据用户的查询请求通过索引表的数据结构查找所述索引表的索引列,并判断所述索引列的值是否为确定值,得到判断结果;
确定类型装置,用于根据所述判断结果确定所述索引表的类型;
定位装置,用于通过所述索引表的类型确定所述索引表对应的索引文件所在的从节点;
发送装置,用于根据所述索引表对应的元信息将所确定的从节点上的索引文件的位置信息发送至所述从节点,并根据所述数据表的元信息将所确定的从节点上的数据文件的位置信息发送至所述从节点。
进一步地,所述索引表的数据结构中索引文件的结构包括BPlusTree结构。
进一步地,所述BPlusTree结构包括叶子节点的键值和位置信息值,其中,
所述键值根据所述索引表的索引列的值确定,
所述位置信息值根据所述索引列所属数据文件的文件名及所述索引列所在的行在所述数据文件中的偏移量确定。
根据本申请再一个方面,还提供了一种基于索引表的查询的从节点设备,所述从节点设备包括:
确定装置,用于根据主节点发送的索引文件的位置信息通过索引文件的数据结构确定所述索引文件所在索引表中的索引列的值;
获取装置,用于根据所述索引列的值获取所述索引表中所述索引文件的信息;
查询装置,用于根据所述主节点发送的数据表的元信息中数据文件的位置信息,判断所述从节点中是否存在用户查询请求对应的数据文件,若是,则根据所述索引文件的信息获取所述数据文件。
进一步地,所述索引文件的信息包括所述索引文件的数据结构中的键值及位置信息值时,所述获取装置用于:
根据所述索引列的值确定所述索引文件的数据结构中所述索引列的值对应的键值;
根据所述索引列的值对应的键值获取所述索引文件的数据结构中位置信息值。
进一步地,所述索引表的数据结构中的位置信息值,包括:
所述索引列所属数据文件的文件名及所述索引列所在的行在所述数据文件中的偏移量。
与现有技术相比,本申请通过根据用户的查询请求通过索引表的数据结构查找所述索引表的索引列,并判断所述索引列的值是否为确定值,得到判断结果;根据所述判断结果确定所述索引表的类型;通过所述索引表的类型确定所述索引表对应的索引文件所在的从节点;根据所述索引表对应的元信息将所确定的从节点上的索引文件的位置信息发送至所述从节点,并根据所述数据表的元信息将所确定的从节点上的数据文件的位置信息发送至所述从节点。在从节点端,根据主节点发送的索引文件的位置信息通过索引文件的数据结构确定所述索引文件所在索引表中的索引列的值;根据所述索引列的值获取所述索引表中所述索引文件的信息;根据所述主节点发送的数据表的元信息中数据文件的位置信息,判断所述从节点中是否存在用户查询请求对应的数据文件,若是,则根据所述索引文件的信息获取所述数据文件。从而通过根据查询条件动态地选择合适的全局索引表并快速确定索引文件位置,接着根据全局索引表的元信息将索引文件加载至内存,结合过滤条件筛选出满足条件的数据文件和偏移量。若数据文件存在于本地,则直接进行后续的查询处理,否则主节点将查询任务和索引信息再次分配给数据文件所在的机器,最后,数据文件所在的机器将满足条件的数据文件加载至内存,根据偏移量从数据文件中读取数据,返回查询结果。通过本申请的查询方法,满足用户不同的筛选条件,有效地筛选出满足条件的数据文件,大大减少了查询时的数据读取量,缩短查询时间,较好地提高了OLAP的查询效率。
具体实施方式
下面结合附图对本申请作进一步详细描述。
在本申请一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
图1示出根据本申请一个方面,提供了一种在主节点端基于索引表的查询的方法流程示意图,其中,所述方法包括:步骤S11~步骤S14,优选地应用于分布式***中数据查询,
在步骤S11中,根据用户的查询请求通过索引表的数据结构查找所述索引表的索引列,并判断所述索引列的值是否为确定值,得到判断结果;在本申请一实施例中,根据用户的查询条件以便判断查找到的索引列的值是否为确定值,根据用户的查询请求确定索引表的索引列,索引表的数据结构中包括了根据索引表的索引列的值确定的键值,得到判断结果,从而为用户提供动态选取相应索引表的可能。
本申请一实施例中,所述索引表的数据结构中索引文件的结构包括BPlusTree结构,在此,索引文件的结构可以为BPlusTree结构,优选地,在所述实施例中,BPlusTree结构包括叶子节点的键值和位置信息值,BPlusTree结构的叶子节点包含元组<键值,位置信息值>(<key,value>),BPlusTree结构能够有效地对输入的索引列数据进行排序,从而可以快速查询索引列对应的记录的位置,快速响应数据的查询任务。其中,所述键值(key)根据所述索引表的索引列的值确定,所述位置信息值(value)根据所述索引列所属数据文件的文件名及所述索引列所在的行在所述数据文件中的偏移量确定,key值为索引列的值,来源于数据文件,value为该索引列所在的数据文件信息和满足条件的记录在该索引文件中的偏移量。
在步骤S12中,根据所述判断结果确定所述索引表的类型;在此,根据判断结果中索引列的值是否为确定值进行动态选择索引表的类型:若所述判断结果为所述索引列的值为确定值,则确定所述索引表的类型为所述哈希类全局索引表,若所述判断结果为所述索引列的值为非确定值,则确定所述索引表的类型为所述范围类全局索引表。
在本申请一实施例中,所述索引表的类型包括哈希类全局索引表和/或范围类全局索引表。在此,哈希类与范围类全局索引表的索引文件在集群中的分配策略略有不同。哈希类全局索引表是根据索引列的哈希值决定索引文件在分布式集群中所分布的机器,而范围类全局索引表则是根据索引列值的范围将索引文件分配到对应的机器。因此,需要根据查询条件动态的选择索引表的类型,在确定索引表的类型后,根据各自的分配策略进行确定索引文件所在的从节点。
本申请一实施例中的分布式***框架图如图2所示,包括客户端(client)、主节点(Master)、一个或若干从节点(slave)以及zookeeper,可将每个数据表中数据文件存储于固态硬盘(SSD)中,在本申请实施例中,数据表的元信息存储在zookeeper中,其中,所述zookeeper为性能分布式应用的协调***。
接上述实施例,图3所示的用户针一数据源的查询sql语句,如Sql 1:“Select*from table A where id=1”表示查询sql 1语句执行的是查询数据表A中id为1的数据列对应的数据,根据该sql 1的查询条件,可确定索引列的值为id的值1,是确定值,则选取哈希类全局索引表进行查询数据;而Sql 3:“Select*from table A where id<5”表示查询sql 5语句执行的是查询数据表A中id小于5的数据列对应的数据,根据该sql 5语句执行的查询条件,可确定索引列的值为小于5,不是确定值,因此针对该sql 5的查询语句需要选取与sql 1不同的索引表,选择范围类全局索引表进行查询数据。
在本申请一实施例中,当所述索引表的类型为哈希类全局索引表时,在步骤S13之前,所述方法还包括步骤S12’,根据所述哈希类全局索引表的索引列的哈希值确定的分配规则,将所述哈希类全局索引表的索引文件的信息值分配至对应的从节点,其中,所述索引文件的信息包括所述索引文件的BPlusTree结构中叶子节点的键值和位置信息值。在此,根据实际需求,确定需要创建全局索引的列,即从数据表中选取部分列作为索引列,进而利用所选取的索引列创建分布式全局索引表对应的元信息,其中,该元信息包括全局索引表所包含的所有索引文件在集群中各个机器硬盘上的位置信息。索引表被创建成功后可以用于分布式***中数据的查询,能够满足用户只需要查询少数的几个数据列的需求的同时避免读取所有的数据文件,大大减少访问的数据量。
具体地,在步骤S12’中,根据所述哈希类全局索引表的索引列的值及所述从节点的个数确定所述索引列的哈希值,将所述索引列的哈希值为i对应的BPlusTree结构中叶子节点的键值及位置信息值分配至第i+1个从节点的索引文件中,其中,i为自然数,从而合理地将索引文件的信息分配至每个slave中,达到均匀分布的目的。需要说明的是,通过确定哈希值,从而确定了索引文件的信息被分配至的机器的信息(如被分配至机器1上),即确定了将哈希值对应的<key,value>分配至的机器的信息。
在本申请一实施例中,假设分布式集群中有1台master,n台slave。哈希类全局索引表通过对索引列求哈希值,而索引列的值为BPlusTree结构中叶子节点的key值,索引列对应的数据文件的信息和索引列对应记录在数据文件中的偏移量为value。将key以及key的哈希值为i的记录的位置信息value分配到第i+1台slave的索引文件中,其中,哈希值可以根据索引列的值及分布式集群中的slave个数确定。
在本申请一实施例中,当所述索引表的类型为范围类全局索引表时,在步骤S13之前,所述方法还包括:步骤S121和步骤S122,在步骤S121中,根据对所述索引列的值进行采样的采样结果确定分配范围区间,并记录每个从节点以及其对应的索引列的分配范围区间;在步骤S122中,根据所述分配范围区间确定的分配规则,将所述范围类全局索引表的索引文件的信息分配至对应的从节点,其中,所述索引文件的信息包括所述索引文件的BPlusTree结构中叶子节点的键值和位置信息值。具体地,在步骤S122中,将所述范围类全局索引表的索引列的值与所述记录的分配范围区间进行比较,确定所述索引列的值所在的分配范围区间;根据所述索引列的值所在的分配范围区间,将所述索引列的值对应的BPlusTree结构中叶子节点的键值及位置信息值分配至所述分配范围区间对应的从节点的索引文件。
在本申请一实施例中,假设分布式集群中有1台Master,n台slave。范围类全局索引表通过对数据表文件的索引列的值进行采样,根据采样结果设定n个范围,使得每个范围内的数据量尽量均匀分布,并在Master中记录每台机器以及其对应的索引列的范围区间。当生成一个索引文件时,会将索引文件的索引列的值与Master中的n个范围进行比较,根据所属范围区域将该列对应的数据文件信息和在数据文件中的偏移量,即<key,value>更新到范围区域相应的slave的索引文件中。
需要说明的是,在创建索引表时,索引文件的大小达到预设的索引文件大小阈值时,生成新的索引文件,Master将所述新的索引文件的位置信息更新至索引表对应的元信息中。在本申请一实施例中,如图4所示的实例的数据源,该数据源共1000条记录,包括地址标识(id)、姓名(name)、年龄(age)、性别(sex)四列数据。将图4中的数据作为数据源,假设分布式***中有1台Master,3台slave,将数据文件的最大范围设定为25行,当输入的数据行数等于最大范围25时,分布式列式存储平台将当前的数据行作为一个数据文件,Master根据负载均衡原则将其输出到集群中某一机器的SSD中对应的数据文件(FileSegment),并更新数据表对应的元信息,针对哈希类全局索引表,key为id的值,value为id对应的数据文件的信息和id对应记录在数据文件中的偏移量信息。通过key值取哈希,将哈希结果为0、1、2的<key,value>元组分别分配到集群中的第1、2、3台机器的哈希类索引表的索引文件(HashIndexFileSegment)中,如图5所示,当id=1时,哈希结果为1,则将其<key,value>存储到集群中的第2台slave中,当id=2时,哈希结果为2,则将其<key,value>存储到集群中的第3台slave中;当id=3时,哈希结果为0,则将其<key,value>存储到集群中的第1台slave中,其中,{key|key%3=哈希值}是指key与slave的个数(这里个数为3)之间进行取余,得到哈希值,这里key为id的值。
当创建范围类全局索引表时,对数据源的key值采样后的范围划分结果如图5所示,范围划分原则应尽量使得各个范围区间内的记录数接近,范围分区的结果包含[1,333]、[334,666]和[667,999]三个区间,并在Master中存储三台slave各自对应的范围区域,当数据块中的索引列的值满足某个范围区间时,将其索引信息存储到该范围区间对应的slave机器的范围类索引表的数据文件(RangeIndexFileSegment)中,以BPlusTree叶子节点的形式存在,如id=5,key值落在第一个范围区间,则将其对应的<key,value>信息存储到第一台机器的索引文件中。
接上述实施例,在步骤S13中,通过所述索引表的类型确定所述索引表对应的索引文件所在的从节点;在本申请一实施例中,确定索引表的类型后,根据各自索引表的类型对应的分配策略计算出满足条件的索引文件在分布式集群中的从节点,具体实现方式可以通过以下实施例实现:
当选择的索引表为哈希类全局索引表时,通过所述哈希类全局索引表确定所述索引列的哈希值;根据所述哈希值确定所述哈希类全局索引表对应的索引文件所在的从节点。在此,当查询条件为索引列的确定值时,则选取哈希类全局索引表,计算出查询条件中列值的哈希值j,则满足条件的索引文件在分布式集群中的第j+1台slave中。
当选择的索引表为范围类全局索引表时,通过所述范围类全局索引表确定所述索引列的值所属的分配范围区间;根据确定的分配范围区间确定所述范围类全局索引表对应的索引文件所在的从节点。在此,若查询条件为索引列的不确定值,则选取范围类全局索引表,根据索引列所属的范围区域,确定满足条件的索引文件分布在集群的相应的slave中。
在本申请一具体实施例中,根据图3所示的查询sql1和sql2,对应key值均为确定值,则对其取哈希,得到id=1对应哈希值为1,确定其索引文件位于集群的slave2中,而id=27对应哈希值为0,确定其索引文件位于集群的slave1中。sql3中的key为不确定值,其查询条件是id<5,恰好落在[1,333]区间内,随即确定其索引文件位于slave1中。在确定了索引文件所在的机器后,两种不同的全局索引表的后续查询步骤相同。
在步骤S14中,根据所述索引表对应的元信息将所确定的从节点上的索引文件的位置信息发送至所述从节点,并根据所述数据表的元信息将所确定的从节点上的数据文件的位置信息发送至所述从节点。在此,Master根据相应全局索引表的元信息获取上述slave中所有索引文件的位置信息并发送给相应的slave,同时master根据数据表的元信息将该slave中存储的数据文件位置信息一并发送给slave;比如,针对sql1,根据全局索引表的元信息找到slave2中所有的索引文件位置信息将其发送给slave2,同时将slave2上存储的所有数据文件的位置信息一并发送。
需要说明的是,在步骤S14之后,所述还包括:步骤S15,接收所述从节点反馈的所述索引文件的数据结构中的位置信息值。在此,当Master发送数据文件信息给某一slave,而在该slave中不含有满足索引文件的数据结构中的位置信息值(value)的数据文件,则Master会接收到由该slave反馈的索引文件的数据结构中的value,接收所述从节点反馈的所述索引文件的数据结构中的位置信息值之后,执行步骤S16,根据所述位置信息值从所述数据表的元信息重新确定所述数据文件所在的从节点;将所述索引表包含的索引文件的位置信息及所述数据表包含的数据文件的位置信息重新发送至所重新确定的从节点。在此,由Master根据数据文件的位置将任务重新分配给存储该数据文件的其他slave,并将相应的数据文件位置信息和value信息发送给其他slave。例如,根据Master发送给该自身的数据文件信息,发现本地的数据文件中并未找到fs1的相关信息,则说明fs1在集群的其他slave中,此时,接收slave2所找到的<key,value>信息的反馈,Matser通过查找数据表的元信息找到fs1位于slave1文件中,于是将<key,value>信息发送给slave1,并把之后的查询任务转交给slave1。
图6示出根据本申请另一个方面,提供了一种在从节点端基于索引表的查询的方法流程示意图,其中,所述方法包括:步骤S21~步骤S23,优选地应用于分布式***中数据查询,
在步骤S21中,根据主节点发送的索引文件的位置信息通过所述索引文件的数据结构确定所述索引文件所在索引表中的索引列的值;在本申请一实施例中,从节点slave根据接收到的索引文件的位置信息将索引文件加载至内存,进而根据索引文件的位置信息查找到索引文件所在索引表中的索引列的值,在步骤S22中,根据所述索引列的值获取所述索引表中所述索引文件的信息;在此,所述索引文件的信息包括所述索引文件的数据结构中的键值及位置信息值时,根据所述索引列的值确定所述索引文件的数据结构中所述索引列的值对应的键值;根据所述索引列的值对应的键值获取所述索引文件的数据结构中位置信息值。其中,所述索引表的数据结构中的位置信息值包括:所述索引列所属数据文件的文件名及所述索引列所在的行在所述数据文件中的偏移量。接上述实施例,由于索引文件以BPlusTree结构存储,其中该结构的叶子节点中的键值为索引列的值,因此可以能够快速地通过查询条件中的索引列的值在索引文件中找到符合条件的键值key,并读取其位置信息值(value),即该条记录对应的数据文件信息和偏移量,例如,slave2将本地的索引文件信息加载到内存,在各个BPlusTree结构中找到key=1的节点,并读取其value值,即fs1:1 2,表示id=1的记录位于数据文件1(FileSegment1)中,且偏移量为1和2。
在步骤S23中,根据所述主节点发送的数据表的元信息中数据文件的位置信息,判断所述从节点中是否存在用户查询请求对应的数据文件,若是,则根据所述索引文件的信息获取所述数据文件。在本申请一实施例中,结合Master发送给该slave的数据文件信息,若该slave中含有满足value的数据文件,则直接对这些数据文件进行查询步骤,根据value中的偏移量从中读取每个数据文件中满足条件的数据,返回查询结果。
优选地,若所述从节点中不存在用户查询请求对应的数据文件,则将所述数据结构中的位置信息值反馈至所述主节点。在本申请一实施例中,针对不在该slave中的数据文件,slave将其余的value信息传递给Master,由Master根据数据文件的位置将任务重新分配给存储这些数据文件的其他slave,并将相应的数据文件位置信息和value信息发送给其他slave。例如,根据Master发送给该自身的数据文件信息,发现本地的数据文件中并未找到fs1的相关信息,则说明fs1在集群的其他slave中,此时,slave2将找到的<key,value>信息发送给Master,则Matser通过查找数据表的元信息找到fs1位于slave1文件中,于是将<key,value>信息发送给slave1,并把之后的查询任务转交给slave1。Slave1将数据文件加载至内存,根据value中的偏移量从中读取每个数据文件中满足条件的数据,返回查询结果,比如,slave1接收Master发送的信息和任务,将fs1加载至内存,根据value中的偏移量1和2,读取数据文件中偏移量为1和2的两条记录,返回查询结果。
需要说明的是,在本申请上述实施例中,当从节点中不存在用户查询请求对应的数据文件时,从节点只将value传递给主节点,主节点此时只是去数据表的元信息找到数据文件的从节点和数据文件的位置信息,将任务发送给相应的从节点,相应的从节点直接根据数据文件的位置信息加载,并提取对应偏移量的数据,从而提高了数据查询的效率。
综上所述,在查询时,首先根据查询条件动态地选择合适的全局索引表并快速确定索引文件位置,接着根据全局索引表的元信息将索引文件加载至内存,结合过滤条件筛选出满足条件的数据文件和偏移量。若数据文件存在于本地,则直接进行后续的查询处理,否则主节点将查询任务和索引信息再次分配给数据文件所在的机器,最后,数据文件所在的机器将满足条件的数据文件加载至内存,根据偏移量从数据文件中读取数据,返回查询结果。本方法通过两类分布式全局索引表的创建,满足用户不同的筛选条件,有效地筛选出满足条件的数据文件,大大减少了查询时的数据读取量,缩短查询时间,较好地提高了OLAP的查询效率。
图7示出根据本申请又一个方面,还提供了一种基于索引表的查询的主节点设备的结构示意图,其中,所述主节点设备包括:判断装置11、确定类型装置12、定位装置13和发送装置14,优选地应用于分布式***中数据查询,
判断装置11,用于根据用户的查询请求通过索引表的数据结构查找所述索引表的索引列,并判断所述索引列的值是否为确定值,得到判断结果;在本申请一实施例中,根据用户的查询条件以便判断查找到的索引列的值是否为确定值,根据用户的查询请求确定索引表的索引列,索引表的数据结构中包括了根据索引表的索引列的值确定的键值,得到判断结果,从而为用户提供动态选取相应索引表的可能。
本申请一实施例中,所述索引表的数据结构中索引文件的结构包括BPlusTree结构,在此,索引文件的结构可以为BPlusTree结构,优选地,在所述实施例中,BPlusTree结构包括叶子节点的键值和位置信息值,BPlusTree结构的叶子节点包含元组<键值,位置信息值>(<key,value>),BPlusTree结构能够有效地对输入的索引列数据进行排序,从而可以快速查询索引列对应的记录的位置,快速响应数据的查询任务。其中,所述键值(key)根据所述索引表的索引列的值确定,所述位置信息值(value)根据所述索引列所属数据文件的文件名及所述索引列所在的行在所述数据文件中的偏移量确定,key值为索引列的值,来源于数据文件,value为该索引列所在的数据文件信息和满足条件的记录在该索引文件中的偏移量。
确定类型装置12,用于根据所述判断结果确定所述索引表的类型;在此,根据判断结果中索引列的值是否为确定值进行动态选择索引表的类型:若所述判断结果为所述索引列的值为确定值,则确定所述索引表的类型为所述哈希类全局索引表,若所述判断结果为所述索引列的值为非确定值,则确定所述索引表的类型为所述范围类全局索引表。
在本申请一实施例中,所述索引表的类型包括哈希类全局索引表和/或范围类全局索引表。在此,哈希类与范围类全局索引表的索引文件在集群中的分配策略略有不同。哈希类全局索引表是根据索引列的哈希值决定索引文件在分布式集群中所分布的机器,而范围类全局索引表则是根据索引列值的范围将索引文件分配到对应的机器。因此,需要根据查询条件动态的选择索引表的类型,在确定索引表的类型后,根据各自的分配策略进行确定索引文件所在的从节点。
本申请一实施例中的分布式***框架图如图2所示,包括客户端(client)、主节点(Master)、一个或若干从节点(slave)以及zookeeper,可将每个数据表中数据文件存储于固态硬盘(SSD)中,在本申请实施例中,数据表的元信息存储在zookeeper中,其中,所述zookeeper为性能分布式应用的协调***。
接上述实施例,图3所示的用户针一数据源的查询sql语句,如Sql 1:“Select*from table A where id=1”表示查询sql 1语句执行的是查询数据表A中id为1的数据列对应的数据,根据该sql 1的查询条件,可确定索引列的值为id的值1,是确定值,则选取哈希类全局索引表进行查询数据;而Sql 3:“Select*from table A where id<5”表示查询sql 5语句执行的是查询数据表A中id小于5的数据列对应的数据,根据该sql 5语句执行的查询条件,可确定索引列的值为小于5,不是确定值,因此针对该sql 5的查询语句需要选取与sql 1不同的索引表,选择范围类全局索引表进行查询数据。
在本申请一实施例中,当所述索引表的类型为哈希类全局索引表时,所述主节点设备还包括分配装置12’,用于根据所述哈希类全局索引表的索引列的哈希值确定的分配规则,将所述哈希类全局索引表的索引文件的信息值分配至对应的从节点,其中,所述索引文件的信息包括所述索引文件的BPlusTree结构中叶子节点的键值和位置信息值。在此,根据实际需求,确定需要创建全局索引的列,即从数据表中选取部分列作为索引列,进而利用所选取的索引列创建分布式全局索引表对应的元信息,其中,该元信息包括全局索引表所包含的所有索引文件在集群中各个机器硬盘上的位置信息。索引表被创建成功后可以用于分布式***中数据的查询,能够满足用户只需要查询少数的几个数据列的需求的同时避免读取所有的数据文件,大大减少访问的数据量。
具体地,分配装置12’,用于根据所述哈希类全局索引表的索引列的值及所述从节点的个数确定所述索引列的哈希值,将所述索引列的哈希值为i对应的BPlusTree结构中叶子节点的键值及位置信息值分配至第i+1个从节点的索引文件中,其中,i为自然数,从而合理地将索引文件的信息分配至每个slave中,达到均匀分布的目的。需要说明的是,通过确定哈希值,从而确定了索引文件的信息被分配至的机器的信息(如被分配至机器1上),即确定了将哈希值对应的<key,value>分配至的机器的信息。
在本申请一实施例中,假设分布式集群中有1台master,n台slave。哈希类全局索引表通过对索引列求哈希值,而索引列的值为BPlusTree结构中叶子节点的key值,索引列对应的数据文件的信息和索引列对应记录在数据文件中的偏移量为value。将key以及key的哈希值为i的记录的位置信息value分配到第i+1台slave的索引文件中,其中,哈希值可以根据索引列的值及分布式集群中的slave个数确定。
在本申请一实施例中,当所述索引表的类型为范围类全局索引表时,所述主节点设备还包括:区间确定装置121和信息分配装置122,区间确定装置121,用于根据对所述索引列的值进行采样的采样结果确定分配范围区间,并记录每个从节点以及其对应的索引列的分配范围区间;信息分配装置122,用于根据所述分配范围区间确定的分配规则,将所述范围类全局索引表的索引文件的信息分配至对应的从节点,其中,所述索引文件的信息包括所述索引文件的BPlusTree结构中叶子节点的键值和位置信息值。具体地,信息分配装置122,用于将所述范围类全局索引表的索引列的值与所述记录的分配范围区间进行比较,确定所述索引列的值所在的分配范围区间;根据所述索引列的值所在的分配范围区间,将所述索引列的值对应的BPlusTree结构中叶子节点的键值及位置信息值分配至所述分配范围区间对应的从节点的索引文件。
在本申请一实施例中,假设分布式集群中有1台Master,n台slave。范围类全局索引表通过对数据表文件的索引列的值进行采样,根据采样结果设定n个范围,使得每个范围内的数据量尽量均匀分布,并在Master中记录每台机器以及其对应的索引列的范围区间。当生成一个索引文件时,会将索引文件的索引列的值与Master中的n个范围进行比较,根据所属范围区域将该列对应的数据文件信息和在数据文件中的偏移量,即<key,value>更新到范围区域相应的slave的索引文件中。
需要说明的是,在创建索引表时,索引文件的大小达到预设的索引文件大小阈值时,生成新的索引文件,Master将所述新的索引文件的位置信息更新至索引表对应的元信息中。在本申请一实施例中,如图4所示的实例的数据源,该数据源共1000条记录,包括地址标识(id)、姓名(name)、年龄(age)、性别(sex)四列数据。将图4中的数据作为数据源,假设分布式***中有1台Master,3台slave,将数据文件的最大范围设定为25行,当输入的数据行数等于最大范围25时,分布式列式存储平台将当前的数据行作为一个数据文件,Master根据负载均衡原则将其输出到集群中某一机器的SSD中对应的数据文件(FileSegment),并更新数据表对应的元信息,针对哈希类全局索引表,key为id的值,value为id对应的数据文件的信息和id对应记录在数据文件中的偏移量信息。通过key值取哈希,将哈希结果为0、1、2的<key,value>元组分别分配到集群中的第1、2、3台机器的哈希类索引表的索引文件(HashIndexFileSegment)中,如图5所示,当id=1时,哈希结果为1,则将其<key,value>存储到集群中的第2台slave中,当id=2时,哈希结果为2,则将其<key,value>存储到集群中的第3台slave中;当id=3时,哈希结果为0,则将其<key,value>存储到集群中的第1台slave中,其中,{key|key%3=哈希值}是指key与slave的个数(这里个数为3)之间进行取余,得到哈希值,这里key为id的值。
当创建范围类全局索引表时,对数据源的key值采样后的范围划分结果如图5所示,范围划分原则应尽量使得各个范围区间内的记录数接近,范围分区的结果包含[1,333]、[334,666]和[667,999]三个区间,并在Master中存储三台slave各自对应的范围区域,当数据块中的索引列的值满足某个范围区间时,将其索引信息存储到该范围区间对应的slave机器的范围类索引表的数据文件(RangeIndexFileSegment)中,以BPlusTree叶子节点的形式存在,如id=5,key值落在第一个范围区间,则将其对应的<key,value>信息存储到第一台机器的索引文件中。
接上述实施例,定位装置13,用于通过所述索引表的类型确定所述索引表对应的索引文件所在的从节点;在本申请一实施例中,确定索引表的类型后,根据各自索引表的类型对应的分配策略计算出满足条件的索引文件在分布式集群中的从节点,具体实现方式可以通过以下实施例实现:
当选择的索引表为哈希类全局索引表时,通过所述哈希类全局索引表确定所述索引列的哈希值;根据所述哈希值确定所述哈希类全局索引表对应的索引文件所在的从节点。在此,当查询条件为索引列的确定值时,则选取哈希类全局索引表,计算出查询条件中列值的哈希值j,则满足条件的索引文件在分布式集群中的第j+1台slave中。
当选择的索引表为范围类全局索引表时,通过所述范围类全局索引表确定所述索引列的值所属的分配范围区间;根据确定的分配范围区间确定所述范围类全局索引表对应的索引文件所在的从节点。在此,若查询条件为索引列的不确定值,则选取范围类全局索引表,根据索引列所属的范围区域,确定满足条件的索引文件分布在集群的相应的slave中。
在本申请一具体实施例中,根据图3所示的查询sql1和sql2,对应key值均为确定值,则对其取哈希,得到id=1对应哈希值为1,确定其索引文件位于集群的slave2中,而id=27对应哈希值为0,确定其索引文件位于集群的slave1中。sql3中的key为不确定值,其查询条件是id<5,恰好落在[1,333]区间内,随即确定其索引文件位于slave1中。在确定了索引文件所在的机器后,两种不同的全局索引表的后续查询步骤相同。
发送装置14,用于根据所述索引表对应的元信息将所确定的从节点上的索引文件的位置信息发送至所述从节点,并根据所述数据表的元信息将所确定的从节点上的数据文件的位置信息发送至所述从节点。在此,Master根据相应全局索引表的元信息获取上述slave中所有索引文件的位置信息并发送给相应的slave,同时master根据数据表的元信息将该slave中存储的数据文件位置信息一并发送给slave;比如,针对sql1,根据全局索引表的元信息找到slave2中所有的索引文件位置信息将其发送给slave2,同时将slave2上存储的所有数据文件的位置信息一并发送。
需要说明的是,所述主节点设备还包括:接收装置15,用于接收所述从节点反馈的所述索引文件的数据结构中的位置信息值。在此,当Master发送数据文件信息给某一slave,而在该slave中不含有满足索引文件的数据结构中的位置信息值(value)的数据文件,则Master会接收到由该slave反馈的索引文件的数据结构中的value,接收所述从节点反馈的所述索引文件的数据结构中的位置信息值之后,执行步骤S16,根据所述位置信息值从所述数据表的元信息重新确定所述数据文件所在的从节点;将所述索引表包含的索引文件的位置信息及所述数据表包含的数据文件的位置信息重新发送至所重新确定的从节点。在此,由Master根据数据文件的位置将任务重新分配给存储该数据文件的其他slave,并将相应的数据文件位置信息和value信息发送给其他slave。例如,根据Master发送给该自身的数据文件信息,发现本地的数据文件中并未找到fs1的相关信息,则说明fs1在集群的其他slave中,此时,接收slave2所找到的<key,value>信息的反馈,Matser通过查找数据表的元信息找到fs1位于slave1文件中,于是将<key,value>信息发送给slave1,并把之后的查询任务转交给slave1。
图8示出根据本申请另一个方面,还提供了一种基于索引表的查询的从节点设备的结构示意图,其中,所述从节点设备包括:确定装置21、获取装置22和查询装置23,优选地应用于分布式***中数据查询,
确定装置21,用于根据主节点发送的索引文件的位置信息通过所述索引文件的数据结构确定所述索引文件所在索引表中的索引列的值;在本申请一实施例中,从节点slave根据接收到的索引文件的位置信息将索引文件加载至内存,进而根据索引文件的位置信息查找到索引文件所在索引表中的索引列的值,获取装置22用于根据所述索引列的值获取所述索引表中所述索引文件的信息;在此,所述索引文件的信息包括所述索引文件的数据结构中的键值及位置信息值时,根据所述索引列的值确定所述索引文件的数据结构中所述索引列的值对应的键值;根据所述索引列的值对应的键值获取所述索引文件的数据结构中位置信息值。其中,所述索引表的数据结构中的位置信息值包括:所述索引列所属数据文件的文件名及所述索引列所在的行在所述数据文件中的偏移量。接上述实施例,由于索引文件以BPlusTree结构存储,其中该结构的叶子节点中的键值为索引列的值,因此可以能够快速地通过查询条件中的索引列的值在索引文件中找到符合条件的键值key,并读取其位置信息值(value),即该条记录对应的数据文件信息和偏移量,例如,slave2将本地的索引文件信息加载到内存,在各个BPlusTree结构中找到key=1的节点,并读取其value值,即fs1:12,表示id=1的记录位于数据文件1(FileSegment1)中,且偏移量为1和2。
查询装置23,用于根据所述主节点发送的数据表的元信息中数据文件的位置信息,判断所述从节点中是否存在用户查询请求对应的数据文件,若是,则根据所述索引文件的信息获取所述数据文件。在本申请一实施例中,结合Master发送给该slave的数据文件信息,若该slave中含有满足value的数据文件,则直接对这些数据文件进行查询步骤,根据value中的偏移量从中读取每个数据文件中满足条件的数据,返回查询结果。
优选地,所述从节点设备还包括反馈装置24,用于若所述从节点中不存在用户查询请求对应的数据文件,则将所述数据结构中的位置信息值反馈至所述主节点。在本申请一实施例中,针对不在该slave中的数据文件,slave将其余的value信息传递给Master,由Master根据数据文件的位置将任务重新分配给存储这些数据文件的其他slave,并将相应的数据文件位置信息和value信息发送给其他slave。例如,根据Master发送给该自身的数据文件信息,发现本地的数据文件中并未找到fs1的相关信息,则说明fs1在集群的其他slave中,此时,slave2将找到的<key,value>信息发送给Master,则Matser通过查找数据表的元信息找到fs1位于slave1文件中,于是将<key,value>信息发送给slave1,并把之后的查询任务转交给slave1。Slave1将数据文件加载至内存,根据value中的偏移量从中读取每个数据文件中满足条件的数据,返回查询结果,比如,slave1接收Master发送的信息和任务,将fs1加载至内存,根据value中的偏移量1和2,读取数据文件中偏移量为1和2的两条记录,返回查询结果。
需要说明的是,在本申请上述实施例中,当从节点中不存在用户查询请求对应的数据文件时,从节点只将value传递给主节点,主节点此时只是去数据表的元信息找到数据文件的从节点和数据文件的位置信息,将任务发送给相应的从节点,相应的从节点直接根据数据文件的位置信息加载,并提取对应偏移量的数据,从而提高了数据查询的效率。
综上所述,在查询时,首先根据查询条件动态地选择合适的全局索引表并快速确定索引文件位置,接着根据全局索引表的元信息将索引文件加载至内存,结合过滤条件筛选出满足条件的数据文件和偏移量。若数据文件存在于本地,则直接进行后续的查询处理,否则主节点将查询任务和索引信息再次分配给数据文件所在的机器,最后,数据文件所在的机器将满足条件的数据文件加载至内存,根据偏移量从数据文件中读取数据,返回查询结果。本方法通过两类分布式全局索引表的创建,满足用户不同的筛选条件,有效地筛选出满足条件的数据文件,大大减少了查询时的数据读取量,缩短查询时间,较好地提高了OLAP的查询效率。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。