CN117112674A - 一种实现对MongoDB数据库数据的抽取转换方法及装置 - Google Patents
一种实现对MongoDB数据库数据的抽取转换方法及装置 Download PDFInfo
- Publication number
- CN117112674A CN117112674A CN202311138375.XA CN202311138375A CN117112674A CN 117112674 A CN117112674 A CN 117112674A CN 202311138375 A CN202311138375 A CN 202311138375A CN 117112674 A CN117112674 A CN 117112674A
- Authority
- CN
- China
- Prior art keywords
- data
- task
- queue
- extraction
- document
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000605 extraction Methods 0.000 title claims abstract description 127
- 238000006243 chemical reaction Methods 0.000 title claims abstract description 118
- 238000000034 method Methods 0.000 title claims abstract description 36
- 238000001914 filtration Methods 0.000 claims abstract description 27
- 230000005540 biological transmission Effects 0.000 claims description 50
- 238000012545 processing Methods 0.000 claims description 34
- 238000013075 data extraction Methods 0.000 claims description 25
- 230000001360 synchronised effect Effects 0.000 claims description 9
- 238000012216 screening Methods 0.000 claims description 7
- 238000010586 diagram Methods 0.000 description 8
- 238000013461 design Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 230000010354 integration Effects 0.000 description 2
- 238000010923 batch production Methods 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/258—Data format conversion from or to a database
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2457—Query processing with adaptation to user needs
- G06F16/24578—Query processing with adaptation to user needs using ranking
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种实现对MongoDB数据库数据的抽取转换方法及装置,该方法包括:步骤S1,执行全量抽取任务,记录任务开始时间,依次遍历每个集合并记录抽取开始时间,创建表结构转换任务及数据转换任务存储到待处理文档队列,从待处理文档队列里获取任务,生成相应的表结构,将表数据放入到待发送队列中,从待发送队列中获取表数据,传输到指定服务器的指定端口;步骤S2,执行增量抽取任务,从全量任务开始时间作为起点循环读取操作日志进行过滤,将过滤后的文档放入到待处理队列,从待处理队列获取文档,根据操作日志的类型,根据设计好的表数据格式将文档转换后放入待发送队列,从待发送队列获取数据传到指定服务器指定端口。
Description
技术领域
本发明涉及计算机数据同步备份技术领域,特别是涉及一种实现对MongoDB数据库数据的抽取转换方法及装置。
背景技术
随着信息化技术的发展,以及计算机技术的日新月异,政府、企业积累了大量异构的基础数据,这些分散的数据,往往存在于不同的异构数据库中,阻碍了进一步的信息运用,难以产生更大的效益。因此,在企业信息化的过程中,一个重要的课题就是异构数据库整合,以实现数据的共享,而数据库整合中一项重要的工作就是异构数据库数据的转换。
MongoDB数据库是一个介于关系数据库和非关系数据库之间的产品,是一种基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案,MongoDB 数据库是目前 NoSQL 数据库中使用最广泛的数据库之一,本发明旨在实现将MongoDB数据库中的数据抽取出来并转换成为一种中间数据格式,以便这些中间格式的数据可以再同步到各种关系型数据库或数据仓库中。
发明内容
为克服上述现有技术存在的不足,本发明之目的在于提供一种实现对MongoDB数据库数据的抽取转换方法及装置,实现将MongoDB数据库中的数据抽取出来处理后转换为一种中间数据格式,以便能够传输到其他的数据库从而实现数据的异构。
为达上述目的,本发明提出一种实现对MongoDB数据库数据的抽取转换方法,包括如下步骤:
步骤S1,执行全量抽取任务,记录任务开始时间,运行抽取线程、数据转换线程和数据传输线程,利用抽取线程依次遍历每个集合并记录每个集合抽取开始时间,通过遍历每个集合的所有文档,创建表结构转换任务存储到待处理文档队列以及创建相应的数据转换任务存储到待处理文档队列,利用数据转换线程从待处理文档队列里获取任务,生成相应的表结构,并根据表结构将待处理文档转换为表数据放入到待发送队列中,最后由数据传输线程从所述待发送队列中获取表数据,传输到指定服务器的指定端口;
步骤S2,执行增量抽取任务,运行操作日志读取线程、操作日志处理线程和数据传输线程,操作日志读取线程从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中,日志处理线程则从待处理队列中获取操作日志的文档,根据操作日志的类型以及根据设计好的表数据格式将文档转换之后放入到待发送队列,最后由数据传输线程从所述待发送队列中获取数据传输到指定服务器的指定端口。
优选地,步骤S1进一步包括:
步骤S100,对待同步的MongoDB数据库里的集合进行过滤筛选;
步骤S101,启动本次全量数据抽取任务,记录任务开始的时间戳缓存到指定目录的文件中,运行抽取线程、数据转换线程和数据传输线程;
步骤S102,抽取线程遍历整个集合的所有文档,获取所有文档结构中字段数量最多的文档结构作为表结构使用,创建相应的表结构转换任务存储到待处理文档队列中;
步骤S103,遍历整个集合的所有文档,创建相应的数据转换任务存储到队列中,在遍历集合的文档之前记录下当前的时间戳缓存到指定目录的文件中;
步骤104,在抽取线程工作的同时,数据转换线程从待处理文档队列里获取任务,生成相应的表结构,将表数据放入到待发送队列中;
步骤S105,数据传输线程从所述待发送队列中获取表数据,传输到指定服务器的指定端口。
优选地,于步骤S100中,遍历每个集合的数据,对比数据结构筛选出文档之间数据结构相差大的集合以及文档之间某个或某些字段的类型不一致的集合。
优选地,对于文档之间某个或某些字段的类型不一致的集合,使用通用数据类型转换文档中不一致的字段。
优选地,于步骤S103中, 对于数据转换任务,以批处理的形式进行分配,按照指定的大小确定一个数据转换任务包含多少个文档。
优选地,于步骤S104中,所述数据转换线程从待处理文档队列中取出任务,按照任务类型分别进行处理,根据表结构转换任务生成相应的表结构,通过表数据转换任务根据表结构将待处理文档生成相应的表数据,并存放于待发送队列中。
优选地,步骤S2进一步包括:
步骤S200,启动增量抽取任务,运行操作日志读取线程,从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中;
步骤S201,执行日志处理线程,从待处理队列中获取oplog操作日志的文档,根据操作日志的类型以及根据设计好的表数据格式将文档转换后放入待发送队列中。
步骤S202,数据传输线程从待发送队列中获取数据,传输到指定服务器的指定端口。
8、如权利要求7所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于,于步骤S200之前,还包括:
读取全量抽取阶段缓存的全量抽取任务开始时间和每个集合抽取开始时间。
优选地,于步骤S 200中,所述操作日志读取线程从全量抽取任务开始时间作为起点,利用oplog操作日志本身的唯一时间戳,循环读取存储oplog操作日志的集合,对读取的文档进行预先的过滤处理。
为达到上述目的,本发明还提供一种实现对MongoDB数据库数据的抽取转换装置,包括:
全量抽取模块,用于执行全量抽取任务,记录任务开始时间,运行抽取线程、数据转换线程和数据传输线程,利用抽取线程依次遍历每个集合并记录每个集合抽取开始时间,通过遍历每个集合的所有文档,创建表结构转换任务存储到待处理文档队列以及创建相应的数据转换任务存储到待处理文档队列,利用数据转换线程从待处理文档队列里获取任务,生成相应的表结构,并根据表结构将待处理文档转换为表数据放入到待发送队列中,最后由数据传输线程从所述待发送队列中获取表数据,传输到指定服务器的指定端口;
增量抽取模块,用于执行增量抽取任务,运行操作日志读取线程、操作日志处理线程和数据传输线程,操作日志读取线程从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中,日志处理线程则从待处理队列中获取操作日志的文档,根据操作日志的类型以及根据设计好的表数据格式将文档转换之后放入到待发送队列,最后由数据传输线程从所述待发送队列中获取数据传输到指定服务器的指定端口。
与现有技术相比,本发明一种实现对MongoDB数据库数据的抽取转换方法通过将MongoDB数据库中的数据抽取出来处理后转换为一种中间数据格式,以便能够传输到其他的数据库,本发明既能抽取存量数据,也能抽取增量数据,并且按照一定的形式把MongoDB数据库里的集合对应到关系型数据库里的表,进而实现了数据的异构。
附图说明
图1为本发明一种实现对MongoDB数据库数据的抽取转换方法的步骤流程图;
图2为本发明一种实现对MongoDB数据库数据的抽取转换装置的系统架构图;
图3为本发明MongoDB数据抽取系统的架构图
图4为本发明实施例中MongoDB数据抽取的全量抽取阶段的工作流程图;
图5为本发明实施例中MongoDB数据抽取的增量抽取阶段的工作流程图;
图6为本发明实施例中全量和增量进行切换时的工作原理示意图。
实施方式
以下通过特定的具体实例并结合附图说明本发明的实施方式,本领域技术人员可由本说明书所揭示的内容轻易地了解本发明的其它优点与功效。本发明亦可通过其它不同的具体实例加以施行或应用,本说明书中的各项细节亦可基于不同观点与应用,在不背离本发明的精神下进行各种修饰与变更。
图1为本发明一种实现对MongoDB数据库数据的抽取转换方法的步骤流程图。如图1所示,本发明一种实现对MongoDB数据库数据的抽取转换方法,包括如下步骤:
步骤S1,执行全量抽取任务,记录任务开始时间,运行抽取线程、数据转换线程和数据传输线程,利用抽取线程依次遍历每个集合并记录每个集合抽取开始时间,通过遍历每个集合的所有文档,创建表结构转换任务存储到待处理文档队列中以及创建相应的数据转换任务存储到待处理文档队列中,利用数据转换线程从待处理文档队列里获取任务,生成相应的表结构json,并根据表结构json将待处理文档转换为表数据json放入到待发送队列中,最后由数据传输线程从所述待发送队列中获取表数据json,传输到指定服务器的指定端口,同时记录了任务开始时间和每个集合抽取开始时间。
具体地,步骤S1进一步包括:
步骤S100,对待同步的MongoDB数据库里的集合进行过滤筛选。
一般来说,一个MongoDB数据库可以包含多个集合,每个集合里有若干的数据,集合可以看做是常用数据库里的表。具体地,对待同步的MongoDB数据库中的集合进行过滤筛选,将集合中文档数据结构相差过大的集合标记出来,以便数据抽取选择跳过该些集合或者使用比较通用的数据类型来同步。具体地,遍历每个集合的数据,对比数据结构筛选以下两种类型的集合:
一种是如下所说的文档之间的数据结构相差过大,即集合中每条文档的字段名称和值的类型都不一样的情况,例如某个集合里的几个文档内容如下:
{'_id':1,'Null':null};
{'_id':2,'Boolean1':true,'Boolean2':false};
{'_id':3,'Integer':3,'Double':3.1415926}};
每条文档的字段名称和值的类型都不一样,则将该集合标记出来,数据抽取时需要跳过该集合;
另一种则是有些集合只是文档之间某个字段的类型不一致,则使用通用数据类型来转换该不一致的字段,例如某个集合里同一个字段,其中一个文档是时间类型,另一个文档是数字类型,则使用字符串作为通用类型来转换不一致的字段,例如将前一个文档的时间类型改为字符串的通用类型,后一个文档的数字类型也改为字符串的通用类型。
在本发明具体实施例中,过滤筛选采用的是遍历判断的方式,例如,首先找到文档字段最多的那条文档,然后再使用这个结构遍历其余的文档,进行比对,最后通过遍历比对来判断是不是需要跳过,具体地,若发现了上述这种名称和类型都对应不上的文档,就直接先跳过,否则的话继续进行遍历判断,例如,如果仅仅是某一个的类型不一致,则可以做类型转换;若只是比字段最多的少了一个字段,其余字段都一致,则也不跳过的。
步骤S101,启动本次全量数据抽取任务,记录任务开始的时间戳缓存到指定目录的文件中,运行抽取线程、数据转换线程和数据传输线程。
也就是说,过滤完集合之后开始启动本次全量数据抽取任务,此时会记录任务开始的时间戳缓存到一指定目录的文件里,并运行抽取线程、数据转换线程和数据传输线程,即每条规则目录(在添加规则的时候,会把规则相关信息缓存在一个指定的目录下,添加规则时候则会生成规则目录)下对应一个缓存文件以用来缓存时间戳。
步骤S102,抽取线程遍历整个集合的所有文档,获取所有文档结构中字段数量最多的文档结构作为表结构使用,创建相应的表结构转换任务存储到队列中,所述表结构转换任务相当于一次DDL任务,全量时候可以理解为一次建表任务,就是通过找到最全面最复杂的那条文档,使用该文档的结构作为所创建表的表结构,存储这些信息(该文档的结构及一些辅助的信息,以组合成java语言的一个类)到一个DDL类型的任务里,之后放到待处理文档队列里。
具体地,于步骤S102中,通过遍历集合里的所有文档,将文档的嵌套结构也都展开之后,找到文档字段数量最多的文档。例如,对于
_id: 1, test1: 95, test2: 92, test3: 90, modified: new Date("01/05/2020");
_id: 3, test1: 95, test2: 110, modified: new Date("01/04/2020")
这两个文档组成集合的话,则找到第一条(_id: 1)的文档结构作为建表的表结构。
步骤S103,遍历集合的所有文档,创建相应的数据转换任务存储到待处理文档队列中,在遍历集合的文档之前会记录下当前的时间戳(每个集合对应一个时间戳)缓存到指定目录的文件(即步骤S101中用来缓存时间戳的缓存文件)中。
在本发明具体实施例中,数据转换任务相当于DML任务,即用于将集合中的文档数据转换为步骤S102的表结构的数据。对于数据转换任务,以批处理的形式进行分配,即按照指定的size来确定一个数据转换任务里包含多少个文档,例如:一个集合里一共有160条文档数据,batchsize是50,则会分成四个数据转换任务来处理,前三个任务里分别有50个文档,最后一个任务中有10个文档。
步骤104,在抽取线程工作的同时,数据转换线程从待处理文档队列里获取任务,生成相应的表结构json,并将表数据json放入到待发送队列中。
具体地,所述待处理文档队列指步骤S102与步骤S103中存放表结构转换任务和表数据转换任务的队列,数据转换线程从待处理文档队列中取出任务,按照任务类型分别进行处理生成对应的json数据,其中通过表结构转换任务生成相应的表结构json(即ddl操作),表数据转换任务则根据表结构将待处理文档生成相应的表数据json(即dml操作),存放于待发送队列中。
也就是说,在全量阶段,会产生两个队列:其中一个是存放以上表结构转换任务(ddl任务)和数据转换任务(dml任务)两种任务的待处理文档队列,另一个则是存放处理完文档之后生成的json数据的待发送队列。在本发明具体实施例中,待处理文档队列中主要存储了两种类型的任务,即表结构转换任务(ddl任务)和数据转换任务(dml任务),当然还有其他一些流程控制的任务。待处理文档队列的待处理文档即指存储在任务里的还未转换成最终json形式的表结构和数据。
步骤S105,数据传输线程从所述待发送队列中获取表数据json,传输到指定服务器的指定端口。
具体地说,数据传输线程从待发送队列获取表数据json,处理后传输到指定服务器的指定端口里,直到本次任务的所有集合的存量文档抽取、转换、传输完成,完成本次全量抽取任务。
步骤S2,执行增量抽取任务,运行操作日志读取线程、操作日志处理线程和数据传输线程,操作日志读取线程从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中,日志处理线程则从待处理队列中获取操作日志的文档,根据操作日志的类型以及根据设计好的json格式将文档转换之后放入到待发送队列,最后由数据传输线程从所述待发送队列中获取数据传输到指定服务器的指定端口。
具体地,步骤S2进一步包括:
步骤S200,启动增量抽取任务,运行操作日志读取线程,从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中。
由于在全量抽取的过程中MongoDB数据库里可能会新增加了一些数据,因此本发明为了保证数据的准确性,对全量和增量抽取切换进行了设计。
在前述的全量任务过程中,分别对任务开始时间和每个集合抽取开始时间进行了记录,因此在增量抽取任务开启之前需先读取之前缓存在指定目录文件中的时间戳以供文档过滤使用。具体地,操作日志读取线程从全量抽取任务开始时间作为起点,利用oplog操作日志本身都有的唯一时间戳,循环读取存储oplog操作日志的集合,并且对读取的文档进行预先的过滤处理,过滤之后的文档会被放入到待处理队列中,本发明中,预先的过滤处理主要过滤以下两类文档:
一、是过滤掉心跳或者系统参数等的文档:在MongoDB数据库中开启oplog操作日志时,可能会有一些"op"参数为n的操作,也就是空操作类型;还有一些对系统表的增改,这些信息是不需要的,是MongoDB数据库系统自己维护的一些系统表信息,这些文档需要过滤;
二、根据之前缓存的每个集合全量抽取开始的时间与oplog操作日志中文档的时间进行比对,以过滤掉那些可能会重复的文档数据。
步骤S201,执行日志处理线程,从待处理队列中获取oplog操作日志的文档,根据操作日志的类型以及根据设计好的json格式将文档转换后放入到待发送队列中。
具体地说,日志处理线程会从待处理队列中获取oplog操作日志的文档,根据操作日志的类型,将这些日志划分为数据库里使用的数据定义语言(DDL)和数据操纵语言(DML),并按照设计好的json格式(全量抽取时的表数据json格式)将文档转换之后放入到待发送队列中。
步骤S202,数据传输线程从待发送队列中获取取数据,传输到指定服务器的指定端口。
图2为本发明一种实现对MongoDB数据库数据的抽取转换装置的系统架构图。如图2所示,本发明一种实现对MongoDB数据库数据的抽取转换装置,包括:
全量抽取模块20,用于执行全量抽取任务,记录任务开始时间,运行抽取线程、数据转换线程和数据传输线程,利用抽取线程依次遍历每个集合并记录每个集合抽取开始时间,通过遍历每个集合的所有文档,创建表结构转换任务存储到待处理文档队列中,创建相应的数据转换任务存储到待处理文档队列中,利用数据转换线程从待处理文档队列里获取任务,生成相应的表结构json,并根据表结构json将待处理文档转换为表数据json放入到待发送队列中,最后由数据传输线程从所述待发送队列中获取表数据json,传输到指定服务器的指定端口,同时记录了任务开始时间和每个集合抽取开始时间。
具体地,全量抽取模块20进一步包括:
集合筛选单元201,用于对待同步的MongoDB数据库里的集合进行过滤筛选。
具体地,对待同步的MongoDB数据库里的集合进行过滤筛选,将那些集合里文档数据结构相差过大的集合标记出来,以便数据抽取选择跳过这些集合或者使用比较通用的数据类型来同步。具体地,遍历每个集合的数据,对比数据结构筛选以下两种类型的集合:
一种是如下所说的文档之间的数据结构相差过大,即集合中每条文档的字段名称和值的类型都不一样的情况,例如某个集合里的几个文档内容如下:
{'_id':1,'Null':null};
{'_id':2,'Boolean1':true,'Boolean2':false};
{'_id':3,'Integer':3,'Double':3.1415926}};
每条文档的字段名称和值的类型都不一样,则将该集合标记出来,数据抽取时需要跳过该集合;
另一种则是有些集合只是文档之间某个字段的类型不一致,则使用通用数据类型来转换该不一致的字段,例如某个集合里同一个字段,其中一个文档是时间类型,另一个文档是数字类型,则使用字符串作为通用类型来转换不一致的字段。
任务开始时间记录单元202,用于启动本次全量数据抽取任务,记录任务开始的时间戳缓存到指定目录的文件中,运行抽取线程、数据转换线程和数据传输线程。
也就是说,过滤完集合之后开始启动本次全量数据抽取任务,此时会记录下任务开始的时间戳缓存到指定目录的文件里,并运行抽取线程、数据转换线程和数据传输线程。
抽取线程203,抽取线程遍历整个集合的所有文档,获取所有文档结构中字段数量最多的文档结构作为表结构使用,创建相应的表结构转换任务存储到队列中,同时遍历整个集合的所有文档,创建相应的数据转换任务存储到队列中,在遍历集合的文档之前记录下当前的时间戳缓存到指定目录的文件中。
在本发明中,所述表结构转换任务相当于一次DDL任务,全量时候可以理解为一次建表任务,就是通过找到最全面最复杂的那条文档,使用这条文档的结构作为所创建表的表结构,存储这些信息到一个任务里,之后放到队列里,表数据转换任务则是根据表结构转换任务创建的表结构将待处理文档生成相应的表数据json,相当于DML操作。
具体地,抽取线程203通过遍历集合里的所有文档,将文档的嵌套结构也都展开之后,找到文档字段数量最多的文档。例如,对于
_id: 1, test1: 95, test2: 92, test3: 90, modified: new Date("01/05/2020");
_id: 3, test1: 95, test2: 110, modified: new Date("01/04/2020")
这两个文档组成集合的话,则找到第一条(_id: 1)的文档结构作为建表的表结构。
在全量阶段,主要会有两个队列,其中一个是存放以上这两种任务的待处理文档队列,另一个则是存放处理完文档之后生成的json数据的待发送队列。
同时,抽取线程203遍历整个集合的所有文档,创建相应的数据转换任务存储到队列中,在遍历集合的文档之前会记录下当前的时间戳缓存到指定目录的文件中。
在本发明具体实施例中,对于数据转换任务,以批处理的形式进行分配,即按照指定的size来确定一个数据转换任务里包含多少个文档,例如:一个集合里一共有160条文档数据,batchsize是50,则会分成四个数据转换任务来处理,前三个任务里分别有50个文档,最后一个任务中有10个文档。
数据转换线程204,用于在抽取线程工作的同时,从待处理文档队列里获取任务,生成相应的表结构json,并根据表结构json将待处理文档转换为表数据json放入到待发送队列中。
具体地,所述待处理文档队列指抽取线程中存放表结构转换任务和表数据转换任务的队列,数据转换线程从待处理文档队列中取出任务,按照任务类型分别进行处理生成对应的json数据,其中通过表结构转换任务生成相应的表结构json(即DDL操作),表数据转换任务则根据表结构将待处理文档生成相应的表数据json(即DML操作),并存放于待发送队列中。
数据传输线程205,用于从所述待发送队列中获取表数据json,传输到指定服务器的指定端口。
具体地说,数据传输线程从待发送队列获取表数据json,处理后传输到指定服务器的指定端口里,直到本次任务的所有集合的存量文档抽取、转换、传输完成,完成本次全量抽取任务。
增量抽取模块21,用于执行增量抽取任务,运行操作日志读取线程、操作日志处理线程和数据传输线程,操作日志读取线程从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中,日志处理线程则从待处理队列中获取操作日志的文档,根据操作日志的类型以及根据设计好的json格式将文档转换之后放入到待发送队列,最后由数据传输线程从所述待发送队列中获取数据传输到指定服务器的指定端口。
具体地,增量抽取模块21进一步包括:
缓存读取单元210,用于读取全量抽取阶段缓存的全量抽取任务开始时间和每个集合抽取开始时间。
由于在全量抽取的过程中MongoDB数据库里可能会新增加了一些数据,因此本发明为了保证数据的准确性,对全量和增量抽取切换进行了设计。
在前述的全量任务过程中,分别对任务开始时间和每个集合抽取开始时间进行了记录,因此在增量抽取任务开启之前需先读取之前缓存在指定目录文件中的时间戳以供文档过滤使用。
操作日志读取线程211,运行操作日志读取线程,从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中。
具体地,操作日志读取线程从全量抽取任务开始时间作为起点,利用oplog操作日志本身都有的唯一时间戳,循环读取存储oplog操作日志的集合,并且对读取的文档进行预先的过滤处理,过滤之后的文档会被放入到待处理队列中,本发明中,预先的过滤处理主要过滤以下两类文档:
一、是过滤掉心跳或者系统参数等的文档:在MongoDB数据库中开启oplog操作日志时,可能会有一些"op"参数为n的操作,也就是空操作类型;还有一些对系统表的增改,这些信息是不需要的,是MongoDB数据库系统自己维护的一些系统表信息,这些文档需要过滤;
二、根据之前缓存的每个集合全量抽取开始的时间与oplog操作日志中文档的时间进行比对,以过滤掉那些可能会重复的文档数据。
日志处理线程212,执行日志处理线程,从待处理队列中获取oplog操作日志的文档,根据操作日志的类型以及根据设计好的json格式将文档转换之后放入到待发送队列中。
具体地说,日志处理线程会从待处理队列中获取oplog操作日志的文档,根据操作日志的类型,将这些日志划分为数据库里使用的数据定义语言(ddl)和数据操纵语言(dml),并按照设计好的json格式将文档转换之后放入到待发送队列中。
数据处理线程213,用于从待发送队列中获取取数据,传输到指定服务器的指定端口。
实施例
图3为本发明MongoDB数据抽取系统的架构图。该系统架构主要包括以下一些环境。首先,要有待抽取同步的MongoDB数据库系统,可以为单机也可以是集群;其次,需要把MongoDB数据库开启oplog(所有数据的操作记录,实际只记录增删改和一些系统命令操作,查询是不会记录的,有点类似于 mysql 的 binlog 日志)模式,需要能够读取到oplog的操作日志;然后,需要一台运行本系统程序的机器,通过接收规则实现全量和增量的数据抽取。当然,由于本发明数据抽取出来是一种自定义的json(JavaScript Object Notation,JavaScript对象表示法)格式,如果需要同步到其他的数据库,则还需要先做解析之后再进行装载。
在本实施例中,运行主程序,首先接收到数据抽取的任务,之后则开始本次数据抽取任务,数据抽取时会有多个线程来做数据的抽取、转换和传输的工作,最后可以把数据发送到指定的地方,等待有程序来解析之后实现数据的异构。当然对于整个数据抽取过程也会有相关的状态监控。
数据抽取阶段分成两个阶段。全量和增量抽取阶段对应的映射关系都是,MongoDB的集合对应其他数据库的表,集合中的数据对应表中的记录,其中对于比较复杂的嵌套集合会采用key值叠加的方式来决定数据表的字段名称。对于数据表字段的数据类型的确定也是做了相关的过滤和处理,如果有某个集合的部分数据确实和标准的表结构相差过多,则会跳过这个集合并给出相应的提示。
图4为本发明实施例中MongoDB数据抽取的全量抽取阶段的工作流程,图5为本发明实施例中MongoDB数据抽取的增量抽取阶段的工作流程,图6为本发明实施例中全量和增量进行切换时的工作原理示意图。
在本发明实施例中,一种实现对MongoDB数据库数据的抽取转换方法,步骤如下:
步骤1, 首先执行全量抽取,也就是对MongoDB数据库中的存量数据进行抽取同步。
步骤2,在做数据抽取之前会先对待同步的MongoDB数据库中的集合进行过滤筛选,通过筛选算法将那些集合里文档数据结构相差过大的集合标记出来,可以选择跳过这些集合或者使用比较通用的数据类型来同步。这里的筛选主要是遍历集合的数据,对比数据结构筛选以下两种类型的集合:一种是文档之间的数据结构相差过大,例如集合中每条文档的字段名称和值的类型都不一样,需要标记出来,以跳过这样的集合;另一种是就是文档之间某个字段的类型不一致的情况,例如某个集合里同一个字段,其中一个文档是时间类型,还有一个文档是数字类型,此时可以使用字符串作为通用类型来转换这个字段。
步骤3,过滤完集合之后开始启动本次全量数据抽取任务,此时会记录下全量数据抽取任务开始的时间戳缓存到指定目录的文件里,并运行抽取线程、数据转换线程和数据传输线程。
步骤4,抽取线程先获取集合的结构,获取集合的结构时会遍历整个集合的文档,通过一定的算法找到文档里结构最全面最复杂的作为表结构使用(例如通过遍历集合里的所有文档,把文档的嵌套结构也都展开之后,找到文档字段数量最多的文档),创建相应的表结构转换任务存储到待处理文档队列中;
在本发明中,任务主要有两种:一种是表结构转换任务,就是把最全面的那条文档里的结构保存下来,生成一个任务;还有一种是表数据转换任务,就是把集合里的文档按照指定的size生成表数据转换任务。
步骤5,获取完集合结构之后,遍历整个集合的文档,创建相应的数据转换任务存储到待处理文档队列中,在遍历集合的文档之前会记录下当前的时间戳缓存到指定目录的文件里。
本实施例中,以批处理的形式,按照指定的size来确定一个数据转换任务里包含多少个文档。例如:一个集合里一共有160条文档数据,batchsize是50,那么就会分成四个数据转换任务来处理,前三个任务里分别有50个文档,最后一个里边有10个文档。
步骤6,在抽取线程工作的同时,数据转换线程会在待处理文档队列里获取任务,生成相应的表结构json并将表数据json放入到待发送队列中。
步骤7,数据传输线程从待发送队列中获取json数据,处理一下之后传输到指定服务器的指定端口里。直到本次任务的所有集合的存量文档抽取、转换、传输完成,本次全量抽取任务就完成了。
由于在全量抽取的过程中MongoDB数据库里可能会新增加了一些数据,因此为了保证数据的准确性,还需要进行增量抽取任务,本发明对全量和增量抽取切换做了设计。
步骤8,在增量抽取任务开启之前先读取之前缓存的文件的内容供之后文档过滤使用。
由于之前全量任务过程中分别对任务开始时间和每个集合抽取开始时间做了记录,因此在增量任务开启之前先读取之前缓存的指定目录文件的时间戳供之后文档过滤使用。
步骤9,执行增量抽取任务,运行操作日志读取线程、操作日志处理线程和数据传输线程。
步骤10,操作日志读取线程从全量任务开始时间作为起点,利用oplog操作日志本身都有着唯一的时间戳,循环读取存储oplog操作日志的集合,并且对文档做预先的过滤处理,一是过滤掉心跳或者系统参数等的文档,二是通过之前缓存的每个集合全量开始的时间与oplog文档的时间做比对过滤掉那些可能会重复的文档数据,过滤之后的文档会被放入到待处理队列中。
步骤11,日志处理线程会从待处理队列中获取oplog操作日志的文档,根据操作日志的类型,把这些日志划分为数据库里使用的数据定义语言(ddl)和数据操纵语言(dml),并按照设计好的json格式转换之后放入到待发送队列中。
步骤12,数据传输线程同样会在待发送队列里取数据,处理之后传输到指定服务器的指定端口。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何本领域技术人员均可在不违背本发明的精神及范畴下,对上述实施例进行修饰与改变。因此,本发明的权利保护范围,应如权利要求书所列。
Claims (10)
1.一种实现对MongoDB数据库数据的抽取转换方法,包括如下步骤:
步骤S1,执行全量抽取任务,记录任务开始时间,运行抽取线程、数据转换线程和数据传输线程,利用抽取线程依次遍历每个集合并记录每个集合抽取开始时间,通过遍历每个集合的所有文档,创建表结构转换任务存储到待处理文档队列以及创建相应的数据转换任务存储到待处理文档队列,利用数据转换线程从待处理文档队列里获取任务,生成相应的表结构,并根据表结构将待处理文档转换为表数据放入到待发送队列中,最后由数据传输线程从所述待发送队列中获取表数据,传输到指定服务器的指定端口;
步骤S2,执行增量抽取任务,运行操作日志读取线程、操作日志处理线程和数据传输线程,操作日志读取线程从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中,日志处理线程则从待处理队列中获取操作日志的文档,根据操作日志的类型以及根据设计好的表数据格式将文档转换之后放入到待发送队列,最后由数据传输线程从所述待发送队列中获取数据传输到指定服务器的指定端口。
2.如权利要求1所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于,步骤S1进一步包括:
步骤S100,对待同步的MongoDB数据库里的集合进行过滤筛选;
步骤S101,启动本次全量数据抽取任务,记录任务开始的时间戳缓存到指定目录的文件中,运行抽取线程、数据转换线程和数据传输线程;
步骤S102,抽取线程遍历整个集合的所有文档,获取所有文档结构中字段数量最多的文档结构作为表结构使用,创建相应的表结构转换任务存储到待处理文档队列中;
步骤S103,遍历整个集合的所有文档,创建相应的数据转换任务存储到队列中,在遍历集合的文档之前记录下当前的时间戳缓存到指定目录的文件中;
步骤104,在抽取线程工作的同时,数据转换线程从待处理文档队列里获取任务,生成相应的表结构,将表数据放入到待发送队列中;
步骤S105,数据传输线程从所述待发送队列中获取表数据,传输到指定服务器的指定端口。
3.如权利要求2所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于:于步骤S100中,遍历每个集合的数据,对比数据结构筛选出文档之间数据结构相差大的集合以及文档之间某个或某些字段的类型不一致的集合。
4.如权利要求3所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于:对于文档之间某个或某些字段的类型不一致的集合,使用通用数据类型转换文档中不一致的字段。
5.如权利要求2所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于:于步骤S103中, 对于数据转换任务,以批处理的形式进行分配,按照指定的大小确定一个数据转换任务包含多少个文档。
6.如权利要求2所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于:于步骤S104中,所述数据转换线程从待处理文档队列中取出任务,按照任务类型分别进行处理,根据表结构转换任务生成相应的表结构,通过表数据转换任务根据表结构将待处理文档生成相应的表数据,并存放于待发送队列中。
7.如权利要求2所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于,步骤S2进一步包括:
步骤S200,启动增量抽取任务,运行操作日志读取线程,从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中;
步骤S201,执行日志处理线程,从待处理队列中获取oplog操作日志的文档,根据操作日志的类型以及根据设计好的表数据格式将文档转换后放入待发送队列中;
步骤S202,数据传输线程从待发送队列中获取数据,传输到指定服务器的指定端口。
8.如权利要求7所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于,于步骤S200之前,还包括:
读取全量抽取阶段缓存的全量抽取任务开始时间和每个集合抽取开始时间。
9.如权利要求8所述的一种实现对MongoDB数据库数据的抽取转换方法,其特征在于:于步骤S 200中,所述操作日志读取线程从全量抽取任务开始时间作为起点,利用oplog操作日志本身的唯一时间戳,循环读取存储oplog操作日志的集合,对读取的文档进行预先的过滤处理。
10.一种实现对MongoDB数据库数据的抽取转换装置,包括:
全量抽取模块,用于执行全量抽取任务,记录任务开始时间,运行抽取线程、数据转换线程和数据传输线程,利用抽取线程依次遍历每个集合并记录每个集合抽取开始时间,通过遍历每个集合的所有文档,创建表结构转换任务存储到待处理文档队列以及创建相应的数据转换任务存储到待处理文档队列,利用数据转换线程从待处理文档队列里获取任务,生成相应的表结构,并根据表结构将待处理文档转换为表数据放入到待发送队列中,最后由数据传输线程从所述待发送队列中获取表数据,传输到指定服务器的指定端口;
增量抽取模块,用于执行增量抽取任务,运行操作日志读取线程、操作日志处理线程和数据传输线程,操作日志读取线程从全量任务开始时间作为起点,循环读取操作日志并进行过滤,将过滤后的文档放入到待处理队列中,日志处理线程则从待处理队列中获取操作日志的文档,根据操作日志的类型以及根据设计好的表数据格式将文档转换之后放入到待发送队列,最后由数据传输线程从所述待发送队列中获取数据传输到指定服务器的指定端口。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311138375.XA CN117112674A (zh) | 2023-09-05 | 2023-09-05 | 一种实现对MongoDB数据库数据的抽取转换方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311138375.XA CN117112674A (zh) | 2023-09-05 | 2023-09-05 | 一种实现对MongoDB数据库数据的抽取转换方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117112674A true CN117112674A (zh) | 2023-11-24 |
Family
ID=88805443
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311138375.XA Pending CN117112674A (zh) | 2023-09-05 | 2023-09-05 | 一种实现对MongoDB数据库数据的抽取转换方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117112674A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118014732A (zh) * | 2024-04-10 | 2024-05-10 | 深圳华锐分布式技术股份有限公司 | 数据回传方法、装置、设备及介质 |
-
2023
- 2023-09-05 CN CN202311138375.XA patent/CN117112674A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118014732A (zh) * | 2024-04-10 | 2024-05-10 | 深圳华锐分布式技术股份有限公司 | 数据回传方法、装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10346397B2 (en) | System and method for querying data sources | |
US7904488B2 (en) | Time stamp methods for unified plant model | |
CN104123288B (zh) | 一种数据查询方法及装置 | |
EP3513313A1 (en) | System for importing data into a data repository | |
WO2015062181A1 (zh) | 用于实现多源异构数据资源自动同步的方法 | |
WO2018051097A1 (en) | System for analysing data relationships to support query execution | |
EP3513315A1 (en) | System for data management in a large scale data repository | |
CN104123392A (zh) | 一种关系型数据库迁移到HBase数据库的工具和方法 | |
CN117112674A (zh) | 一种实现对MongoDB数据库数据的抽取转换方法及装置 | |
JP5781685B2 (ja) | ログ管理計算機、及びログ管理方法 | |
US11461333B2 (en) | Vertical union of feature-based datasets | |
EP2975535A1 (en) | Checking freshness of data for a data integration system, DIS | |
CN103186611A (zh) | 一种压缩、解压及查询文档的方法、装置 | |
CN111782671A (zh) | 一种基于分布式数据库实现cdc的优化方法 | |
CN102073662A (zh) | 一种解析和创建xml数据的方法及系统 | |
JP2013161342A (ja) | ファイルリスト生成方法及びシステム並びにプログラム、ファイルリスト生成装置 | |
CN113672692A (zh) | 数据处理方法、装置、计算机设备和存储介质 | |
KR101836314B1 (ko) | Rdbms 데이터의 트리플 자동변환방법 및 시스템 | |
JP2021140430A (ja) | データベースマイグレーション方法、データベースマイグレーションシステム、及びデータベースマイグレーションプログラム | |
CN113722337B (zh) | 业务数据确定方法、装置、设备及存储介质 | |
CN113221528B (zh) | 基于openEHR模型的临床数据质量评估规则的自动生成与执行方法 | |
JP3886872B2 (ja) | アクセスログ情報多次元分析システムおよび多次元分析環境構築方法 | |
JP2018037031A (ja) | データ移行プログラム作成システム及びデータ移行プログラム作成用プログラム | |
JP2009181463A (ja) | サーバ、データ転送方法及びプログラム | |
Ma et al. | Live data replication approach from relational tables to schema-free collections using stream processing framework |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |