如何实现一个跨库连表SQL生成器?

简介: 用户只需在前端简单配置下指标,系统即可自动生成大宽表,让用户查询到他所需要的实时数据,数据源支持跨库并支持多种目标介质。这样的数据全局实时可视化如何实现?本文从需求分析开始,分享自动生成SQL功能开发中运用到的设计模式和数据结构算法设计。

image.png

一 概述

ADC(Alibaba DChain Data Converger)项目的主要目的是做一套工具,用户在前端简单配置下指标后,就能在系统自动生成的大宽表里面查询到他所需要的实时数据,数据源支持跨库并支持多种目标介质。说的更高层次一点, 数据的全局实时可视化这个事情本身就是解决供应链数据“神龙效应”的有效措施(参考施云老师的《供应链架构师》[1]一书)。做ADC也是为了这个目标,整个ADC系统架构如下图所示:
image.png

架构解析:

  • 初始数据来自于元数据中心。
  • 经过元数据适配层后转换为内部格式数据。
  • 调度中心把内部格式的数据传到计划中心,计划中心分析数据需求并建模,通过SQL生成器生成资源和SQL,分别通过告警中心、对账中心设定监控标准和对账标准。
    • 对账中心定时对账,查看数据的对齐情况。
    • 告警中心可以针对任务错误、延迟高等情况发送报警。
  • 资源的生命周期管控在资源管理中心下,view删除时资源管理中心负责回收资源。
  • 基础资源适配层主要借助集团基础资源管理能力串联阿里各类数据服务, 比如阿里云MaxComputer、Flink、阿里云AnalyticDB等。

其中,SQL生成器的上游和下游主要涉及:

  • 上游计划中心
    • 配置指标:用户在前端配置他想看的数据有哪些。
    • 生产原始数据:根据用户输入得到哪些表作为数据源, 以及它们之间的连接关系。
  • 下游基础资源适配层适配器
  • 把SQL发布到Flink, 根据建表数据建物理表。

本文主要从技术角度介绍下SQL生成器相关的内容。

二 技术实现

在项目实施阶段,需要从需求分析、技术方案设计、测试联调几个步骤展开工作。本文重点不放在软件开发流程上, 而是就设计模式选择和数据结构算法设计做下重点讲解。

需求分析

在需求分析阶段, 我们明确了自动生成SQL模块所需要考虑的需求点, 主要包含如下几点:

  • 需要支持多个事实表(流表)、多个维度表连表,其中一个事实表是主表,其他的均为辅助表。
  • 维表变动也应当引起最终数据库更新。
  • 主表对辅助表为1:1或N1,也就是说主表的粒度是最细的, 辅表通过唯一键来和主表连接。
  • 流表中可能存在唯一键一致的多张流表, 需要通过全连接关联。唯一键不同的表之间通过左连接关联。
  • 只有连表和UDF,没有groupby操作。
  • 要求同步延时较小,支持多种源和目标介质。由于查询压力在目标介质,所以查询qps没有要求。

系统流程图

明确需求后, 我们把SQL生成器总体功能分为两块:

  • 同步生成SQL和建表数据
  • 异步发布SQL和建表

之所以把生成SQL阶段做成同步是因为同步阶段内存操作为主,如果发现数据有问题无法生成SQL能做到快速失败。发布阶段调用基础资源适配层需要同步等待较长时间, 每个发布步骤要做到有状态记录, 可回滚或者重试。所以异步实现。SQL生成器同步阶段的整体功能细化到小模块,如下图所示:

image.png

检查阶段

检查原始数据是否有问题, 无法生成SQL则快速失败。

  • 参数检查:检查上游是否提供了基本的参数, 比如事实表信息(可以没有维表, 但是必须有事实表)。
  • 表类型检查:检查数据来源类型是否支持。
  • 分区字段检查:是否提供了大宽表分区字段。
  • 连接约束:检查流表,维表连接信息是否正确。
  • 主表唯一性约束:检查主表是否含连接信息,唯一键是否有ETL信息。
  • 元数据检查:检查是否包含HBase配置信息。
  • 主键修正:修正维表连接键, 必须是维表的唯一键。

