CN104778225B - 一种非结构化数据多存储系统中同步数据的方法 - Google Patents
一种非结构化数据多存储系统中同步数据的方法 Download PDFInfo
- Publication number
- CN104778225B CN104778225B CN201510137871.2A CN201510137871A CN104778225B CN 104778225 B CN104778225 B CN 104778225B CN 201510137871 A CN201510137871 A CN 201510137871A CN 104778225 B CN104778225 B CN 104778225B
- Authority
- CN
- China
- Prior art keywords
- data
- row
- value
- concordance list
- key
- 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.)
- Active
Links
Abstract
本发明公开了一种非结构化数据多存储系统中同步数据的方法,特别适用于以HBase为主数据库的非结构化数据多存储系统中数据同步问题。本方法引入了两种捕获HBase内原数据表数据变更事件的捕获器,首先通过捕获器捕获主数据库内数据变更事件,然后将捕获到的数据变更事件进行序列化,并将序列化后的字节流数据连入DataBus开源工作框架,最终使非结构化数据多存储系统内的数据得到同步。本发明有效克服了传统非结构化数据多存储系统中数据同步方法的缺点,搭建了高可用、可扩展的数据同步组件,具有良好的应用价值。
Description
技术领域
本发明涉及一种非结构化数据多存储系统中同步数据的方法,尤其涉及非结构化数据多存储系统内以捕获主数据库HBase的数据变更事件完成存储组件之间数据同步的方法。
背景技术
多存储系统是建立在数据仓库中以多个不同类型的存储组件共同对外提供服务的综合数据管理系统。整个系统共用一个服务数据集,其中数据除在主存储数据库中储存外,还会根据应用的服务需要以不同的格式冗余存储在其它存储组件之中。相比单一的传统关系型数据库或者NoSQL数据库,非结构化数据多存储系统不仅在存储能力上具有强容错、高可用和可扩展等特性,并且其可以利用不同类型的存储组件展示一个数据集的多种服务视图来提供更丰富的数据服务。
在非结构化数据多存储系统内,主数据库与其它数据存储组件分布在不同的网络节点中,并以网络链路相连。需要同步的数据以字节流的形式在数据链路中传输。由于非结构化数据海量异构的自然属性,它们之间的数据同步过程必须符合如下几个条件:高效性,数据同步组件以较高的吞吐量完成数据的传输;时效性,数据必须以一个较小的延时在存储组件之间同步;可扩展性,数据同步组件必须在系统数据量增大时提供有效的水平扩展手段。
在传统的非结构化数据多存储系统中,数据的同步过程常由客户端多路写与定时数据迁移来完成。客户端多路写(User-driven Dual Writes)即用户层应用程序在向主存储数据库发起操作时,主动地向冗余存储该数据的其它存储组件发起相同的操作,从而完成数据在不同存储组件之间的同步。定时数据迁移,即利用ETL(Extract-Transform-Load)工具周期性地按照外围组件的数据组织要求批量地将数据加载到外围存储组件当中,而无需用户手动编写相关功能逻辑代码。
传统的数据同步方式具有如下缺点:
1、客户端多路写虽然实现起来较为简单,对系统自身的要求较低。但其需要应用层程序员的参与,对系统组织结构的变化敏感,任何系统的变动均要求应用层程序员进行相应的改动。并且在多路写过程中将会引入新的一致性问题,常需要额外的协调手段对该数据同步过程进行协调。
2、ETL定时迁移非实时同步的特点增加了数据更新在外围组件中的可见延迟,实时性不强。并且其在通过主数据库读取其中数据时造成的负载也降低了主存储数据库对外提供服务的能力。
DataBus是由Linkedin开源的成熟数据同步产品,其以快照加增量的方式提供数据同步功能。但其主要考虑的是以常见的结构化数据库MySQL、Oracle为主存储数据库的结构化数据多存储系统,现有的技术并没有充分考虑在海量非结构化数据应用场景中,数据由NoSQL数据向其他存储组件的同步。因此需要一种从NoSQL数据库HBase中捕获数据变更的方法,并以此为基础实现DataBus的一类适宜于非结构化数据多存储系统中数据同步的扩展。
发明内容
本发明的目的在于针对目前非结构化数据多存储系统中高效数据同步方式的欠缺,提出一种在以HBase为主存储数据库的非结构化数据多存储系统中基于HBase数据变更捕获和DataBus开源框架的数据同步方法,本发明为当前以HBase为主存储器的非结构化数据多存储系统提供高可用、可扩展、强容错的数据同步手段。
本发明的目的是通过以下技术方案来实现的:一种非结构化数据多存储系统中同步数据的方法,包括以下步骤:
(1)定义HBase数据变更事件统一模型,所述的HBase数据变更事件统一模型如下:
Event=(TableName,TimeStamp,RowKey,ColumnFamily,Column,Value,Type),
其中TableName表示数据变更发生的数据表表名;TimeStamp表示数据变更发生时的时间;RowKey表示发生数据变更数据行的行键值,由一个Byte序列构成;ColumnFamily和Column表示变更发生的数据单元的列族名和列名,由一个Byte序列构成;Type为变更的类型,用一个字节表示;Value表示数据变更的值,由Byte序列表示更新的值;
(2)对于原数据表中数据低于整个集群数据量20%的情况,创建第一类数据变更捕获器;对于需要捕获删除事件或者原数据表中数据变化频率高于2.5s每次的应用场景,创建第二类数据变更捕获器;两类数据变更捕获器的创建具体如下:
(2.1)创建第一类数据变更捕获器,该步骤包括以下子步骤:
(2.1.1)创建索引表:索引表表名为原数据表表名加上后缀“_scn”,索引表仅包含一个列族“index”,以不同的列表示不同的索引信息;索引数据具体的编排形式如下:
(TimeStamp,index:(ColunmnFamily_R,ColumnFamily_C),(RowKey,Column))
每行索引数据以数据变更发生的时间作为其行键值TimeStamp;索引表中每条索引信息记录两列数据(ColunmnFamily_R,ColumnFamily_C),后缀为“_R”的列其值为该次变更事件所在数据单元的原数据表行键值RowKey;后缀为“_C”的列,保存该条数据在原数据表的列列名Column;原数据表中数据变更发生的列族名隐含地保存在索引表各行的列族名前缀ColunmnFamily之中;
(2.1.2)利用Coprocessor运行框架在数据写入HBase时同步地将相关索引数据记录在索引表中;在为构建索引数据构建的jar包中,在Coprocessor.BaseRegionObserver基类的一个新的派生类中重载PostPut方法,具体包括以下子步骤:
(2.1.2.1)从写入操作的Put实例中提取数据插入位置的行键值与原数据表表名,并以原数据表表名推断其对应的索引表表名;
(2.1.2.2)从Coprocessor框架提供的上下文中获取辅助环境变量,可以利用该变量获得对于任意数据表的连接;
(2.1.2.3)查看put实例中的所有的写入数据,遍历由put.familyMap.keySet()方法返回的所有Key-Values键值对信息;
(2.1.2.4)提取遍历到的每一个Key-Values键值对中的列族、列与时间戳信息,并将这些信息组织成一个以时间戳为行键值并以索引表格式组织的索引表put操作实例,将这些索引表put操作实例放入List列表putList待用;
(2.1.2.5)查看当前缓存的索引表连接是否指向本次操作的索引表,若否利用辅助环境变量获得该索引表的连接;
(2.1.2.6)利用索引表连接,在索引表中通过scnTable.put(putList)写入该次操作对应的索引信息;
(2.1.3)捕获器进程周期性地通过索引表中的数据捕获原数据表中特定时间区间内的数据变更事件,该时间区间由上一次捕获完成时间与当前捕获时间共同决定,具体包括以下子步骤:
(2.1.3.1)依据数据变更捕获配置,获取本次数据抓取的原数据表表名,从其表名中推断其对应索引表表名;
(2.1.3.2)新建HBase数据表扫描实例Scan,设定该Scan的起始行键值为本次数据变更捕获对应的时间区间起点,终止行键值设置为0x7FFFFFFF或者当前时间戳值;
(2.1.3.3)通过索引表表名获取索引表连接,并应用步骤2.1.3.2建立的Scan实例(htable.getScanner(Scan)),取得操作结果(由ResultScanner实例表示);
(2.1.3.4)迭代2.1.3.3操作结果中的每一行数据,检查其中所有列列名及其值,若其列列名后缀为R,记录该列值为行键值RowKey,若该列列名后缀为C,记录该列值为列名Column,最后从列族名中提取原表列族名ColumnFamily;
(2.1.3.5)利用步骤2.1.3.4中获取的RowKey新建get实例,并加入列(ColumnFamiy,Column),并将该Get加入List列表getList待用;
(2.1.3.6)利用原数据表表名获取原数据表连接,并通过hTable.get(getList)取得索引记录的数据;
(2.1.3.7)迭代步骤2.1.3.6中返回的索引记录数据,将每一个数据单元的列族名、列、值、时间戳、类型数据组织成一个数据变更事件;
(2.2)创建第二类数据变更捕获器,具体包括以下子步骤:
(2.2.1)获得原数据表HBase集群使用的HDFS集群位置及其WAL文件所在路径,并将所有的抓取任务按照HBase集群位置以及WAL文件所在HDFS文件路径进行分类,所有由同一组(HBase集群位置,WAL文件路径)标识的任务被组织成一个单一的任务,属于该组的所有变更捕获任务均在一次WAL文件扫描中完成;
(2.2.2)建立WAL文件名到其已读取偏移量的映射表Map<Byte[]filename,longoffset>,所述映射表初始为空,用于记录每一个WAL文件中已经读取分析过的偏移量值;
(2.2.3)读取HDFS上指定路径下所有的WAL文件,若映射表中不存在读取到的WAL文件名则向其新增映射表项(newName,0),其中newName代表新出现的WAL文件名且其对应偏移量为0;若映射表中存在一个映射表项的文件名未在该路径下出现,则表明该WAL文件已经被HBase的logroll进程删除,将该映射表项去除;
(2.2.4)构建筛选映射表,其结构为Map<Byte[]TableName,Set<Byte[]ColumnFamily>>,其中每一个映射表项均代表该TableName下所需进行数据变更捕获的列族ColumnFamily;
(2.2.5)迭代每一个WAL文件路径下的日志文件,从映射表中对应的项中读取其已经读取数据的偏移量,从该位置开始依次遍历每一个KeyValue键值对;检查该键值对中的时间戳是否落入本次数据捕获的目标时间戳,其次检查该KeyValue键值对对应的数据表名和列族名是否在筛选映射表中是否有对应项;若符合以上两个检查条件,则将该KeyValue键值对转换成一个数据变更事件;
(2.2.6)更新偏移量映射表中每个WAL文件对应的已读取偏移量为该次遍历完成的读取位置;
(3)创建数据变更事件序列化器,具体包括以下子步骤:
(3.1)创建Avro模式文件,所述模式文件内容如下:(key:bytes,value:bytes),模式文件由两个数据域key和value组成,其格式均为字节序列bytes;
(3.2)从两类数据变更捕获器获取从原数据表中捕获到的数据变更事件;
(3.3)利用步骤3.1创建的模式文件与步骤3.2获得的数据变更事件对数据组织GnericRecord实例;
(3.5)创建ByteArrayOutputStream实例,并利用其作为底层数据支撑构建Avro.directBinaryEncoder;
(3.6)利用GenricRecord实例中的模式文件定义创建Avro.GenericDatumWriter实例;
(3.7)在步骤3.6中的GenericDatumWriter上调用Write方法,其利用定义的directBinaryEncoder将GenricRecord中的数据写入directBinaryEncoder的内部缓冲空间;
(3.8)在为directBinaryEncoder提供底层数据支撑的ByteArrayOutputStream上调用方法toByteArray,获取字节数组与存储在其中的序列化结果;
(4)将序列化后的数据变更事件与DataBus基础框架结合。实现非结构化数据多存储系统中的数据同步,具体包括以下子步骤:
(4.1)将步骤3序列化后的数据变更事件对应的KeyValue键值对的Key对应的ByteBuffer提取出来;
(4.2)利用步骤4.1中的ByteBuffer作为DbusEventKey,以该DbusEventKey作为键,利用DbusEventBufferAppendable.appendEvent()将序列化后的字节序列写入Relay.logStore之中;实现HBase作为主数据库的非结构化数据多存储系统中的数据同步。
同现有的数据同步方法相比,本发明的有益效果是:
1、变更捕获方法与主数据库耦合程度低,用于数据同步的数据获取不会对HBase的服务性能造成不良影响,大规模数据应用中数据同步不会成为系统性能的瓶颈。
2、本方法易于扩展,这为随时可能增大的数据流量提供了有效的应对策略,通过增加服务的网络节点与进程数量即可调整数据同步数据吞吐量。
3、实时数据同步,数据在用户对主数据库中数据进行操作时实时地进行同步,降低了更新在不同存储组件之间的更新可见延迟。
附图说明
图1是HBase数据变更捕获的系统结构框图;
图2是Coprocessor索引记录流程图;
图3是数据变更捕获流程图。
具体实施方式
以下结合附图和具体实施例对本发明作进一步详细说明。
本发明一种非结构化数据多存储系统中同步数据的方法,系统结构框图如图1,包括以下步骤:
(1)定义HBase数据变更事件统一模型:使数据变更事件在整个非结构化数据多存储系统中具有统一的描述和表示,方便各个数据存储组件对其进行处理与传输。
所述的HBase数据变更事件统一模型如下:
Event=(TableName,TimeStamp,RowKey,ColumnFamily,Column,Value,Type)
其中TableName表示数据变更发生的数据表表名;TimeStamp表示数据变更发生时的时间;RowKey表示发生数据变更数据行的行键值,由一个Byte序列构成;ColumnFamily和Column表示变更发生的数据单元的列族名和列名,由一个Byte序列构成;Type为变更的类型,用一个字节表示,如更新操作(Put)、删除操作(Delete);Value表示数据变更的值,由Byte序列表示更新的值。所述的HBase数据变更事件统一模型与HBase底层Key-Value存储模式契合,方便数据变更事件的捕获。
(2)对于原数据表中数据低于整个集群数据量20%的情况,创建第一类数据变更捕获器;对于需要捕获删除事件或者原数据表中数据变化频率高于2.5s每次的应用场景,创建第二类数据变更捕获器。
利用Coprocessor实现的第一类数据变更捕获器在一定程度上满足了非结构化数据多存储系统中捕获主数据库数据变更事件的需求,但其在某些应用场景中仍然存在一定的缺陷。首先,第一类捕获器不能很好地支持删除事件的记录。其次,其不能很好地在数据变化频率较高的应用场景中适用。以上问题在一定程度上限制了第一类数据变更捕获器的应用场景。
为了对第一类数据变更捕获器无法胜任的应用场景进行补充。创建第二类数据变更捕获器。第二类数据变更捕获器跳过了HBase层的应用服务接口,转而使用作为其底层支撑的分布式文件系统HDFS服务接口,通过解析HDFS上的WAL日志文件获取HBase中的数据变更事件。由于其不再使用HBase提供的任何服务,所以其在一定程度上弥补了第一类数据变更捕获器存在的缺陷与不足。
第二类数据变更捕获器作为第一类数据变更捕获器的补充,对第一类捕获器不能胜任的应用场景进行了补充。但是,相比第一类数据变更捕获器,第二类数据变更捕获器有一个明显的劣势,其在分析WAL文件时需要遍历WAL文件中所有的Key-Value键值对,无论这些键值对是否属于需要抓取数据变更的数据表。若需要抓取的数据表尺寸仅占整个集群数据的一小部分。那么,由于这些额外的遍历操作而造成的性能开销是十分可观的。所以,第一类数据变更捕获器与第二类数据变更捕获器互为补充,分别适用于不同的应用场景;两类数据变更捕获器的创建具体如下:
(2.1)创建第一类数据变更捕获器:第一类数据变更捕获器主要利用了HBaseCoprocessor为每一次数据操作记录额外的数据。其在HBase中为每张要进行数据变更捕获的数据表建立对应的索引数据表。该步骤包括以下子步骤:
(2.1.1)创建索引表:索引表与原数据表均为HBase中的数据表,支持海量数据的随机读写。索引表表名为原数据表表名加上后缀“_scn”。因此,变更捕获器通过原数据表表名即可推断出其索引表表名,方便了索引表的查找。索引表仅包含一个列族“index”,以不同的列表示不同的索引信息。索引数据具体的编排形式如下:
(TimeStamp,index:(ColunmnFamily_R,ColumnFamily_C),(RowKey,Column))
每行索引数据以数据变更发生的时间作为其行键值TimeStamp,保证索引数据根据其索引事件发生的时间先后顺序进行排列,方便捕获器按照时间顺序读取数据变更事件。索引表中每条索引信息记录两列数据(ColunmnFamily_R,ColumnFamily_C),其列名与原数据表数据变更发生的存储单元列族名有关,使用不同的后缀标识数据的不同含义。后缀为“_R”的列其值为该次变更事件所在数据单元的原数据表行键值RowKey;后缀为“_C”的列,保存该条数据在原数据表的列列名Column;原数据表中数据变更发生的列族名隐含地保存在索引表各行的列族名前缀ColunmnFamily之中。
具体而言,假如写入HBase原数据表testTable的一条数据为:
则其对应的索引数据在testTable_scn内的表示为:
(2.1.2)利用Coprocessor运行框架在数据写入HBase时同步地将相关索引数据记录在索引表中。在为构建索引数据构建的jar包中,在Coprocessor.BaseRegionObserver基类的一个新的派生类中重载了PostPut方法。具体包括以下子步骤:
(2.1.2.1)从写入操作的Put实例中提取数据插入位置的行键值与原数据表表名,并以原数据表表名推断其对应的索引表表名;
(2.1.2.2)从Coprocessor框架提供的上下文中获取辅助环境变量,可以利用该变量获得对于任意数据表的连接;
(2.1.2.3)查看put实例中的所有的写入数据,遍历由put.familyMap.keySet()方法返回的所有Key-Values键值对信息;
(2.1.2.4)提取遍历到的每一个Key-Values键值对中的列族、列与时间戳信息,并将这些信息组织成一个以时间戳为行键值并以索引表格式组织的索引表put操作实例,将这些索引表put操作实例放入List列表putList待用;
(2.1.2.5)查看当前缓存的索引表连接是否指向本次操作的索引表,若否利用辅助环境变量获得该索引表的连接。缓存索引表连接的原因是为了节省建立数据表连接的开销。根据程序的局部性原理,两次相邻的写入连接很大程度上会对同一张数据表进行操作,缓存索引表连接能够很好地利用这一局部性,降低由于建立和断开数据表连接带来的额外开销。
(2.1.2.6)利用索引表连接,在索引表中通过scnTable.put(putList)写入该次操作对应的索引信息。
(2.1.3)捕获器进程周期性地通过索引表中的数据捕获原数据表中特定时间区间内的数据变更事件,该时间区间由上一次捕获完成时间与当前捕获时间共同决定。具体包括以下子步骤:
(2.1.3.1)依据数据变更捕获配置,获取本次数据抓取的原数据表表名,从其表名中推断其对应索引表表名;
(2.1.3.2)新建HBase数据表扫描实例Scan,设定该Scan的起始行键值为本次数据变更捕获对应的时间区间起点,终止行键值设置为0x7FFFFFFF或者当前时间戳值;
(2.1.3.3)通过索引表表名获取索引表连接,并应用步骤2.1.3.2建立的Scan实例(htable.getScanner(Scan)),取得操作结果(由ResultScanner实例表示);
(2.1.3.4)迭代2.1.3.3操作结果中的每一行数据,检查其中所有列列名及其值,若其列列名后缀为R,记录该列值为行键值RowKey,若该列列名后缀为C,记录该列值为列名Column,最后从列族名中提取原表列族名ColumnFamily;
(2.1.3.5)利用步骤2.1.3.4中获取的RowKey新建get实例,并加入列(ColumnFamiy,Column),并将该Get加入List列表getList待用;
索引记录流程如图2。
举例来说,若有一行索引数据如下:
则依据该索引数据构建的Get实例为:
RowKey | Column |
rk-1 | cf1:c1 |
(2.1.3.6)利用原数据表表名获取原数据表连接,并通过hTable.get(getList)取得索引记录的数据;
(2.1.3.7)迭代步骤2.1.3.6中返回的索引记录数据,将每一个数据单元的列族名、列、值、时间戳、类型数据组织成一个数据变更事件;
(2.2)创建第二类数据变更捕获器,具体包括以下子步骤:
(2.2.1)获得原数据表HBase集群使用的HDFS集群位置及其WAL文件所在路径,并将所有的抓取任务按照HBase集群位置以及WAL文件所在HDFS文件路径进行分类,所有由同一组(HBase集群位置,WAL文件路径)标识的任务被组织成一个单一的任务,属于该组的所有变更捕获任务均在一次WAL文件扫描中完成;
(2.2.2)建立WAL文件名到其已读取偏移量的映射表Map<Byte[]filename,longoffset>,所述映射表初始为空,用于记录每一个WAL文件中已经读取分析过的偏移量值,降低筛选重复的Key-Value键值对带来的性能损耗。
(2.2.3)读取HDFS上指定路径下所有的WAL文件,若映射表中不存在读取到的WAL文件名则向其新增映射表项(newName,0),其中newName代表新出现的WAL文件名且其对应偏移量为0;若映射表中存在一个映射表项的文件名未在该路径下出现,则表明该WAL文件已经被HBase的logroll进程删除,将该映射表项去除;
(2.2.4)构建筛选映射表,其结构为Map<Byte[]TableName,Set<Byte[]ColumnFamily>>,其中每一个映射表项均代表该TableName下所需进行数据变更捕获的列族ColumnFamily,后续步骤利用该映射表去除WAL文件中无关的Key-Value键值对数据。
(2.2.5)迭代每一个WAL文件路径下的日志文件,从映射表中对应的项中读取其已经读取数据的偏移量,从该位置开始依次遍历每一个KeyValue键值对;检查该键值对中的时间戳是否落入本次数据捕获的目标时间戳,其次检查该KeyValue键值对对应的数据表名和列族名是否在筛选映射表中是否有对应项;若符合以上两个检查条件,则将该KeyValue键值对转换成一个数据变更事件;
(2.2.6)更新偏移量映射表中每个WAL文件对应的已读取偏移量为该次遍历完成的读取位置;
数据变更捕获流程如图3;
(3)创建数据变更事件序列化器:为了方便捕获到的数据变更事件在数据链路中传输,需要对其进行序列化。序列化过程是将数据变更事件由高级语言实例的表示形式转化成低级的字节流表示形式。依照主数据库HBase中数据变更事件的模式和特点,可选用Avro对所得数据变更事件进行序列化。具体包括以下子步骤:
(3.1)创建Avro模式文件,供Avro序列化套件使用。由于每个HBase变更事件均由一个Key-Value键值对来表示,其结构上由一个键和一个值来表示,所以其对应的Avro模式稳定,仅由Key和Value两部分组成。其中Key和Value均由一连串的Byte串组成,且不会随着HBase数据表结构的变化而发生变化。所以,在本方法中,Avro模式是固定不变的,模式文件内容如下:(key:bytes,value:bytes),模式文件由两个数据域key和value组成,其格式均为字节序列bytes。
(3.2)从两类数据变更捕获器获取从原数据表中捕获到的数据变更事件;
(3.3)利用步骤3.1创建的模式文件与步骤3.2获得的数据变更事件对数据组织GnericRecord实例;
(3.5)创建ByteArrayOutputStream实例,并利用其作为底层数据支撑构建Avro.directBinaryEncoder;
(3.6)利用GenricRecord实例中的模式文件定义创建Avro.GenericDatumWriter实例;
(3.7)在步骤3.6中的GenericDatumWriter上调用Write方法,其利用定义的directBinaryEncoder将GenricRecord中的数据写入directBinaryEncoder的内部缓冲空间;
(3.8)在为directBinaryEncoder提供底层数据支撑的ByteArrayOutputStream上调用方法toByteArray,获取字节数组与存储在其中的序列化结果;
(4)将序列化后的数据变更事件与DataBus基础框架结合。实现非结构化数据多存储系统中的数据同步,具体包括以下子步骤:
(4.1)将步骤3序列化后的数据变更事件对应的KeyValue键值对的Key对应的ByteBuffer提取出来;
(4.2)利用步骤4.1中的ByteBuffer作为DbusEventKey,以该DbusEventKey作为键,利用DbusEventBufferAppendable.appendEvent()将序列化后的字节序列写入Relay.logStore之中;实现HBase作为主数据库的非结构化数据多存储系统中的数据同步。
Claims (1)
1.一种非结构化数据多存储系统中同步数据的方法,其特征在于,包括以下步骤:
(1)定义HBase数据变更事件统一模型,所述的HBase数据变更事件统一模型如下:
Event=(TableName,TimeStamp,RowKey,ColumnFamily,Column,Value,Type),
其中TableName表示数据变更发生的数据表表名;TimeStamp表示数据变更发生时的时间;RowKey表示发生数据变更数据行的行键值,由一个Byte序列构成;ColumnFamily和Column表示变更发生的数据单元的列族名和列名,由一个Byte序列构成;Type为变更的类型,用一个字节表示;Value表示数据变更的值,由Byte序列表示更新的值;
(2)对于原数据表中数据低于整个集群数据量20%的情况,创建第一类数据变更捕获器;对于需要捕获删除事件或者原数据表中数据变化频率高于2.5s每次的应用场景,创建第二类数据变更捕获器;两类数据变更捕获器的创建具体如下:
(2.1)创建第一类数据变更捕获器,该步骤包括以下子步骤:
(2.1.1)创建索引表:索引表表名为原数据表表名加上后缀“_scn”,索引表仅包含一个列族“index”,以不同的列表示不同的索引信息;索引数据具体的编排形式如下:
(TimeStamp,index:(ColunmnFamily_R,ColumnFamily_C),(RowKey,Column))
每行索引数据以数据变更发生的时间作为其行键值TimeStamp;索引表中每条索引信息记录两列数据(ColunmnFamily_R,ColumnFamily_C),后缀为“_R”的列其值为该次变更事件所在数据单元的原数据表行键值RowKey;后缀为“_C”的列,保存该条数据在原数据表的列列名Column;原数据表中数据变更发生的列族名隐含地保存在索引表各行的列族名前缀ColunmnFamily之中;
(2.1.2)利用Coprocessor运行框架在数据写入HBase时同步地将相关索引数据记录在索引表中;在为构建索引数据构建的jar包中,在Coprocessor.BaseRegionObserver基类的一个新的派生类中重载PostPut方法,具体包括以下子步骤:
(2.1.2.1)从写入操作的Put实例中提取数据插入位置的行键值与原数据表表名,并以原数据表表名推断其对应的索引表表名;
(2.1.2.2)从Coprocessor框架提供的上下文中获取辅助环境变量,可以利用该变量获得对于任意数据表的连接;
(2.1.2.3)查看put实例中的所有的写入数据,遍历由put.familyMap.keySet()方法返回的所有Key-Values键值对信息;
(2.1.2.4)提取遍历到的每一个Key-Values键值对中的列族、列与时间戳信息,并将这些信息组织成一个以时间戳为行键值并以索引表格式组织的索引表put操作实例,将这些索引表put操作实例放入List列表putList待用;
(2.1.2.5)查看当前缓存的索引表连接是否指向本次操作的索引表,若否利用辅助环境变量获得该索引表的连接;
(2.1.2.6)利用索引表连接,在索引表中通过scnTable.put(putList)写入该次操作对应的索引信息;
(2.1.3)捕获器进程周期性地通过索引表中的数据捕获原数据表中特定时间区间内的数据变更事件,该时间区间由上一次捕获完成时间与当前捕获时间共同决定,具体包括以下子步骤:
(2.1.3.1)依据数据变更捕获配置,获取本次数据抓取的原数据表表名,从其表名中推断其对应索引表表名;
(2.1.3.2)新建HBase数据表扫描实例Scan,设定该Scan的起始行键值为本次数据变更捕获对应的时间区间起点,终止行键值设置为0x7FFFFFFF或者当前时间戳值;
(2.1.3.3)通过索引表表名获取索引表连接,并应用步骤(2.1.3.2)建立的Scan实例(htable.getScanner(Scan)),取得操作结果,操作结果由ResultScanner实例表示;
(2.1.3.4)迭代(2.1.3.3)操作结果中的每一行数据,检查其中所有列列名及其值,若其列列名后缀为R,记录该列值为行键值RowKey,若该列列名后缀为C,记录该列值为列名Column,最后从列族名中提取原表列族名ColumnFamily;
(2.1.3.5)利用步骤(2.1.3.4)中获取的RowKey新建get实例,并加入列(ColumnFamiy,Column),并将该get 加入List列表getList待用;
(2.1.3.6)利用原数据表表名获取原数据表连接,并通过hTable.get(getList)取得索引记录的数据;
(2.1.3.7)迭代步骤(2.1.3.6)中返回的索引记录数据,将每一个数据单元的列族名、列、值、时间戳、类型数据组织成一个数据变更事件;
(2.2)创建第二类数据变更捕获器,具体包括以下子步骤:
(2.2.1)获得原数据表HBase集群使用的HDFS集群位置及其WAL文件所在路径,并将所有的抓取任务按照HBase集群位置以及WAL文件所在HDFS文件路径进行分类,所有由同一组标识的任务被组织成一个单一的任务,属于该组的所有变更捕获任务均在一次WAL文件扫描中完成;
(2.2.2)建立WAL文件名到其已读取偏移量的映射表Map<Byte[]filename,longoffset>,所述映射表初始为空,用于记录每一个WAL文件中已经读取分析过的偏移量值;
(2.2.3)读取HDFS上指定路径下所有的WAL文件,若映射表中不存在读取到的WAL文件名则向其新增映射表项(newName,0),其中newName代表新出现的WAL文件名且其对应偏移量为0;若映射表中存在一个映射表项的文件名未在该路径下出现,则表明该WAL 文件已经被HBase的logroll进程删除,将该映射表项去除;
(2.2.4)构建筛选映射表,其结构为Map<Byte[]TableName,Set<Byte[]ColumnFamily>>,其中每一个映射表项均代表该TableName下所需进行数据变更捕获的列族ColumnFamily;
(2.2.5)迭代每一个WAL文件路径下的日志文件,从映射表中对应的项中读取其已经读取数据的偏移量,从该位置开始依次遍历每一个KeyValue键值对;检查该键值对中的时间戳是否落入本次数据捕获的目标时间戳,其次检查该KeyValue键值对对应的数据表名和列族名是否在筛选映射表中是否有对应项;若符合以上两个检查条件,则将该KeyValue键值对转换成一个数据变更事件;
(2.2.6)更新偏移量映射表中每个WAL文件对应的已读取偏移量为该次遍历完成的读取位置;
(3)创建数据变更事件序列化器,具体包括以下子步骤:
(3.1)创建Avro模式文件,所述模式文件内容如下:(key:bytes,value:bytes),模式文件由两个数据域key和value组成,其格式均为字节序列bytes;
(3.2)从两类数据变更捕获器获取从原数据表中捕获到的数据变更事件;
(3.3)利用步骤(3.1)创建的模式文件与步骤(3.2)获得的数据变更事件对数据组织GnericRecord实例;
(3.5)创建ByteArrayOutputStream实例,并利用其作为底层数据支撑构建Avro.directBinaryEncoder;
(3.6)利用GenricRecord实例中的模式文件定义创建Avro.GenericDatumWriter实例;
(3.7)在步骤(3.6)中的GenericDatumWriter上调用Write方法,其利用定义的directBinaryEncoder将GenricRecord中的数据写入directBinaryEncoder的内部缓冲空间;
(3.8)在为directBinaryEncoder提供底层数据支撑的ByteArrayOutputStream上调用方法toByteArray,获取字节数组与存储在其中的序列化结果;
(4)将序列化后的数据变更事件与DataBus基础框架结合,实现非结构化数据多存储系统中的数据同步,具体包括以下子步骤:
(4.1)将步骤(3)序列化后的数据变更事件对应的KeyValue键值对的Key对应的ByteBuffer提取出来;
(4.2)利用步骤(4.1)中的ByteBuffer作为DbusEventKey,以该DbusEventKey作为键,利用DbusEventBufferAppendable.appendEvent()将序列化后的字节序列写入Relay.logStore之中;实现HBase作为主数据库的非结构化数据多存储系统中的数据同步。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510137871.2A CN104778225B (zh) | 2015-03-27 | 2015-03-27 | 一种非结构化数据多存储系统中同步数据的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510137871.2A CN104778225B (zh) | 2015-03-27 | 2015-03-27 | 一种非结构化数据多存储系统中同步数据的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104778225A CN104778225A (zh) | 2015-07-15 |
CN104778225B true CN104778225B (zh) | 2017-12-12 |
Family
ID=53619689
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510137871.2A Active CN104778225B (zh) | 2015-03-27 | 2015-03-27 | 一种非结构化数据多存储系统中同步数据的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104778225B (zh) |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105447111B (zh) * | 2015-11-13 | 2017-12-12 | 铜陵有色金属集团股份有限公司金冠铜业分公司 | mysql与MongoDB数据同步的方法及其系统 |
CN107346314A (zh) * | 2016-05-06 | 2017-11-14 | 银联国际有限公司 | 一种数据库单向同步方法 |
CN106294769B (zh) * | 2016-08-11 | 2019-08-27 | 珠海格力电器股份有限公司 | 同步工程数据的方法、系统和装置 |
CN107908481A (zh) * | 2017-10-17 | 2018-04-13 | 链家网(北京)科技有限公司 | 一种数据同步方法、装置和系统 |
CN110807013B (zh) * | 2018-08-03 | 2023-07-18 | 阿里巴巴集团控股有限公司 | 用于分布式数据存储集群的数据迁移方法和装置 |
CN109257337B (zh) * | 2018-08-28 | 2021-09-07 | 科大国创软件股份有限公司 | 物联网设备协议转换方法及基于该方法的灯杆运营平台 |
CN109857809A (zh) * | 2019-01-31 | 2019-06-07 | 浙江小泰科技有限公司 | 一种原始数据库数据同步到目标数据库的同步方法及系统 |
CN111046036A (zh) * | 2019-11-05 | 2020-04-21 | 深信服科技股份有限公司 | 数据同步方法、装置、系统及存储介质 |
CN111475510A (zh) * | 2020-04-03 | 2020-07-31 | 弦子科技(北京)有限公司 | 一种基于树状结构的数据同步方法、装置、系统及设备 |
CN111459945B (zh) * | 2020-04-07 | 2023-11-10 | 中科曙光(南京)计算技术有限公司 | 一种基于HBase的分层式索引查询方法 |
CN111930532B (zh) * | 2020-07-09 | 2023-11-17 | 智盈未来(西安)信息技术有限公司 | 航电数据集成方法及装置 |
CN112988706A (zh) * | 2021-03-09 | 2021-06-18 | 广州小鹏汽车科技有限公司 | 数据管理方法、装置以及电子控制器 |
CN113778764B (zh) * | 2021-08-24 | 2023-10-27 | 百融至信(北京)科技有限公司 | 一种hbase数据双活系统及方法 |
CN115794837B (zh) * | 2023-02-01 | 2023-06-23 | 天翼云科技有限公司 | 数据表的同步方法、系统和电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2001357285A (ja) * | 2000-06-12 | 2001-12-26 | Spa:Kk | 多店参加情報ウェヴサイトの運営方法およびシステム |
TW200945075A (en) * | 2008-04-22 | 2009-11-01 | Chunghwa Telecom Co Ltd | System for synchronizing heterogeneous data and method thereof |
CN103473334A (zh) * | 2013-09-18 | 2013-12-25 | 浙江中控技术股份有限公司 | 数据存储、查询方法及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9477708B2 (en) * | 2012-11-19 | 2016-10-25 | Nec Corporation | System for multi-store analytics execution environments with storage constraints |
-
2015
- 2015-03-27 CN CN201510137871.2A patent/CN104778225B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2001357285A (ja) * | 2000-06-12 | 2001-12-26 | Spa:Kk | 多店参加情報ウェヴサイトの運営方法およびシステム |
TW200945075A (en) * | 2008-04-22 | 2009-11-01 | Chunghwa Telecom Co Ltd | System for synchronizing heterogeneous data and method thereof |
CN103473334A (zh) * | 2013-09-18 | 2013-12-25 | 浙江中控技术股份有限公司 | 数据存储、查询方法及系统 |
Non-Patent Citations (2)
Title |
---|
bigtable: a distributed storage system for structured data;CHang F;《ACM transactions on computer systems》;20081231;全文 * |
面向复杂数据的对象存储系统;兰超等;《计算机科学与探索》;20131212;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN104778225A (zh) | 2015-07-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104778225B (zh) | 一种非结构化数据多存储系统中同步数据的方法 | |
CN111723160B (zh) | 一种多源异构增量数据同步方法及系统 | |
CN107038162B (zh) | 基于数据库日志的实时数据查询方法和系统 | |
CN109829009B (zh) | 可配置的异构数据实时同步并可视化的系统及方法 | |
CN107544984B (zh) | 一种数据处理的方法和装置 | |
CN109918349B (zh) | 日志处理方法、装置、存储介质和电子装置 | |
CN110209726A (zh) | 分布式数据库集群系统、数据同步方法及存储介质 | |
CN103235820B (zh) | 一种集群系统中数据存储方法与装置 | |
CN103488704B (zh) | 一种数据存储方法及装置 | |
CN109284334A (zh) | 实时数据库同步方法、装置、电子设备及存储介质 | |
CN105278373A (zh) | 一种变电站综合信息处理系统的实现方法 | |
CN107729366A (zh) | 一种普适多源异构大规模数据同步系统 | |
CN109063196A (zh) | 数据处理方法、装置、电子设备及计算机可读存储介质 | |
CN104111996A (zh) | 基于hadoop平台的医保门诊大数据抽取系统及方法 | |
CN110413690A (zh) | 数据库的数据同步方法、服务器、电子设备、存储介质 | |
CN106682213A (zh) | 基于Hadoop平台的物联网任务订制方法及系统 | |
CN107423422A (zh) | 基于网格的空间数据分布式存储及检索方法和系统 | |
CN104834700A (zh) | 一种基于轨迹变更的移动数据增量捕获方法 | |
CN104468274A (zh) | 一种集群监控管理方法及系统 | |
CN104281980A (zh) | 基于分布式计算的火力发电机组远程诊断方法及系统 | |
CN106339408A (zh) | 数据同步方法、数据同步装置和服务器 | |
CN102779160B (zh) | 海量数据信息索引系统和索引构建方法 | |
CN103761262A (zh) | 基于syslogd的重复日志控制方法 | |
CN107302569A (zh) | 一种面向云平台的安全监控数据采集与存储方法 | |
CN105787090A (zh) | 一种电力数据的olap系统的索引建立方法和系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |