datax基于规则转换+关系/图(neo4j)异构同步设计与实现(附源码)

背景

DataX是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQLOracle)HDFSHiveODPSHBaseFTP等各种异构数据源之间稳定高效的数据同步功能。解决异构数据源同步问题,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)

技术架构

分两个阶段同步,节点阶段/关系阶段,调度引擎驱动

模式 生成图模式,图模式属性列表保证record列顺序,识别类型

*datax核心理念星型结构,readerwriter可以切换,导致record非常简单,只有属性值,没有key,因此readerwriter读写需自行保证顺序一致

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认为到最后一页

调用者使用迭代方式,手动翻页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中间件XL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值