数据同步

  • 同步所有原始表和原始表的连接数据(比如源表同步进来, 生成1:1的HBase表)。
  • 生成优先级队列:生成连接和发布等任务的执行优先级。
  • 同步填充:填充源表对应的同步阶段HBase表数据,和对应的配置项, 类型转换(比如源表是MySQL表,字段类型要转换为HBase的类型), ETL填充, 添加消息队列(通过发送消息的方式通知下游节点运行)。
  • 重复列修剪:删除重复的列。
  • 空白列打标:对于满足一定条件(比如不需要在大宽表展示, 不是唯一键列, 连接键列, 保序列)的列打上空白列标识。
  • 保序字段填充:如果上游提供了表示数据创建时间的字段, 则用该字段作为数据保序字段, 没有则填充系统接收到数据的时间作为保序字段。

计算阶段

生成大宽表,填充SQL。

  • 中间表填充:填充全连接产生的中间表。
  • 连接关系升级:会在本文后面说明。
  • 反向索引填充:填充“反向索引”信息。
  • 消息填充:中间表添加消息队列(中间表更新可以触发下游节点)。
  • 大宽表填充:填充大宽表数据。
  • 连接链对齐:中间表和大宽表连接键对齐。
  • ETL填充:填充大宽表列的ETL信息。
  • 分区字段填充:填充大宽表分区字段。
  • SQL填充:填充Flink同步表映射SQL语句, Flink计算SQL语句, Flink结果表映射SQL语句。
  • 保存:把SQL和建表数据存入数据库, 之后的请求可以复用已有的数据, 避免重复建表。

异步发布阶段会把SQL语句发布到Flink。

添加反向索引的原因

假如有A、B两表连接,那么连接方式为A表的非主键连接B表主键。从时序上来说可能有以下三种情况:

  • B表数据先于A表数据多天产生
  • B表数据后于A表数据多天产生
  • B表数据和A表数据同时产生

下面我们就这三种情况逐一分析。

场景1:B表数据先于A表数据多天产生

我们假如B表数据存储于某个支持高qps的数据库内,我们可以直接让A表数据到来时直接连接此表(维表)来实现连表。

场景2:B表数据后于A表数据多天产生

这种场景比较麻烦。A表数据先行产生,因此过早的落库,导致B表数据到来时即使连接B维表也拿不到数据。这种场景还有一个类似的场景:如果AB连接完成后B发生了更新,如何让B的更新体现在宽表中?

为了解决这种问题,我们增加了一个“反向索引表”。假如A的主键是id,连接键是ext_id,那么我们可以将ext_id和id的值存储在一张表内,当B的数据更新时,用B的主键连接这种表的ext_id字段,拉取到所有的A表id字段,并将A表id字段重新流入Flink。

三 设计模式

对系统整体流程有了解以后, 我们再来看看系统的设计模式选择,选择设计模式时,我们考虑到数据处理相关的开发工作存在一些共性:

  • 拆解后小功能多
  • 小功能存在复用情况
  • 小功能执行有严格的先后顺序
  • 需要记录小功能运行状态, 流程执行可回滚或者中断可恢复执行

由于数据处理任务的步奏比较冗长,而且由于每个阶段的结果与下阶段的执行有关系,又不能分开。

参考 PipeLine(流水线)设计模式[2],综合考虑后我们系统的整体设计如下图所示:

image.png

首先有一个全局的PipeLineContainer管理多个pipeLine和pipeline context, 每个pipeline可独立执行一个任务, 比如pipeline1执行同步生成sql任务。pipeline2执行异步发布任务。发布必须在生成SQL结束后执行, pipeline有状态并且按一定顺序串联。每个pipeline包含多个可重用的valve(功能)。valve可以重用, 任意组合,方便完成更多的数据处理任务(比如以后如果要支持Tisplus dump平台接入, 则简单拼接现有的valve就可以)。

四 数据结构和算法

问题说明

SQL生成器关键点, 就是把各个表(Meta节点)之间的关系表示出来。Meta之间的关系分为两类,分别是全连接关联和左连接关联(因为左连接关联涉及到数据的时序问题, 需要添加反向索引较为复杂, 所以和全连接区分了一下, 为了简化问题我们先执行全连接, 再执行左连接)。

我们要解决的问题是, 多个数据源同步数据进来之后, 按一定的优先级关联, 最终得到一个大宽表并需要自动发布。抽象到数据结构层面就是:

  • 每个同步进来的数据源对应一个叶子节点
  • 节点之间有关联关系,关联关系有多类并有执行优先级
  • 所有节点和关联关系组成一棵树
  • 最终得到一个根节点(大宽表)并发布

