datax关系数据库插件设计和实现解释

背景

     DataX是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQLOracle)HDFSHiveODPSHBaseFTP等各种异构数据源之间稳定高效的数据同步功能。解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。

   《SETL基于规则的转换组件设计说明书.docx》介绍了RBT组件的设计,以及基于RBT的关系/图转换实现,本文介绍基于RBT的关系数据插件,datax自带关系数据库插件,相比较本组件有以下特性:

  • rbt组件

        转换配置,以写入库为目标,配置数据查询和规则,配置支持序列化为xml/json

        转换配置支持配置中心,zookeepernacos,数据库等,可扩展框架

       支持基于规则的转换,规则修改和新建 column/record

       db scanner,扫描生成数据库schema,包括表结构和约束

  • 两阶段转换,支持数据转换和关系的转换
  • insert/upsert模式
  • setl-data组件,无缝切换不同的数据库

参考和术语

RBT 基于规则的转换

ETL Extract-Transform-Load的缩写, 数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端

关系数据库 oracle,sqlserver,pgsql,mysql

datax原理介绍

*官方图,Transport处是Channel,本人觉得不太准确,应为Transport

> 作业分解为任务,任务分组,最后调度器调度任务(组)

*作业分片和任务分组没有在高可用中

> 调度器负责分派资源执行任务(组),TaskEecutor执行任务

> transport包括数据交换(exchanger),数据转换(transformer),交换数据字节数/记录数的统计(channel)

setl

下图介绍setl功能架构

rb-transformer 转换组件

setl-data 类似springboot-data的组件,无缝切换不同的数据库访问

setl-rbt datax插件,目前支持neo4j和jdbc

setl-cdc 基于debezium的流式数据同步组件

scanner schema扫描器组件,生成数据库schema,包括表结构和约束

配置中心  转换配置中心,支持zk,nacos,数据库,支持扩展

checkpoint (TBD) 检查点,记录channel内处理点,故障恢复的手段,目前实现了mq channel,借助mq的消息状态实现故障恢复

分布式 分布式datax,可参看《分布式SETL详细(落地)设计说明书》

技术架构

过程分两个阶段同步,行数据和关系

sql/规则 sql查询数据,依托数据库也有强大的数据处理能力;规则强大的自定义处理能力

数据架构:

  • 源dao  使用setl-data组件,源数据读取,sql/jpql,SPI机制,支持mysql,oracle,pgsql等,支持扩展
  • Record  源dao读取数据,构建Record,调用转换规则,转换规则链式执行,输出新的Record
  • 目标Dao  接收Record,构建insert/upsert/关系查询,执行写入目标数据库

 转换设计

> 左:以目标库数据/关系构建转换,每转换项有xql和规则设置

> 中:转换设置,sql是源数据的查询,以写入库数据和关系为目标;

    转换规则,编写基于规则的转换,类似UDF

> 右:规则内置工具类, 通过别名调用,如 su, nu引用,可以修改record和column

下图是转换设计

关系数据库扫描

扫描组件负责扫描数据库模式,包括表字段和约束

关系schema模型

jdbc读写插件

rdb转换是基于RBT组件的应用,这里介绍一下数据insert/upsert设计,外键插入的设计

insert/upsert设计

上图是pg的insert/upsert sql模板,写入器根据目标库schema构建inert/upsert语句

外键插入

下图插入关系的sql模板

下图是外键转换配置,key分3段,分别是关系的两端,第三段是key名称

_fromId,to_Id对应数据转换时插入的_origId,用于在目标库找到原有关系

写入器读取schema的外键关系,填入模板构造上图的update语句,完成外键插入

示例

本节介绍RBT-关系数据库组件使用

示例场景

场景使用sakila库,mysq到pgsql,为了场景覆盖,修改目标库,演示异构转换

数据/关系转换场景  rental+payment 合成 trade节点,相应地,关系变更 

规则转换场景  合并rental和payment的last_update,取最新的的,这里只是示例规则,实际使用case when实现更方便

下图是目标模式

trade表合并了rental和payment,两表的外键关系连接到新的trade表,其中与staff有两个外键关系,payment_staff_id, rental_staff_id,对应原有rental和payment与staff的连接;customer关系保留原payment

扫描目标库rdb schema

组件提供rdb scanner工具,扫描关系数据库schema,并序列化存储于xml或json

上图是xml格式的schema,包括外键(fks),关系构建依赖外键定义

转换配置

以trade为示例,转换(Transform)由两部分组成,数据转换和关系转换,每个转换也有两部分,sql和规则

规则语法类似js脚本,可引用工具类处理record和column

上图是trade的转换配置,包括查询配置和规则的配置

上图是关系的转换配置,每个关系转换(rtransform)对应一个外键关系

效果

数据传输

trade 交易表,聚合了rental和payment的属性,trade_id是数据库自动生成的新的id,_origId是源payment的Id,用于构建关系和溯源;lastUpdate是源有rental和payment 较新的lastUpdate

外键关系字段为空,等待关系转换插入

关系传输

下图是执行了staff两个外键转换的效果

sakila示例库有两个staff数据,业务上表示两个职员

NEXT

       本组件数据写入(writer)需要数据库屏蔽约束,若数据库不能满足屏蔽约束的要求,可以使用如下思路

  • 构建表拓扑图,确定表的依赖关系
  • 遍历表拓扑,拉取数据,特别地,若拓扑存在循环,需整个循环拉取写入,然后转换关系
  • 写入数据前增加会话级别的约束屏蔽,写入后还原

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

中间件XL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值