CN103440265B - 基于MapReduce的MYSQL数据库的变化数据捕获方法 - Google Patents
基于MapReduce的MYSQL数据库的变化数据捕获方法 Download PDFInfo
- Publication number
- CN103440265B CN103440265B CN201310332312.8A CN201310332312A CN103440265B CN 103440265 B CN103440265 B CN 103440265B CN 201310332312 A CN201310332312 A CN 201310332312A CN 103440265 B CN103440265 B CN 103440265B
- Authority
- CN
- China
- Prior art keywords
- value
- key
- data
- iterator
- md5value
- 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.)
- Expired - Fee Related
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于MapReduce的MYSQL数据库的变化数据捕获方法,包括:(1)生成摘要的查询语句“select into outfile”,根据FIELDS子句设置标志位;将“select into outfile”从数据库查询得到的一行元组插入“属性值分隔符”;根据标志位值对“select into outfile”查询执行的结果生成摘要md5value和产生输出格式;将查询结果写到磁盘文件outfile;(2)采用Hadoop MapReduce并行框架求差分;从map端读入两个快照文件old.txt和new.txt,MapReduce的shuffle函数对Key/value结构中相同key的value值存入迭代器iterator,将reduce的输出文件合并成insert文件和delete文件,即CDC的结果。本发明对MYSQL中的查询语句从语法到实现上作了改进,使其一次查询数据库数据文件就能生成带摘要的快照文件,一个快照文件的生成就减少了一次I/O,连续多次的快照差分过程可以减少大量的I/O。
Description
技术领域
本发明涉及数据捕捉的技术领域,特别涉及一种基于MapReduce的MYSQL数据库的变化数据捕获方法。
背景技术
变化数据捕获(change data capture,CDC)是ETL(Extract Transform Load)过程所要解决的主要问题之一。CDC用于捕获生产数据库中数据更新操作(如插入insert、删除delete、修改update)的数据,为OLAP数据库、报表数据库、数据仓库,商业智能数据库等企业应用数据库的数据同步更新提供增量数据抽取服务。
现有的变化数据捕获CDC方法可归纳为五类:
(1)基于时间属性的CDC方法
若数据库的表是只追加表(只允许插入不允许删除、更新操作的表称为只追加表),在表结构中包含了一个时间属性,该时间属性的值为记录插入数据库的系统时间,基于时间戳的方法采用定期地使用SQL(structure querylanguage)查询获得某个时间段新插入的记录来实现变化数据的捕获。
(2)基于触发器的CDC方法
触发器是数据库系统在特定的条件或某事件发生时调用的存储过程,基于触发器的CDC方法就是利用这些触发器机制创建插入、删除和更新操作(insertdelete update,IDU)的触发器,当数据库执行了IDU操作时触发器将这些操作的记录写入另一些表来获取变化数据。
(3)基于日志的CDC方法
数据库日志记录了数据库所有的IDU操作,通过对数据库日志进行分析,提取出已提交事务的IDU操作记录即可获得数据库的变化数据。
(4)基于API的CDC方法
假设数据库系统为应用程序提供了一组API(application programinterface),应用程序通过调用API来操作数据库,基于API的CDC方法通过这些API来记录应用程序对数据库的操作。
(5)基于快照差分的CDC方法
给定数据库D,t为某一时刻,D在t时刻的状态称为数据库的一个快照,快照是数据库中选择的部分数据的拷贝,它反映了数据库在过去的某个时刻的状态。基于快照差分的CDC方法是对数据库二个连续的快照通过对比得出数据库的变化数据。现有的差分方法归纳为三类:排序归并算法、Hash分区算法和Window算法。排序归并算法先对二个连续的快照文件进行排序,然后对排序的文件依次扫描找出IDU的记录。Hash分区算法首先根据给定的哈希函数对二个连续的快照文件进行分区,然后对健值相同的哈希桶进行对比找出IDU的记录。Window算法基于二个连续的快照文件相匹配的元组在物理位置上也是相互接近这一前提,不匹配的元组先被保存在预先建立的“窗口”区中等待匹配,当窗口缓冲区溢出时,将“较老”的元组看作是IDU的记录。
不同的CDC方法主要在适用范围、对生产系统(数据库所在系统)计算机资源的占用、对业务系统(数据库的应用系统)的修改要求、同步操作的时间延迟及算法实现的复杂性等几方面存在差异。
(1)基于时间属性的CDC方法
基于时间属性的CDC方法采用利用时间属性的查询来获得变化数据,因此仅限于只追加表,仅能捕获到新插入或新修改的数据;基于时间属性的CDC方法实现简单,不涉及对业务系统的修改,查询操作占用生产系统资源较少,同步操作的延迟较低。
(2)基于触发器的CDC方法
基于触发器的CDC方法仅适用于支持触发器的数据库系统中。触发器满足ECA(Event Condition Action)规则,数据库的每项操作都需要检查触发器,当条件满足时需要成倍地增加数据库操作,降低了生产系统和业务系统的执行效率。基于触发器的CDC方法实现简单,同步操作是实时的。
(3)基于日志的CDC方法
日志是数据库系统为实现事务ACID性质和数据库恢复而建立的一种机制。数据库日志采用二进制或加密的二进制文件格式,用户程序只能通过数据库系统提供的访问接口来读取数据库日志;不同数据库产品或同一产品的不同版本在日志记录格式存在千差万别,这使得日志文件的读取和分析变得非常困难。基于日志的CDC方法可以将日志文件复制到生产系统之外的系统上进行读取和分析,因此对生产系统和业务系统的效率不产生任何影响,同步操作存在延迟。
(4)基于API的CDC方法
基于API的CDC方法主要通过API来获取数据库操作,仅能获取调用该API的业务系统产生的变化数据,无法获得其他不采用API操作数据库的业务系统产生的变化数据。基于API的CDC方法对生产系统的效率不产生任何影响,算法实现简单,同步操作是实时的。
(5)基于快照差分的CDC方法
基于快照差分的CDC方法适用任何类型的数据库(如关系型数据库、XML数据库等)。基于快照差分的CDC方法可将快照文件存放在生产系统之外的系统上,因此对生产系统和业务系统的执行效率不产生任何影响,算法实现较复杂,同步操作存在延迟。
发明内容
本发明的目的在于克服现有技术的缺点与不足,提供一种可以降低快照差分的I/O代价,缩短求差分时间的基于MapReduce的MYSQL数据库的变化数据捕获方法。
本发明的目的通过下述技术方案实现:
本发明基于MapReduce的MYSQL数据库的变化数据捕获方法,包括下述步骤:
(1)生成摘要的查询语句“select into outfile”,其具体步骤如下:
(1-1)词法和语法分析“select into outfile”,根据FIELDS子句设置标志位;
(1-2)将“select into outfile”从数据库查询得到的一行元组插入“属性值分隔符”;
(1-3)根据标志位值对“select into outfile”查询执行的结果生成摘要md5value和产生输出格式;
(1-4)将查询结果写到磁盘文件outfile;
(2)采用Hadoop MapReduce并行框架求差分;
(2-1)从map端读入两个快照文件old.txt和new.txt,通过文件按行切分在map端输出<key,@md5value@value>或者<key,@md5value>的形式,其中@md5value@value或@md5value作为Key/value结构中的value值;
(2-2)MapReduce的shuffle函数对Key/value结构中相同key的value值存入迭代器iterator,发送reduce端;
(2-3)reduce端接收的数据形式为<key,iterator>,对iterator中的value个数进行统计和分类可取获得变化的数据:
(2-4)将reduce的输出文件合并成insert文件和delete文件,即CDC的结果。
优选的,所述查询语句符合下述语法要求:
(a)FIELDS子句的“输出标识符”、“段分隔符”、“属性值分隔符”为可选项;“输出标识符”可取三个值:缺省、'#'、'##';“段分隔符”可缺省或者取除'#'和出现在该数据库之外的其他符号;“属性值分隔符”可缺省或者取除'#'和出现在该数据库之外的符号;“段分隔符”和“属性值分隔符”不能为相同的符号;
(b)若“输出标识符”缺省则“段分隔符”也一定缺省,该语句仅输出每行元组的属性值;
(c)若“输出标识符”为'#'时,“段分隔符”不可缺省,该语句输出每行元组的主码值key和该行的摘要MD5value,由“段分隔符”将主码值key和摘要MD5value分隔开;
(d)若“输出标识符”为'##'时,“段分隔符”不可缺省,该语句输出每行元组的主码值key、该行的摘要MD5value和属性在该行的取值value,由“段分隔符”将主码值key、摘要MD5value和值value分隔开;若定义了“属性值分隔符”,则值value和key由“属性值分隔符”将每个属性值分隔开;
(e)该查询语句可用于一般查询,也可用于包含摘要的快照文件的生成;若将该查询语句用于包含摘要的快照文件的生成,“输出标识符”取值'##'时,必须定义“属性值分隔符”,这样方便计算变化的数据;
(f)子句LINES定义行分隔符,一般取值为“回车&换行”,不可缺省,方便按行读取文件。
优选的,步骤(1-1)的具体形式如下:
(1-1-1)读取FIELDS TERMINATED BY的第一个字节,若不为“#”,则置标志位normal为true,表示查询结果将按标准格式输出到磁盘文件,否则置标志位normal为false,表示查询结果将按个性定义输出到磁盘文件;
(1-1-2)若标志位normal为false,则读取FIELDS TERMINATED BY第二个字节,若为“#”,则置标志位selfhood为true,表示输出主码值key和摘要md5value,否则置标志位selfhood为false,表示输出主码值key、摘要md5value和整个元值的值value。
优选的,步骤(1-3)具体为:
(1-3-1)提取当前行的数据分隔符;
(1-3-2)取出当前行的数据存于cache中并记录下key值;
(1-3-3)若标志位normal为true,直接输出cache中的数据,转下一行处理;
(1-3-4)若标志位normal为false,调用md5程序为cache中数据生成摘要md5value;
(1-3-5)若标志位selfhood为true,输出主码值key和摘要md5value,输出格式为@key@md5value;
(1-3-6)若标志位selfhood为false,输出主码值key、摘要md5value和整个元组值value,输出格式为@key@md5value@value。
优选的,步骤(2-3)具体为:
(2-3-1)若iterator仅有一个数据,即该数据仅出现在一个快照文件中,说明该数据是数据库新插入insert或删除delete的元组;
(2-3-2)若iterator有二个数据,即该数据出现在二个快照文件中,继续比较二个数据中md5value的值,如果md5value值相同,说明该数据没有变化,如果md5value值不相同,说明该数据是数据库作了更新update操作的结果,将更新update操作分解为删除delete操作和插入insert操作。
优选的,步骤(2-4)中,采用带值CDC算法或回查CDC算法对数据进行处理,所述带值CDC算法的处理方法如下:
(2-4-1)从快照文件读入一行数据,取该行的第一个字符sign;
(2-4-2)用sign切分剩下的字符串得到一个字符数组;
(2-4-3)将字符数组的第一个元素作为key,剩余的元素作为value;
(2-4-4)将切分后的数据传给shuffle函数;
(2-4-5)经过shuffle函数处理后的数据传送到Reduce端,数据格式为<key,iterator>,取出iterator的第一个元素value1;
(2-4-6)根据iterator中元素个数判断数据库的更新操作;
(2-4-7)处理完<key,iterator>后的insert文件和delete文件即为数据库变化数据文件。
优选的,步骤(2-4-6)的具体步骤如下:
(2-4-6-1)若iterator为空,则<key,iterator>的值为数据库新插入或删除操作产生的元组,读出“段分隔符”将<key,value1>插入insert文件或delete文件;
(2-4-6-2)若iterator不为空,则取出iterator中的元素value1和元素value2中的md5value,若value1和value2中的md5value值相同,则数据库对该元组没有更新操作,否则<key,iterator>为数据库修改操作前和修改操作后的值,读出value1和value2的“段分隔符”将<key,value1>和<key,value2>分别插入insert文件和delete文件。
优选的,所述回查CDC算法的处理方法如下:
(2-5-1)从快照文件读入一行数据,取该行的第一个字符sign;
(2-5-2)用sign切分剩下的字符串得到一个字符数组;
(2-5-3)将字符数组的第一个元素作为key,剩余的元素作为value;
(2-5-4)将切分后的数据传给shuffle函数;
(2-5-5)经过shuffle函数处理后的数据传送到Reduce端,数据格式为<key,iterator>,取出iterator的第一个元素value1;
(2-5-6)根据iterator中元素个数判断数据库的更新操作;
(2-5-7)处理完<key,iterator>后的insert文件和delete文件即为数据库变化数据文件。
优选的,步骤(2-5-6)具体为:
(2-5-6-1)若iterator为空,则<key,iterator>的值为数据库新插入或删除操作产生的元组,读出“段分隔符”为旧快照标识符,直接输出到delete文件;读出“段分隔符”为新快照标识符,通过JDBC连接数据库回查该key值对应的元组值,将查询结果输出到insert文件;
(2-5-6-2)若iterator不为空,则取出iterator中的元素value1和元素value2中的md5value,若value1和value2中的md5value值相同,则数据库对该元组没有更新操作,否则<key,iterator>为数据库修改操作前和修改操作后的值,若读出value1的“段分隔符”为旧快照标识符,直接将value1的key输出到delete文件,通过JDBC连接数据库回查该value2的key值对应的元组值,将查询结果输出到insert文件,否则反之。
本发明相对于现有技术具有如下的优点及效果:
(1)查询语句select into outfile的功能与实现:现有的基于摘要的快照差分算法在每次快照文件的生成时需要二次磁盘I/O,一次I/O是查询数据库数据文件再写入磁盘文件,一次I/O是读取磁盘文件生成摘要再写进新的快照文件,对数据量大的数据库文件和连续多次的快照差分过程来说,这样的I/O代价是非常高的。本发明对MYSQL中的查询语句select into outfile从语法到实现上作了改进,使其一次查询数据库数据文件就能生成带摘要的快照文件,一个快照文件的生成就减少了一次I/O,连续多次的快照差分过程可以减少大量的I/O。同时该语句增加了数据库查询时给查询数据添加附加信息的能力,增强了数据库查询的表达能力。
(2)基于MapReduce并行框架的快照差分的实现:MapReduce是利用集群并行处理数据的编程框架,现有MapReduce主要应用在词频统计等方面,尚未有变化数据捕获方面的应用。现有的快照差分也没有集群处理的实现,本发明结合MapReduce并行处理框架和快照差分的算法思想,实现了大数据量、准确、快速的数据库变化数据捕获方法。
(3)本发明采用了Hadoop MapReduce的并行编程框架,集群的并行处理能力能够处理大数据量的数据,提高了求差分的速度;利用MapReduce的shuffle函数与排序归并的思想保证结果的正确性,解决了现有快照差分算法存在的问题,具有广泛的应用前景。
附图说明
图1基于MapReduce的MYSQL数据库的变化数据捕获方法总流程图;
图2是本发明包含摘要的查询语句流程图;
图3是map端一条数据执行的流程图;
图4是带值CDC算法的Reduce端出来流程图;
图5是回查CDC算法的Reduce端处理流程图。
具体实施方式
下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。
实施例
针对数据库文件的I/O代价问题,本发明通过MYSQL的开源代码实现了一个带摘要的SQL查询,从而减少了生成包含摘要的快照文件的I/O代价;为提高快照差分的速度、正确性和大数据量问题,如图1所示,本发明提出了基于Hadoop MapReduce并行框架的快照差分算法。
1、带摘要的SQL查询select into outfile
求差分的过程就是比较二个快照文件中的对应行,一种方法是将对应行中属性值逐个进行比较,若属性个数比较多时这个比较代价将会非常高;改进的方法是将一行的属性值生成摘要,直接比较对应行的摘要得出差分结果。现有方法在生成包含摘要的快照文件需要二次读写文件,一次从数据库中读出数据文件写入磁盘文件,第二次读出磁盘文件生成摘要再写回磁盘。如果能在数据库读出数据文件的同时生成摘要则不需要第二次的磁盘读写,为每一次快照文件的生成减少了一次I/O,这将大大降低快照差分的I/O代价。本发明利用开源数据库MYSQL实现了查询时生成摘要的查询语句,摘要由MD5算法生成。生成摘要的查询语句“select into outfile”的具体语法形式如下:
SELECT列名INTO OUTFILE存入文件路径及文件名
FIELDS TERMINATED BY'[输出标识符][段分隔符][属性值分隔符]'
LINES TERMINATED BY'行数据分隔符'
FROM表名;
该查询语句的语法要求:
(1)FIELDS子句的“输出标识符”、“段分隔符”、“属性值分隔符”为可选项;”输出标识符”可取三个值:缺省、'#'、'##';“段分隔符”可缺省或者取除'#'和出现在该数据库之外的其他符号,如'@';“属性值分隔符”可缺省或者取除'#'和出现在该数据库之外的符号,如'|';“段分隔符”和“属性值分隔符”不能为相同的符号;
(2)若“输出标识符”缺省则“段分隔符”也一定缺省,该语句仅输出每行元组的属性值;
(3)若“输出标识符”为'#'时,“段分隔符”不可缺省,该语句输出每行元组的主码值key和该行的摘要MD5value,由“段分隔符”将主码值key和摘要MD5value分隔开;
(4)若“输出标识符”为'##'时,“段分隔符”不可缺省,该语句输出每行元组的主码值key、该行的摘要MD5value和属性在该行的取值value,由“段分隔符”将主码值key、摘要MD5value和值value分隔开;若定义了“属性值分隔符”,则值value和key由“属性值分隔符”将每个属性值分隔开;
(5)该查询语句可用于一般查询,也可用于包含摘要的快照文件的生成;若将该查询语句用于包含摘要的快照文件的生成,“输出标识符”取值'##'时,必须定义“属性值分隔符”,这样方便计算变化的数据。
(6)子句LINES定义行分隔符,一般取值为“回车&换行”,不可缺省,方便按行读取文件;
例:
SELECT*INTO OUTFILE'd:\snapshot1.txt'
FIELDS TERMINATED BY'##@|'
LINES TERMINATED BY'0AH0DH’
FROM table1;
执行该查询产生的输出文件snapshot1.txt的每一行的形式为:
@key@md5value@attribute1|attribute2|...|attributen
其中key为一行元组的主码,md5value为该行的摘要,attribute1,…,attrituben为数据库各个属性在该行的取值。
附图2为实现该查询语句的流程图,具体过程如下:
(1)词法和语法分析“select into outfile”,根据FIELDS子句设置标志位
(1.1)读取FIELDS TERMINATED BY的第一个字节,若不为“#”,则置标志位normal为true,表示查询结果将按标准格式输出到磁盘文件,否则置标志位normal为false,表示查询结果将按个性定义输出到磁盘文件;
(1.2)若标志位normal为false,则读取FIELDS TERMINATED BY第二个字节,若为“#”,则置标志位selfhood为true,表示输出主码值key和摘要md5value,否则置标志位selfhood为false,表示输出主码值key、摘要md5value和整个元值的值value;
(2)将“select into outfile”从数据库查询得到的一行元组插入“属性值分隔符”;
(3)根据标志位值对“select into outfile”查询执行的结果生成摘要md5value和产生输出格式:
(3.1)提取当前行的数据分隔符;
(3.2)取出当前行的数据存于cache中并记录下key值;
(3.3)若标志位normal为true,直接输出cache中的数据,转下一行处理;
(3.4)若标志位normal为false,调用md5程序为cache中数据生成摘要md5value;
(3.5)若标志位selfhood为true,输出主码值key和摘要md5value,输出格式为@key@md5value;
(3.6)若标志位selfhood为false,输出主码值key、摘要md5value和整个元组值value,输出格式为@key@md5value@value;
(4)将查询结果写到磁盘文件outfile;
2、采有Hadoop MapReduce并行框架求差分
快照差分算法的关键问题就是求差分的过程。由于快照文件比较大,难以一次全部装入内存;而快照文件在大小、排列上也存在很大的差异,使得求差分过程非常困难。为了降低求差分的难度,已有的研究提出了Hash分区和Window算法,这两种算法由于受到内存大小的限制而可能产生结果误差,如:内存装不下一个哈希桶或者二个主码在文件中的位置超出了Window大小都可能影响结果的正确性。对二个快照文件进行排序归并求差分的算法保证了结果的正确性,但单CPU的处理效率非常低。本发明将MapReduce的并行编程框架和排序归并算法相结合,既保证CDC结果的正确性,也保证CDC的处理效率;至于Map/Reduce要求的集群条件对绝大多数公司都是可满足的。
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,处理Key/value结构的数据,MapReduce的工作原理不属于本发明的范畴,在此就不详细说明。本发明主要利用了MapReduce的并行编程框架实现了快照差分算法。具体过程如下所述:
(1)从map端读入两个快照文件old.txt和new.txt,通过文件行的切分在map端输出<key,@md5value@value>或者<key,@md5value>的形式,其中@md5value@value或@md5value作为Key/value结构中的value值。
(2)MapReduce的shuffle函数对Key/value结构中相同key的value值存入迭代器iterator,发送reduce端
(3)reduce端接收的数据形式为<key,iterator>,对iterator中的value个数进行统计和分类可取获得变化的数据:
(3.1)若iterator仅有一个数据,即该数据仅出现在一个快照文件中,说明该数据是数据库新插入insert或删除delete的元组;
(3.2)若iterator有二个数据,即该数据出现在二个快照文件中,继续比较二个数据中md5value的值,如果md5value值相同,说明该数据没有变化,如果md5value值不相同,说明该数据是数据库作了更新update操作的结果,将更新update操作分解为删除delete操作和插入insert操作;
(4)将reduce的输出文件合并成insert文件和delete文件,即CDC的结果
针对数据库更新操作的频率和降低I/O代价的目的,本发明提出了带值CDC和回查CDC二种算法,这二种算法主要存在二点差别:
(1)“select into outfile”查询结果输出不一样:带值CDC算法的输出行形式为@key@MD5value@value,回查CDC算法的输出形式为@key@MD5value,对更新较少的数据库采用回查CDC算法可减少写数据和Map端读数据的代价;
(2)二种CDC算法获得结果的方法不一样:带值CDC算法直接由reduce端输出变化数据,回查CDC算法利用reduce端的结果对数据库进行一次查询来获得变化后的数据,回查CDC算法增加了对数据库的一次访问;
为区分新、旧快照,可在二次连续生成快照的“select into outfile”查询语句采用不同的“段分隔符”,假设旧快照的“段分隔符”为“@”,新快照的“段分隔符”为“#”(该假设不影响结果),带值CDC算法和回查CDC算法在Map端的处理流程相同,如图3所示,具体流程如下:
(1)从快照文件读入一行数据,取该行的第一个字符sign
(2)用sign切分剩下的字符串得到一个字符数组
(3)将字符数组的第一个元素作为key,剩余的元素作为value
(4)将切分后的数据传给shuffle函数
带值CDC算法的Reduce端处理流程如图4所示,具体流程如下:
(1)经过shuffle函数处理后的数据传送到Reduce端,数据格式为<key,iterator>,取出iterator的第一个元素value1
(2)根据iterator中元素个数判断数据库的更新操作
(2.1)若iterator为空,则<key,iterator>的值为数据库新插入或删除操作产生的元组,读出“段分隔符”将<key,value1>插入insert文件或delete文件
(2.2)若iterator不为空,则取出iterator中的元素value1和元素value2中的md5value,若value1和value2中的md5value值相同,则数据库对该元组没有更新操作,否则<key,iterator>为数据库修改操作前和修改操作后的值,读出value1和value2的“段分隔符”将<key,value1>和<key,value2>分别插入insert文件和delete文件
(3)处理完<key,iterator>后的insert文件和delete文件即为数据库变化数据文件。
回查CDC算法的Reduce端处理流程如图5所示,具体流程如下:
(1)经过shuffle函数处理后的数据传送到Reduce端,数据格式为<key,iterator>,取出iterator的第一个元素value1
(2)根据iterator中元素个数判断数据库的更新操作
(2.1)若iterator为空,则<key,iterator>的值为数据库新插入或删除操作产生的元组,读出“段分隔符”为旧快照标识符,直接输出到delete文件;读出“段分隔符”为新快照标识符,通过JDBC连接数据库回查该key值对应的元组值,将查询结果输出到insert文件;
(2.2)若iterator不为空,则取出iterator中的元素value1和元素value2中的md5value,若value1和value2中的md5value值相同,则数据库对该元组没有更新操作,否则<key,iterator>为数据库修改操作前和修改操作后的值,若读出value1的“段分隔符”为旧快照标识符,直接将value1的key输出到delete文件,通过JDBC连接数据库回查该value2的key值对应的元组值,将查询结果输出到insert文件,否则反之。
(3)处理完<key,iterator>后的insert文件和delete文件即为数据库变化数据文件。
上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。
Claims (5)
1.基于MapReduce的MYSQL数据库的变化数据捕获方法,其特征在于,包括下述步骤:
(1)生成摘要的查询语句“select into outfile”,其具体步骤如下:
(1-1)词法和语法分析“select into outfile”,根据FIELDS子句设置标志位;
(1-2)将“select into outfile”从数据库查询得到的一行元组插入“属性值分隔符”;
(1-3)根据标志位值对“select into outfile”查询执行的结果生成摘要md5value和产生输出格式;
(1-4)将查询结果写到磁盘文件outfile;
(2)采用Hadoop MapReduce并行框架求差分;
(2-1)从map端读入两个快照文件old.txt和new.txt,通过文件按行切分在map端输出<key,@md5value@value>或者<key,@md5value>的形式,其中@md5value@value或@md5value作为Key/value结构中的value值;
(2-2)MapReduce的shuffle函数对Key/value结构中相同key的value值存入迭代器iterator,发送reduce端;
(2-3)reduce端接收的数据形式为<key,iterator>,对iterator中的value个数进行统计和分类可取获得变化的数据:
(2-4)将reduce的输出文件合并成insert文件和delete文件,即CDC的结果;采用带值CDC算法或回查CDC算法对数据进行处理;
所述带值CDC算法的处理方法如下:
(2-4-1)从快照文件读入一行数据,取该行的第一个字符sign;
(2-4-2)用sign切分剩下的字符串得到一个字符数组;
(2-4-3)将字符数组的第一个元素作为key,剩余的元素作为value;
(2-4-4)将切分后的数据传给shuffle函数;
(2-4-5)经过shuffle函数处理后的数据传送到Reduce端,数据格式为<key,iterator>,取出iterator的第一个元素value1;
(2-4-6)根据iterator中元素个数判断数据库的更新操作,具体步骤如下:
(2-4-6-1)若iterator为空,则<key,iterator>的值为数据库新插入或删除操作产生的元组,读出“段分隔符”将<key,value1>插入insert文件或delete文件;
(2-4-6-2)若iterator不为空,则取出iterator中的元素value1和元素value2中的md5value,若value1和value2中的md5value值相同,则数据库对该元组没有更新操作,否则<key,iterator>为数据库修改操作前和修改操作后的值,读出value1和value2的“段分隔符”将<key,value1>和<key,value2>分别插入insert文件和delete文件;
(2-4-7)处理完<key,iterator>后的insert文件和delete文件即为数据库变化数据文件;
所述回查CDC算法的处理方法如下:
(2-5-1)从快照文件读入一行数据,取该行的第一个字符sign;
(2-5-2)用sign切分剩下的字符串得到一个字符数组;
(2-5-3)将字符数组的第一个元素作为key,剩余的元素作为value;
(2-5-4)将切分后的数据传给shuffle函数;
(2-5-5)经过shuffle函数处理后的数据传送到Reduce端,数据格式为<key,iterator>,取出iterator的第一个元素value1;
(2-5-6)根据iterator中元素个数判断数据库的更新操作,具体为:
(2-5-6-1)若iterator为空,则<key,iterator>的值为数据库新插入或删除操作产生的元组,读出“段分隔符”为旧快照标识符,直接输出到delete文件;读出“段分隔符”为新快照标识符,通过JDBC连接数据库回查该key值对应的元组值,将查询结果输出到insert文件;
(2-5-6-2)若iterator不为空,则取出iterator中的元素value1和元素value2中的md5value,若value1和value2中的md5value值相同,则数据库对该元组没有更新操作,否则<key,iterator>为数据库修改操作前和修改操作后的值,若读出value1的“段分隔符”为旧快照标识符,直接将value1的key输出到delete文件,通过JDBC连接数据库回查该value2的key值对应的元组值,将查询结果输出到insert文件,否则反之;
(2-5-7)处理完<key,iterator>后的insert文件和delete文件即为数据库变化数据文件。
2.根据权利要求1所述基于MapReduce的MYSQL数据库的变化数据捕获方法,其特征在于,所述查询语句符合下述语法要求:
(a)FIELDS子句的“输出标识符”、“段分隔符”、“属性值分隔符”为可选项;“输出标识符”可取三个值:缺省、'#'、'##';“段分隔符”可缺省或者取除'#'和出现在该数据库之外的其他符号;“属性值分隔符”可缺省或者取除'#'和出现在该数据库之外的符号;“段分隔符”和“属性值分隔符”不能为相同的符号;
(b)若“输出标识符”缺省则“段分隔符”也一定缺省,该语句仅输出每行元组的属性值;
(c)若“输出标识符”为'#'时,“段分隔符”不可缺省,该语句输出每行元组的主码值key和该行的摘要MD5value,由“段分隔符”将主码值key和摘要MD5value分隔开;
(d)若“输出标识符”为'##'时,“段分隔符”不可缺省,该语句输出每行元组的主码值key、该行的摘要MD5value和属性在该行的取值value,由“段分隔符”将主码值key、摘要MD5value和值value分隔开;若定义了“属性值分隔符”,则值value和key由“属性值分隔符”将每个属性值分隔开;
(e)该查询语句可用于一般查询,也可用于包含摘要的快照文件的生成;若将该查询语句用于包含摘要的快照文件的生成,“输出标识符”取值'##'时,必须定义“属性值分隔符”,这样方便计算变化的数据;
(f)子句LINES定义行分隔符,取值为“回车&换行”,不可缺省,方便按行读取文件。
3.根据权利要求1所述基于MapReduce的MYSQL数据库的变化数据捕获方法,其特征在于,步骤(1-1)的具体形式如下:
(1-1-1)读取FIELDS TERMINATED BY的第一个字节,若不为“#”,则置标志位normal为true,表示查询结果将按标准格式输出到磁盘文件,否则置标志位normal为false,表示查询结果将按个性定义输出到磁盘文件;
(1-1-2)若标志位normal为false,则读取FIELDS TERMINATED BY第二个字节,若为“#”,则置标志位selfhood为true,表示输出主码值key和摘要md5value,否则置标志位selfhood为false,表示输出主码值key、摘要md5value和整个元值的值value。
4.根据权利要求1所述基于MapReduce的MYSQL数据库的变化数据捕获方法,其特征在于,步骤(1-3)具体为:
(1-3-1)提取当前行的数据分隔符;
(1-3-2)取出当前行的数据存于cache中并记录下key值;
(1-3-3)若标志位normal为true,直接输出cache中的数据,转下一行处理;
(1-3-4)若标志位normal为false,调用md5程序为cache中数据生成摘要md5value;
(1-3-5)若标志位selfhood为true,输出主码值key和摘要md5value,输出格式为@key@md5value;
(1-3-6)若标志位selfhood为false,输出主码值key、摘要md5value和整个元组值value,输出格式为@key@md5value@value。
5.根据权利要求1所述基于MapReduce的MYSQL数据库的变化数据捕获方法,其特征在于,步骤(2-3)具体为:
(2-3-1)若iterator仅有一个数据,即该数据仅出现在一个快照文件中,说明该数据是数据库新插入insert或删除delete的元组;
(2-3-2)若iterator有二个数据,即该数据出现在二个快照文件中,继续比较二个数据中md5value的值,如果md5value值相同,说明该数据没有变化,如果md5value值不相同,说明该数据是数据库作了更新update操作的结果,将更新update操作分解为删除delete操作和插入insert操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310332312.8A CN103440265B (zh) | 2013-08-01 | 2013-08-01 | 基于MapReduce的MYSQL数据库的变化数据捕获方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310332312.8A CN103440265B (zh) | 2013-08-01 | 2013-08-01 | 基于MapReduce的MYSQL数据库的变化数据捕获方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103440265A CN103440265A (zh) | 2013-12-11 |
CN103440265B true CN103440265B (zh) | 2016-09-14 |
Family
ID=49693957
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310332312.8A Expired - Fee Related CN103440265B (zh) | 2013-08-01 | 2013-08-01 | 基于MapReduce的MYSQL数据库的变化数据捕获方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103440265B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104063301A (zh) * | 2014-07-02 | 2014-09-24 | 网神信息技术(北京)股份有限公司 | 监控方法和装置 |
CN105975865B (zh) * | 2016-05-27 | 2019-06-07 | 北京工业大学 | 一种基于可信计算的Hadoop平台度量方法 |
CN106095944A (zh) * | 2016-06-15 | 2016-11-09 | 深圳海带宝网络科技股份有限公司 | 一种跨境电商全球数据同步系统 |
CN110309122B (zh) * | 2018-03-28 | 2022-12-30 | 腾讯科技(深圳)有限公司 | 获取增量数据的方法、装置、服务器和存储介质 |
CN112632183B (zh) * | 2020-12-11 | 2023-07-11 | 广东电力通信科技有限公司 | 一种基于电网网络分区数据表准实时同步方法及系统 |
CN113160918A (zh) * | 2021-05-21 | 2021-07-23 | 山东健康医疗大数据有限公司 | 一种变化数据捕获的统一处理方法及工具 |
CN114003660B (zh) * | 2021-11-05 | 2022-06-03 | 广州宸祺出行科技有限公司 | 基于flink的高效同步实时数据到ClickHouse的方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20070004256A (ko) * | 2005-07-04 | 2007-01-09 | 삼성전자주식회사 | 데이터베이스 검색 방법 및 장치 |
-
2013
- 2013-08-01 CN CN201310332312.8A patent/CN103440265B/zh not_active Expired - Fee Related
Non-Patent Citations (3)
Title |
---|
MapReduce中shuffle优化与重构;彭辅权;《中国科技论文》;20120430;第7卷(第4期);第241-245页 * |
MySQL 5.0 Reference Manual;MySQL AB;《http://dev.mysql.com》;20060416;第45-60页 * |
基于变异MD5的快照差分算法;唐向阳等;《微计算机应用》;20101231;第31卷(第12期);第1-7页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103440265A (zh) | 2013-12-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103440265B (zh) | 基于MapReduce的MYSQL数据库的变化数据捕获方法 | |
Bhuiyan et al. | An iterative MapReduce based frequent subgraph mining algorithm | |
US10176225B2 (en) | Data processing service | |
CN107391306B (zh) | 一种异构数据库备份文件恢复方法 | |
Kim et al. | Turboflux: A fast continuous subgraph matching system for streaming graph data | |
US6721749B1 (en) | Populating a data warehouse using a pipeline approach | |
US9600513B2 (en) | Database table comparison | |
CA2420214C (en) | Data processing method and apparatus | |
CN107092627B (zh) | 记录的列状存储表示 | |
US8924373B2 (en) | Query plans with parameter markers in place of object identifiers | |
CA2997061C (en) | Method and system for parallelization of ingestion of large data sets | |
Abedjan et al. | Advancing the discovery of unique column combinations | |
US7996442B2 (en) | Method and system for comparing and re-comparing data item definitions | |
Klettke et al. | Uncovering the evolution history of data lakes | |
CN103886011A (zh) | 一种基于索引文件的社会关系网络创建与检索系统及方法 | |
CN109388523A (zh) | 一种基于二进制日志文件恢复MySQL数据库的方法 | |
Rozsnyai et al. | Large-scale distributed storage system for business provenance | |
Jianmin et al. | An improved join‐free snowflake schema for ETL and OLAP of data warehouse | |
Chaudhuri et al. | Mining document collections to facilitate accurate approximate entity matching | |
Eltabakh et al. | BDBMS--a database management system for biological data | |
AL-Msie'deen et al. | Detecting commonality and variability in use-case diagram variants | |
Millham et al. | Pattern mining algorithms | |
Bhuiyan et al. | MIRAGE: An Iterative MapReduce based FrequentSubgraph Mining Algorithm | |
Augusto et al. | Efficient checking of temporal compliance rules over business process event logs | |
Psallidas et al. | OneProvenance: Efficient Extraction of Dynamic Coarse-Grained Provenance from Database Logs [Technical Report] |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160914 Termination date: 20190801 |