算法思路

下面说明下解决该问题的算法思路。

优先级队列

因为叶子节点之间连接执行优先级不同,先放入优先级队列。之后每次取出高优先级任务执行。相同优先级任务可以复用, 连续执行多次。优先级队列示意图如下:

image.png

构建树

有了优先级队列的概念, 我们来构建树。构建主要分以下步骤:

1.首先得到四种优先级的任务, 优先级从高到低分别为:

  • 优先级1, 六个节点的同步任务
  • 优先级2,节点1、2、3和节点4、5的Full Join任务
  • 优先级3,节点1、4和节点6的Left Join任务
  • 优先级4, 发布任务

2.取优先级1的任务执行,同步进来六个数据源对应六个叶子。

3.取优先级2的任务并执行得到中间表1,2。

4.取优先级3的任务并执行,发现节点1、4有父节点, 则执行中间节点1、2分别和节点6 Left Join得到根节点。

5.取优先级4的任务并执行,发布根节点。

image.png

可以看到最终的数据结构是一棵树, 通过这种方式我们能支持复杂sql的自动构建。进一步抽象, 这种“一个队列驱动一棵树生成”的模式可以解决一类问题:

  • 问题的解决由一系列不同优先级的任务组成, 任务需要复用。
  • 通过从队列取优先级高的任务的方式构建任务关系树。
  • 最后遍历树完成各个节点任务。

五 总结

限于篇幅, 本文重点在于介绍自动生成sql功能开发中运用到的主要数据结构和设计模式思想。

目前我们实现了任意张表关联sql自动生成并发布, 整体延迟控制在2s以内。之后SQL生成器主要会针对方便接入更多第三方实时计算平台(比如Tisplus), 降低整体系统延迟工作展开。方便接入主要考验的是架构的设计, 也是本文着重写的点(包括数据结构和算法设计、设计模式的选择)。降低系统延迟则包括消息中间件优化,代码执行效率提升等。

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

plsql 设置字体+工具栏图标大小调整

文章目录1. 字体设置2. 工具图标大小1. 字体设置 字体(微软雅黑)大小(10号)就可以 各种字体调整 2. 工具图标大小

云原生时代老牌IDC巨头谋求转型,世纪互联成立新品牌“互联科技(NEOLINK)”

编辑 | 宋慧 出品 | CSDN云计算 头图 | 世纪互联全新子品牌战略发布会现场图 4月28日,世纪互联举行2021新品牌战略发布会,正式发布全新子品牌“互联科技”(NEOLINK)。此次世纪互联整合集团内新零售及第一线事业群、成立新基建IDC…

No binding operation info while invoking unknown method with params unknown 异常解决

浏览器中访问WebService,返回异常, 是由于访问地址缺少wsdl后缀

如何管理越来越多的 operator?OLM 给你答案

简介: OLM(Operator Lifecycle Manager) 作为 Operator Framework 的一部分,可以帮助用户进行 Operator 的自动安装,升级及其生命周期的管理。同时 OLM 自身也是以 Operator 的形式进行安装部署。本文我们将来了解一下 OLM 的基本架构和安装使…

兴趣标签体系告诉我,闲鱼的95后是这样的...

作者:闲鱼技术-兆晗 背景与挑战 — — "水果糖小椿 M39 暂挂" — — "列表科幻?" 不知大家能否读懂上面的对话,但在闲鱼,这样的对话每天都在发生。数据显示,闲鱼约30%的用户年龄不满25岁。了解这…

搭建Redis集群遇到的问题:Waiting for the cluster to join~~~

问题: 搭建Redis集群的过程中,执行到cluster create : … 的时候,发现程序发生阻塞,显示:Waiting for the cluster to join 的字样,然后就无休无尽的等待… 遇到这种情况大部分是因为集群总线的端口没有开…

英特尔助力完善AI人才培养,携手微软共促地球可持续发展

2021年4月22日,英特尔于第52个世界地球日期间举办了主题为“为企业寻良将,为人才筑舞台”的网络研讨会,旨在探讨高科技企业如何聚焦AI技术,赋能人才发展,为企业引荐人才,为人才提供机会,来共建美…

云原生除了K8S、微服务,还有...?

