背景
DataX是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
图数据库是属于newsql/nosql, 近几年比较火热的数据库类型,广泛用于金融风控,社交,制造等领域
《datax关系/图数据插件设计说明书》介绍关系/图转换插件,该插件属于数据同构同步,模型一致,属性名称一致,优点是自动化高,不用多大干预,适合生成中间数据,特别是,关系数据库系统与图数据库系统不在同一网段,网络不稳定,同步尽量简单显得很重要
然而,实际的情况是,目标数据模式设计与源数据不同,包括模型和规范,这时候需要高度可配置的转换组件,基于规则的转换(RBT)组件为此而开发,使用规则改造和构建record,提供高度可配置的同时,不失通用性
因此,关系/图转换插件和基于规则的转换(RBT)组件两者互为补充,前者负责不同系统群,网段间大批量数据同步,后者负责数据分发,异构转换
参考和术语
RBT 基于规则的转换
Neo4j Driver record/Datax record 本文有两个Record, 一个是neo4j驱动查询返回集,一个是datax传递数据,注意区分
ETL Extract-Transform-Load的缩写, 数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端
图数据库 neo4j,tiger graph,nebula graph
datax原理介绍编辑
*官方图,Transport处是Channel,本人觉得不太准确,应为Transport
> 作业分解为任务,任务分组,最后调度器调度任务(组)
*作业分片和任务分组没有在高可用中
> 调度器负责分派资源执行任务(组),TaskEecutor执行任务
> transport包括数据交换(exchanger),数据转换(transformer),交换数据字节数/记录数的统计(channel)
技术架构
与rdb2graph相似,分两个阶段同步,节点节点/关系阶段,调度引擎驱动
模式 生成图模式,图模式属性列表保证record列顺序
*datax核心理念星型结构,reader和writer可以切换,导致record非常简单,只有属性值,没有key,因此reader和writer读写需自行保证顺序一致
Datax 没有集成spring/springboot,源dao和图dao的切换使用SPI机制(TBD)
xql/规则 两者作用有重叠,xql使用数据库自身的方法步处理字段,规则认为处理功能强大,但需配置脚本
数据处理架构:
Reader 源dao 源数据读取,xql查询语句,使用SPI载入不同的dao实现不同类型数据源的切换
Wrirer 源dao生成Record,调用转换规则,转换规则链式执行,输出新的record
GraphDao 接受Record,写入目标数据库
转换设计
界面原型很好的展示转换的设计
> 左:目标图模型的节点/关系 可以用户输入,也支持使用图schema生成,整个图模型关联同步作业
> 右:规则内置工具类, 规则通过别名,如 su,nu引用
> 中:转换设置,xql源数据的查询语句;转换规则
阶段xql,需要固定字段,_origId,返回源数据库Id,用于构建关系
关系xql,需有两个系统字段"_fromId"和"_toId"规定返回from/to节点的id
规则针对record,可以修改recored和column
对应的转换模型:
RbTransformer没有继承datax的Transformer,主要考虑独立性,不绑定任何ETL
图数据库扫描
扫描组件负责扫描图数据模式
图数据模式是free的,通过获取数据,分析数据构建schema,并且尽可能获取全面
*扫描schema不一定正确,例如,最多属性的节点不一定包括所有的属性,这种情况需要后期人工干预
图schema模型:
datax读写插件
图转换是RBT组件的应用,插件实现比较简单,这里不介绍
工程介绍
web 控制管理台后端,支持构建转换UI
record 继承datax record
rb-transformer 基于规则转换组件,内含规则组件
reader/writer datax读写插件
源码
基于规则的转换组件,用于datax转换-Java文档类资源-CSDN文库
示例
介绍如何使用RBT组件,展示效果
示例场景
模型映射场景 rental+payment 合成 trade节点,相应地,关系变更
字段更名场景 字段格式 下杆 改为 驼峰
值变更场景 staff.email 修改为 jwis.cn域 测试
datax record变更场景 合并rental和payment的last_update,取最近的
扫描/序列化图schema
前面介绍,图schema用于保证datax record读写顺序,类型识别
目前支持序列化存储于xml
形态与转换设置一致
转换配置
以trade为示例,转换(Transform)由两部分组成,xql/规则
规则语法类似js脚本,可引用工具类处理column
效果
蓝色的是trade
trade 聚合了rental和payment的属性;属性驼峰格式;_origId是源payment的Id,用于构建关系;lastUpdate是源有rental和payment 较大的lastUpdate
源模型rental和payment聚合而成,源有的rental和customer关系,payment和customer关系指向trade
附录
规则引擎组件
规则引擎使用apache commons的jexl的JexlScript,支持if,else等控制操作符
neo4j record解释组件
RBT使用neo4j Driver,Record类作为查找返回结果集,Record是多类型集合聚合类,为了方便使用,需要开发组件解释Record,抓取数据
RecordReader
支持单例列表,多列列表,投射查询等多种返回形态,使用模板技术直接返回具体类型
调用者具体化返回类型
neo4j 分页组件
大规模数据同步,需使用分页读取数据,neo4j cql关键字skip/limit支持分页
分页使用neo4j的skip/limit,当返回小于limit认为到最后一页
调用者使用迭代方式,手动翻页
网友评论