发明内容
本申请针对上述不足或缺点,提供了一种读写分离的数据更新方法、装置、计算机设备和存储介质,本申请实施例通过读写分离来提高数据入库效率,此外,通过将数据和索引分为数据文件和索引文件,有利于根据需要实现快速动态扩容,进而在数据更新时提升写入能力和降低硬件成本。
本申请根据第一方面提供了一种读写分离的数据更新方法,在一个实施例中,该方法包括:
从外部文件读取记录;
对读取的每条记录进行预定处理,将每条经过预定处理的记录写入数据文件;
为每条写入数据文件的记录生成索引记录,并将生成的索引记录写入索引文件;
将数据文件和索引文件存入分布式文件系统;
通知查询服务组件进行索引文件更新操作,使得查询服务组件更新本地的索引文件,以使查询服务组件的本地与分布式文件系统存有相同的索引文件。
在一个实施例中,对读取的每条记录进行预定处理,包括:
通过指定序列化技术将读取的每条记录处理为字节数组,并对得到的字节数据进行压缩处理。
在一个实施例中,将每条经过预定处理的记录写入数据文件之后,还包括:
获取每条写入数据文件的记录的文件路径信息、记录起始位置、记录长度和记录主键;
为每条写入数据文件的记录获取一个自增ID,并为获取的自增ID与本记录的文件路径信息生成映射信息,以及将生成的映射信息存入数据文件。
在一个实施例中,为每条写入数据文件的记录生成的索引记录包括本记录的记录主键和本记录的字节数组,本记录的字节数组是根据本记录的自增ID、记录长度和记录起始位置转化得到的;
在将每条写入数据文件的记录的索引记录写入索引文件时,以每条写入数据文件的记录的记录主键为键,字节数组为值。
在一个实施例中,该方法还包括:
从分布式文件系统中获取每个表分区的全部索引文件;
将每个表分区的全部索引文件合并为新的索引文件;
将分布式文件系统中每个表分区的全部索引文件删除,再将每个表分区的新的索引文件存入分布式文件系统;
通知查询服务组件进行索引文件更新操作。
在一个实施例中,将每个表分区的全部索引文件合并为新的索引文件,包括:
获取每个表分区的每个第二索引文件中存储的所有索引记录,合并至每个表分区的第一索引文件中,并将完成合并的第一索引文件确定为新的索引文件;
每个表分区的第一索引文件是指每个表分区的全部索引文件中最大的索引文件;每个表分区的第二索引文件是指每个表分区的全部索引文件中非最大的索引文件。
在一个实施例中,该方法还包括:
从分布式文件系统中获取每个表分区的全部索引文件;
对每个表分区的每个索引文件进行遍历,以确定每个表分区的重复记录主键,每个表分区的重复记录主键是指在本分区中对应有超过一条索引记录的记录主键;
获取每个表分区的每个重复记录主键对应的所有索引记录内容,并比较每个重复记录主键对应的各个索引记录内容之间的更新时间,将更新时间非最新的索引记录内容对应的索引记录确定为特定索引记录;
删除每个表分区的每个索引文件中的特定索引记录;
将每个表分区的每个已删除特定索引记录的索引文件上传至分布式文件系统,以替换对应的原始索引文件;
通知查询服务组件进行索引文件更新操作。
在一个实施例中,删除每个表分区的每个索引文件中的特定索引记录之前还包括:
根据每个表分区中的特定索引记录的数量判断本分区是否满足数据去重条件;将每个目标表分区的每个索引文件中的特定索引记录写入对应的中间文件;目标表分区是指满足数据去重条件的表分区;
该方法还包括:
从分布式文件系统中获取每个目标表分区的全部数据文件;
根据每个目标表分区对应的中间文件确定每个目标表分区的每个数据文件中的特定数据记录;
删除每个目标表分区的每个数据文件中的特定数据记录;
将每个目标表分区的每个已删除特定数据记录的数据文件上传至分布式文件系统,以替换对应的原始数据文件;
删除每个目标表分区对应的中间文件。
在一个实施例中,将每条经过预定处理的记录写入数据文件,包括:
将每条经过预定处理的记录直接写入数据文件;或者,
确定每条经过预定处理的记录的记录长度,将每条经过预定处理的记录及其记录长度处理为指定数据结构,再将得到的指定数据结构写入数据文件;指定数据结构包括用于装载记录长度的第一区域和拼接在第一区域之后的用于装载经过预定处理的记录的第二区域,第一区域为固定长度,第二区域的长度等于其装载的经过预定处理的记录的长度。
本申请根据第二方面提供了一种读写分离的数据更新装置,在一个实施例中,该装置包括:
外部文件读取模块,用于从外部文件读取记录;
数据写入模块,用于对读取的每条记录进行预定处理,将每条经过预定处理的记录写入数据文件;
索引写入模块,用于为每条写入数据文件的记录生成索引记录,并将生成的索引记录写入索引文件;
文件存储模块,用于将数据文件和索引文件存入分布式文件系统;
通知模块,用于通知查询服务组件进行索引文件更新操作,使得查询服务组件更新本地的索引文件,以使查询服务组件的本地与分布式文件系统存有相同的索引文件。
本申请根据第三方面提供了一种KV存储系统,在一个实施例中,该系统包括写入服务组件、查询服务组件和分布式文件系统;
写入服务组件,用于执行上述任一实施例中提供的读写分离的数据更新方法。
在一个实施例中,该系统还包括协调服务组件;
写入服务组件,还用于通过协调服务组件通知查询服务组件进行索引文件更新操作,使得查询服务组件更新本地的索引文件,以使查询服务组件的本地与分布式文件系统存有相同的索引文件。
在一个实施例中,该系统还包括动态扩容组件;
动态扩容组件,用于接收为特定服务组件扩容的请求,提取请求中携带的扩容资源需求信息,根据扩容资源需求信息启动特定服务组件;特定服务组件为写入服务组件或查询服务组件,扩容资源需求信息包括服务器规格信息和服务器数量信息。
本申请根据第四方面提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述任一方法的实施例的步骤。
本申请根据第五方面提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述任一方法的实施例的步骤。
在本申请实施例中,当KV存储系统需要进行数据更新时,通过写入服务组件从存储于外部系统的外部文件读取记录,对读取的每条记录进行预定处理,将每条经过预定处理的记录写入数据文件,为每条写入数据文件的记录生成索引记录,并将生成的索引记录写入索引文件;将产生的数据文件和索引文件存入分布式文件系统,之后通知查询服务组件进行索引文件更新操作,使得查询服务组件更新本地的索引文件,以使查询服务组件的本地与分布式文件系统存有相同的索引文件,本实施例将KV存储系统中的写入和查询的服务分开(具体分为写入服务组件和查询服务组件)以及将数据和索引分离(具体分为数据文件和索引文件),可以显著缩短扩容服务器的耗时,以往扩容一台服务器至少需要耗时10分钟,而现在扩容一台服务器的耗时在1分钟以内,缩短扩容服务器的耗时有利于KV存储系统根据实际需要实现快速动态扩容,进而提升数据更新时的写入能力和降低硬件成本。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅用以解释本申请,并不用于限定本申请。
本申请提供了一种KV存储系统,该KV存储系统可以为专利数据,以及其他具有和专利数据类似特点的数据提供数据更新和查询服务。
在一个实施例中,该系统包括写入服务组件、查询服务组件和分布式文件系统。
写入服务组件用于进行数据更新、数据去重合并等操作。其中,写入服务组件每次进行数据更新时会读取存于外部系统的外部文件中的记录,此时会产生数据文件和索引文件,写入服务组件会将每次进行数据更新所产生的数据文件和索引文件存入分布式文件系统中;随着数据更新的次数越来越多,分布式文件系统中存储的数据文件和索引文件的数量也不断增多,为了能够高效查询数据,写入服务组件需要对分布式文件系统中的数据文件和索引文件进行去重合并操作。
分布式文件系统用于持久化保存数据文件和索引文件。
查询服务组件用于响应用户端的查询请求。为了提高响应速度,查询服务组件会将分布式文件系统中的索引文件备份到本地,当接收到查询请求后,会查询存于本地的相关索引文件,以确定用户要查询的数据记录的存储位置,之后查询服务组件会根据从相关索引文件中查询到的数据记录的存储位置到分布式文件系统中获取相应的数据记录,并反馈给用户端。
进一步地,如图1所示,该系统还包括协调服务组件,其中,协调服务组件用于协调服务及数据更新,具体可以用zookeeper(是一个分布式应用程序协调服务)、RabbitMQ(是一个面向消息的中间件),Redis(Remote Dictionary Server,即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库)等来实现。
相应地,写入服务组件,还用于在进行数据更新、数据去重合并等操作后,通过协调服务组件通知查询服务组件进行索引文件更新操作,使得查询服务组件更新本地的索引文件,以使查询服务组件的本地与分布式文件系统存有相同的索引文件,从而可以正常为用户端提供查询服务。
更进一步地,目前的KV存储系统还存在硬件成本高的问题,为了解决这个问题,该系统还包括动态扩容组件。该动态扩容组件,用于接收为特定服务组件扩容的请求,提取请求中携带的扩容资源需求信息,根据扩容资源需求信息启动特定服务组件;特定服务组件为写入服务组件或查询服务组件,扩容资源需求信息包括服务器规格信息和服务器数量信息。
本实施例提供的KV存储系统,通过将写入和查询的服务分开,让写入服务组件和查询服务组件通过分布式文件系统交换信息,并且将数据和索引分离为数据文件和索引文件,让读写的操作异步进行,这样可以根据实时算力要求来动态扩展硬件资源,以实现快速动态横向扩展写入及查询能力,通过动态扩容能力,可以在数据入库时增加硬件以加快数据的入库速度,在平时用户使用时,可以相应减少硬件以降低硬件成本,由于这种扩展硬件次数不多,不会带来成本问题。同时,索引文件是由写入服务组件异步构建的,因此是低成本的;此外,写入服务组件可以在数据持久化后再对索引文件进行更新,这样不会对查询服务组件所提供的查询服务造成任何影响。
KV存储系统中的分布式文件系统可以采用阿里云的OSS服务(Object StorageService,对象存储服务),HDFS(Hadoop分布式文件系统),或是其他任意支持随机读取数据的文件系统。
在一些应用场景中,比如在专利数据的更新场景中,由于线上专利数据通常是凌晨才需要进行更新,因此写入服务不需要一直在线,同时写入服务不在线也不会影响到查询服务。所以当凌晨需要更新线上数据时,再通过阿里云的弹性服务动态启动写入服务,从而达到节省硬件成本的目的。
本申请还提供了一种读写分离的数据更新方法,该方法可以应用于上述实施例提供的KV存储系统中的写入服务组件中。在一个实施例中,该读写分离的数据更新方法包括如图2所示的步骤,下面对该方法进行说明。
S110:从外部文件读取记录。
其中,KV存储系统中存储的数据会发生改变,比如,以专利数据为例,专利文献的著录项目、审查状态等信息可能会发生改变,为了让用户可以查询到最新的专利文献,可以通过数据采集服务到相关网站(如中国专利公布公告的官方网站、)采集最新数据,采集的每条数据会先经过数据清洗等操作,然后再作为一条记录写入存储于文件系统的文件中,该文件例如可以是Parquet(一种面向分析型业务的列式存储格式)文件、avro文件等,文件中的每条记录可以是一个完整的数据,如一个专利文献,也可以是部分字段内容,如一个专利文献中比较大的字段(如说明书、权利要求书等)。其中,该文件系统和KV存储系统可以是两个独立的系统,由于KV存储系统中也有分布式文件系统,为了方便区分,将该文件系统称为外部系统,将外部系统中的文件称为外部文件。写入服务组件在进行数据更新时,从外部系统的外部文件中读取记录。外部文件是指,即KV存储系统之外的系统中的文件。每条记录包含唯一主键(以下称为记录主键),且记录主键中携带分区信息,该分区信息表示具体入库的表分区。
S120:对读取的每条记录进行预定处理,将每条经过预定处理的记录写入数据文件。
其中,对读取的每条记录进行预定处理,具体包括通过指定序列化技术将读取的每条记录处理为字节数组,并对得到的字节数据进行压缩处理。
具体地,写入服务组件通过avro序列化技术将读取到的每条记录生成字节数组,然后使用压缩技术将生成的字节数组进行压缩,得到压缩后的字节数组。将字节数组压缩后再写入数据文件,可以减少记录在数据文件中的占用空间。
S130:为每条写入数据文件的记录生成索引记录,并将生成的索引记录写入索引文件。
其中,写入服务组件将每条经过预定处理的记录写入数据文件之后,获取每条写入数据文件的记录的文件路径信息、记录起始位置、记录长度和记录主键,从而可以根据每条数据记录的文件路径信息、记录起始位置、记录长度和记录主键为每条数据记录生成索引记录,索引记录可以是一个键值对(key-value)。对于生成的索引记录,写入服务组件会通过Btree索引技术写入以ind结尾的文件(即索引文件)当中,其中索引文件的文件路径的结构可以是:/根目录/表名/分区信息/UUID+生成时间+.ind
记录主键包括的信息可以根据具体场景来设定,本实施例对此不进行限定。文件路径信息是指该数据文件的文件路径,通过文件路径信息即可从分布式文件系统中获得对应的数据文件。示例性地,数据文件的文件路径的结构可以是:/根目录/表名/分区信息/UUID+生成时间+.avro。其中,UUID(Universally Unique Identifier)是指通用唯一识别码。数据记录的记录起始位置和记录长度用于从数据文件中读取数据记录。
在一个实施方式中,可以以记录主键为键(key),以文件路径信息、记录起始位置和记录长度为值(value)。
进一步,在另一个实施方式中,可以将文件路径信息、记录起始位置和记录长度通过DataInputStream(数据输入流)转化为字节数组,再将该字节数组作为值。这样可以减少索引记录的占用空间。
更进一步地,在又一个实施方式中,为每条写入数据文件的记录获取一个自增ID,并为获取的自增ID与本记录的文件路径信息生成映射信息,之后以文件路径信息对应的自增ID、记录起始位置和记录长度为值,或者先通过DataInputStream将文件路径信息对应的自增ID、记录起始位置和记录长度转化为字节数组,再将该字节数组作为值。为了方便说明,将存储于数据文件中的记录(即压缩后的字节数组)称为数据记录。本实施方式中,由于文件路径信息的大小比较大,因而可以为每条数据记录获取一个自增ID,然后为每条数据记录的自增ID和文件路径信息生成映射信息,可以理解为建立两者的映射关系,通过该映射信息可以确定自增ID对应的文件路径信息。这样可以进一步减少索引记录的占用空间。其中,生成的映射信息可以存储到该数据文件中。
S140:将数据文件和索引文件存入分布式文件系统。
其中,写入服务组件每次进行数据更新会产生数据文件和索引文件,产生的数据文件和索引文件均需持久化到分布式文件系统。
S150:通知查询服务组件进行索引文件更新操作,使得查询服务组件更新本地的索引文件,以使查询服务组件的本地与分布式文件系统存有相同的索引文件。
其中,查询服务组件用于响应用户端的查询请求,查询服务组件会将分布式文件系统中的索引文件备份到本地,当接收到查询请求后,会查询存于本地的相关索引文件,以确定用户要查询的数据记录的存储位置,之后查询服务组件会根据从相关索引文件中查询到的数据记录的存储位置到分布式文件系统中获取相应的数据记录,并反馈给用户端。为了能够准确获得相关的数据记录,当分布式文件系统中的索引文件发生改变时,需要通知查询服务组件进行索引文件更新操作,使得查询服务组件更新本地(查询服务组件的本地指查询服务组件所在的服务器的本地)的索引文件,以使查询服务组件的本地与分布式文件系统存有相同的索引文件。
具体地,查询服务组件会对从分布式文件系统获得的索引文件进行解析,并使用Trietree算法构建索引树,以及存入内存。当用户使用记录主键检索数据时,查询服务组件先从内存中的索引获取记录主键对应的值,如自增ID、记录的起始位置及长度,之后通过自增ID获取文件路径信息,通过该文件路径信息、记录起始位置以及记录长度即可从分布式文件系统的相关数据文件中获取对应的数据记录,之后对数据记录进行反序列化,以及将反序列化得到的数据返回给用户。由于Trietree算法是全部基于内存的,并且对内存空间的消耗还很少,因而能够为更新索引和查询索引等操作提供优异的性能。
在本实施例中,当KV存储系统需要进行数据更新时,通过写入服务组件从存储于外部系统的外部文件读取记录,对读取的每条记录进行预定处理,将每条经过预定处理的记录写入数据文件,为每条写入数据文件的记录生成索引记录,并将生成的索引记录写入索引文件;将产生的数据文件和索引文件存入分布式文件系统,之后通知查询服务组件进行索引文件更新操作,使得查询服务组件的本地与分布式文件系统存有相同的索引文件,本实施例将KV存储系统中的写入和查询的服务分开,具体分为写入服务组件和查询服务组件,能够提高数据入库效率,以及将数据和索引分离,具体分为数据文件和索引文件,这样有利于KV存储系统根据实际需要实现快速动态扩容,进而提高数据入库速度。
随着数据更新的次数越来越多,分布式文件系统中存储的索引文件的数量也不断增多,为了能够高效查询数据,写入服务组件需要对分布式文件系统中的索引文件进行合并操作,其中,当数据更新后,或者检测出分布式文件系统中存在一些索引文件比较小时,写入服务组件就开始进行对索引文件的合并操作。下面对索引文件的合并操作进行说明。
在一个实施例中,该方法还包括:从分布式文件系统中获取每个表分区的全部索引文件;将每个表分区的全部索引文件合并为新的索引文件;将分布式文件系统中每个表分区的全部索引文件删除,再将每个表分区的新的索引文件存入分布式文件系统;通知查询服务组件进行索引文件更新操作。
在本实施例中,写入服务组件从分布式文件系统中获取每个表分区的全部索引文件,然后写入服务组件所在服务器的文件系统中,以便进行索引文件的合并操作。
写入服务组件进行索引文件的合并操作时,会将每个表分区的全部索引文件合并为一个索引文件(即该新的索引文件),完成合并后,将本组件所在服务器的文件系统中相关的原始的索引文件删除,以及将分布式文件系统中相关的所有原始的索引文件都删除,替换为合并后的索引文件,由于合并索引文件会导致分布式文件系统中的索引文件发生改变,因此需要通知查询服务组件进行索引文件更新操作。
其中,将每个表分区的全部索引文件合并为新的索引文件的步骤,具体包括:获取每个表分区的每个第二索引文件中存储的所有索引记录,合并至每个表分区的第一索引文件中,并将完成合并的第一索引文件确定为新的索引文件。每个表分区的第一索引文件是指每个表分区的全部索引文件中最大的索引文件;每个表分区的第二索引文件是指每个表分区的全部索引文件中非最大的索引文件。
也就是说,在合并每个表分区的索引文件时,以其中最大的索引文件为主,可将其称为第一索引文件,然后遍历特定索引文件之外的每个索引文件,这类索引文件可称为第二索引文件,并将每个第二索引文件中的索引记录都写入第一索引文件中,最后可以合并得到一个较大的索引文件,这样可以减少分布式文件系统中每个表分区中的索引文件数量。
在一个实施例中,如图4所示,该方法还包括:从分布式文件系统中获取每个表分区的全部索引文件;对每个表分区的每个索引文件进行遍历,以确定每个表分区的重复记录主键,每个表分区的重复记录主键是指在本分区中对应有超过一条索引记录的记录主键;获取每个表分区的每个重复记录主键对应的所有索引记录内容,并比较每个重复记录主键对应的各个索引记录内容之间的更新时间,将更新时间非最新的索引记录内容对应的索引记录确定为特定索引记录;删除每个表分区的每个索引文件中的特定索引记录;将每个表分区的每个已删除特定索引记录的索引文件上传至分布式文件系统,以替换对应的原始索引文件;通知查询服务组件进行索引文件更新操作。
随着数据更新和合并的次数越来越多,分布式文件系统的每个表分区中的重复索引也会变多,重复索引是指即同一记录主键对应有多个索引记录。重复索引增多会导致查询效率变低,因为查询服务组件通过一个记录主键可以查询到多个索引记录,进而可以得到多个数据记录,比如,在t1时刻,某个专利文献的“当前专利权人”的字段内容是A,写入服务组件进行数据更新后,将该字段内容A写入数据文件arvo_1,为其生成的索引记录是<记录主键,字节数组a>,写入索引文件ind_1,在t2时刻,该专利文献的“当前专利权人”的字段内容更新为B,写入服务组件进行数据更新后,将该字段内容B写入数据文件arvo_2,为其生成的索引记录是<记录主键,字节数组b>,写入索引文件ind_2,此时,该记录主键对应有两个索引记录,查询服务组件通过该记录主键可以查询到字节数组a和b,进而可以获取到字段内容A和B。此时不能直接将获得的数据记录直接反馈给用户,而需要先筛选出最新的数据记录,再反馈给用户,这会导致响应用户的速度变慢。因而,写入服务组件对分布式文件系统中的索引文件进行去重操作能够让查询服务组件更快响应用户的查询请求。
具体地,重复记录主键对应的索引记录内容可以是指自增ID、或者是文件路径信息。如果索引记录内容是自增ID,那么需要获取对应的文件路径信息,然后从中提取出生成时间作为索引记录内容的更新时间,如果索引记录内容是文件路径信息,可直接从中提取出生成时间作为索引记录内容的更新时间。
在上述实施例中,数据的合并和去重都是通过操作索引文件完成的,这样能提高数据查询效率,而索引文件又比较小,通常只有数据文件的千分之一,这样还可以大大减少系统的IO(in/out)消耗。
而数据文件的合并和去重可以异步进行,比如在空闲时或计算资源占用率不高时再进行。数据文件的合并与索引文件的合并过程较为相似,均是将每个表分区的全部数据文件合并为一个更大的数据文件,因而对数据文件的合并过程可以参见上述关于索引文件的合并过程的介绍,在此不再赘述。以下对数据文件的去重进行说明。
在一个实施例中,删除每个表分区的每个索引文件中的特定索引记录之前还包括:根据每个表分区中的特定索引记录的数量判断本分区是否满足数据去重条件;将每个目标表分区的每个索引文件中的特定索引记录写入对应的中间文件,目标表分区是指满足数据去重条件的表分区。相应地,该方法还包括,从分布式文件系统中获取每个目标表分区的全部数据文件;根据每个目标表分区对应的中间文件确定每个目标表分区的每个数据文件中的特定数据记录;删除每个目标表分区的每个数据文件中的特定数据记录;将每个目标表分区的每个已删除特定数据记录的数据文件上传至分布式文件系统,以替换对应的原始数据文件;删除每个目标表分区对应的中间文件。
本实施例中,写入服务组件在对分布式文件系统中的索引文件进行去重时,会先根据每个表分区中的特定索引记录的数量来判断本分区是否满足数据去重条件,对于每个表分区来说,如果本分区不满足该条件,那么就只进行索引去重操作,即删除本分区的每个索引文件中的特定索引记录,将本分区的每个已删除特定索引记录的索引文件上传至分布式文件系统,以替换对应的原始索引文件,而如果本分区满足该条件,那么除了进行索引去重操作,还需要进行数据去重操作。进行数据去重操作时,先将确定出来的本分区的所有特定索引记录都记录在一个中间文件中,从而在系统空闲时可以根据这些特定索引记录删除本分区中对应的重复的数据记录。
其中,对于每个表分区来说,判断本分区是否满足数据去重条件的方式可以是,判断本分区中的特定索引记录的数量,或本分区中的特定索引记录的数量在本分区中的所有索引记录中所占的比例,是否超过预设阈值(可根据实际场景设定,本实施例不对此进行具体限定),若超过预设阈值,则判定满足数据去重条件,反之,若不超过预设阈值,则判定不满足数据去重条件。本实施例中,如果表分区中的特定索引记录的数量比较多,表明对应的重复数据也比较多,此时需要进行数据去重操作,如果表分区中的特定索引记录的数量比较少,那么就只进行索引去重操作,这可以保留最新的索引记录,保证查询服务组件可以查询到最新的数据。由于只有当重复数据比较多时,才进行数据去重操作,并且数据去重操作和索引去重操作不需要同时执行,而可以在空闲时再进行数据去重操作,这样可以减少对系统的压力。
进一步地,在上述实施例中,将每条经过预定处理的记录写入数据文件时,可以将每条经过预定处理的记录直接写入数据文件。
在一个实施例中,将每条经过预定处理的记录写入数据文件时,可以先确定每条经过预定处理的记录的记录长度,将每条经过预定处理的记录及其记录长度处理为指定数据结构,再将得到的指定数据结构写入数据文件。其中,指定数据结构包括用于装载记录长度的第一区域和拼接在第一区域之后的用于装载经过预定处理的记录的第二区域,第一区域为固定长度,第二区域的长度等于其装载的经过预定处理的记录的长度。
其中,如图3所示为指定数据结构的示意图,可以看出,写入服务组件在将数据记录写入数据文件时,会在其前面拼接固定长度(比如,4字节)的第一区域,该第一区域装载了数据记录的记录长度(或称为长度值)。本实施例将经过预定处理的记录处理为指定数据结构再存入数据文件,这样当索引文件出现问题时,还可以利用指令数据结构中装载的记录长度来获得数据记录。
需要说明的是,关于上述任何一个实施例中提供的分词位置索引构建方法所包括的各个步骤,除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,这些步骤中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
基于相同的发明构思,本申请还提供了一种读写分离的数据更新装置。在本实施例中,如图4所示,该读写分离的数据更新装置包括以下模块:
外部文件读取模块110,用于从外部文件读取记录;
数据写入模块120,用于对读取的每条记录进行预定处理,将每条经过预定处理的记录写入数据文件;
索引写入模块130,用于为每条写入数据文件的记录生成索引记录,并将生成的索引记录写入索引文件;
文件存储模块140,用于将数据文件和索引文件存入分布式文件系统;
通知模块150,用于通知查询服务组件进行索引文件更新操作,使得查询服务组件更新本地的索引文件,以使查询服务组件的本地与分布式文件系统存有相同的索引文件。
在一个实施例中,数据写入模块,在用于对读取的每条记录进行预定处理时,具体用于通过指定序列化技术将读取的每条记录处理为字节数组,并对得到的字节数据进行压缩处理。
在一个实施例中,读写分离的数据更新装置还包括记录信息获取模块和映射模块。当数据写入模块将每条经过预定处理的记录写入数据文件之后,记录信息获取模块,用于获取每条写入数据文件的记录的文件路径信息、记录起始位置、记录长度和记录主键;映射模块,用于为每条写入数据文件的记录获取一个自增ID,并为获取的自增ID与本记录的文件路径信息生成映射信息,以及将生成的映射信息存入数据文件。
在一个实施例中,索引写入模块为每条写入数据文件的记录生成的索引记录包括本记录的记录主键和本记录的字节数组,本记录的字节数组是根据本记录的自增ID、记录长度和记录起始位置转化得到的;
在将每条写入数据文件的记录的索引记录写入索引文件时,以每条写入数据文件的记录的记录主键为键,字节数组为值。
在一个实施例中,该读写分离的数据更新装置还包括索引文件合并模块。索引文件合并模块,用于:
从分布式文件系统中获取每个表分区的全部索引文件;
将每个表分区的全部索引文件合并为新的索引文件;
将分布式文件系统中每个表分区的全部索引文件删除,再将每个表分区的新的索引文件存入分布式文件系统。
相应地,通知模块,还用于在索引文件合并模块将每个表分区的新的索引文件存入分布式文件系统之后,通知查询服务组件进行索引文件更新操作。
在一个实施例中,索引文件合并模块,在用于将每个表分区的全部索引文件合并为新的索引文件时,具体用于获取每个表分区的每个第二索引文件中存储的所有索引记录,合并至每个表分区的第一索引文件中,并将完成合并的第一索引文件确定为新的索引文件。每个表分区的第一索引文件是指每个表分区的全部索引文件中最大的索引文件;每个表分区的第二索引文件是指每个表分区的全部索引文件中非最大的索引文件。
在一个实施例中,该读写分离的数据更新装置还包括索引文件更新模块。索引文件更新模块,用于:
从分布式文件系统中获取每个表分区的全部索引文件;
对每个表分区的每个索引文件进行遍历,以确定每个表分区的重复记录主键,每个表分区的重复记录主键是指在本分区中对应有超过一条索引记录的记录主键;
获取每个表分区的每个重复记录主键对应的所有索引记录内容,并比较每个重复记录主键对应的各个索引记录内容之间的更新时间,将更新时间非最新的索引记录内容对应的索引记录确定为特定索引记录;
删除每个表分区的每个索引文件中的特定索引记录;
将每个表分区的每个已删除特定索引记录的索引文件上传至分布式文件系统,以替换对应的原始索引文件。
相应地,通知模块,还用于在索引文件更新模块将每个表分区的每个已删除特定索引记录的索引文件上传至分布式文件系统之后,通知查询服务组件进行索引文件更新操作。
在一个实施例中,该读写分离的数据更新装置还包括中间文件写入模块。中间文件写入模块,用于在索引文件更新模块删除每个表分区的每个索引文件中的特定索引记录之前,根据每个表分区中的特定索引记录的数量判断本分区是否满足数据去重条件,将每个目标表分区的每个索引文件中的特定索引记录写入对应的中间文件;目标表分区是指满足数据去重条件的表分区;
相应地,该读写分离的数据更新装置还包括数据文件去重模块。
数据文件去重模块,用于:
从分布式文件系统中获取每个目标表分区的全部数据文件;
根据每个目标表分区对应的中间文件确定每个目标表分区的每个数据文件中的特定数据记录;
删除每个目标表分区的每个数据文件中的特定数据记录;
将每个目标表分区的每个已删除特定数据记录的数据文件上传至分布式文件系统,以替换对应的原始数据文件;
删除每个目标表分区对应的中间文件。
关于读写分离的数据更新装置的具体限定可以参见上文中对于读写分离的数据更新方法的限定,在此不再赘述。上述读写分离的数据更新装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,其内部结构图可以如图5 所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储索引文件、数据文件等数据,具体存储的数据还可以参见上述方法实施例中的限定。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种读写分离的数据更新方法。
本领域技术人员可以理解,图5中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
本实施例还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述任一实施例提供的方法所包括的步骤。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述任一实施例提供的方法所包括的步骤。
本领域普通技术人员可以理解实现上述方法实施例中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink) DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。