来源 | 无敌码农责编 | 寇雪芹头图 | 下载于视觉中国云原生(Cloud Native)是最近技术圈一个比较火的名词,相信大家或多或少都听说过。不过对于大多数普通研发朋友来说,"云原生"这个词多少可能还是有些陌生,以至于刚开始听到这个词时…

Service Mesh 在超大规模场景下的落地挑战

简介: 在实际落地方面,众多企业都在积极探索 Service Mesh 在大规模场景下的应用。 作者 | 至简,阿里云高级技术专家 随着微服务软件架构在互联网企业的广泛实践,新一代微服务软件架构技术悄然兴起, Service Mesh 便是…

一针一线皆关“云” 报喜鸟以匠心融合科技

简介: 为了持续增强品牌竞争力,更好地实现数据有效管理,在数据爆发式增长时能够弹性、及时扩容,作为行业领军者的报喜鸟决定融入云计算的大潮中,而将原有业务高效、平滑地迁移至云端就理所当然地成为整个环节中非常关键…

“一云多芯、三V一体” 麒麟信安云融合虚拟化方案助力信创轻松上云

“上云是常态,不上云是例外”。国际上IT架构已从“计算机网络”向“云端”演进,云计算技术的蓬勃发展为整个IT行业带来了巨大变革。据专家观点,到2023年,中国政府和大型企业上云率将超过60%,全栈自主可控云将成为政府和…

海量结构化数据解决方案-表格存储场景解读

简介: 数据是驱动业务创新的最核心的资产。不同类型的数据如非结构化数据(视频、图片等)、结构化数据(订单、轨迹),面向不同业务的使用要求需要选择适合的存储引擎,能够真正发挥数据的价值。针对…

​谁是信创担当 《2021中国信创生态市场研究报告》今日正式发布

1986年3月,我国启动国家高技术研究发展计划——863计划,我国坚持走信息技术应用自主创新之路,全面拉开序幕。 三十五年来,我国加强自主创新,并在民用实践中不断提升产品及技术可用性,实现从小范围推动到“…

戏说云栖,如果这些名人参加云栖大会。。。

导语:参加云栖大会是怎样一种体验?当人们在谈云栖大会时,到底在聊什么?如果这些名人参加云栖大会,他们是不是这样想? 看你脑洞清奇,是万中无一的创意奇才~你就是评论区最皮的仔! 上…

如果故障选择了你……

简介: 总以为混沌工程离你很远?但发生故障的那一刻不是由你来选择的,而是那一刻来选择你,你能做的就是为之做好准备。混沌工程在阿里内部已经应用多年,而ChaosBlade这个开源项目是阿里多年来通过注入故障来对抗故障的经…

存储基础:磁盘 IO 为什么总叫你对齐?

‍‍来源 | 奇伢云存储头图 | 下载于ICphoto存储 IO 重要的一个知识点划重点:存储 IO 要对齐。资深存储人员为啥总叫你注意 IO 对齐的?机械磁盘 IO 为什么要 512 对齐呢,SSD 盘为啥要 4K 对齐?不对齐又会如何?重要的知…

如何理解这6种常见设计模式?

简介: 设计模式能够帮助我们优化代码结构,让代码更优雅灵活。有哪些常见的设计模式?如何合理运用?本文分享作者对工厂模式、单例模式、装饰模式、策略模式、代理模式和观察者模式的理解,介绍每种模式的模式结构、优缺点…

构建在线教育弹性高可用视频处理架构实战

简介: 对于负责建设视频处理系统的技术团队而言,这样的业务场景就留给了他们一系列的挑战。 前言 近些年,在线教育行业飞速发展,为整个社会的知识传播提供了前所未有的便利性。通过多种形式的在线教育平台,学员与教师…

一文解开java中字符串编码的小秘密

简介: 在本文中你将了解到Unicode和UTF-8,UTF-16,UTF-32的关系,同时你还会了解变种UTF-8,并且探讨一下UTF-8和变种UTF-8在java中的应用。 简介 在本文中你将了解到Unicode和UTF-8,UTF-16,UTF-32的关系,同时你还会了解变种UTF-8&…

Gartner数据劲爆:阿里全球第三,华为中国第二!

看了一份数据,非常振奋人心,给大家分享一下。国外著名信息分析公司 Gartner,4月21号发布了一份数据,瞬间引发了朋友圈是刷屏。这份数据是讲什么的呢?云计算!可能由于疫情,很多公司上云的热情变得…