当前位置: 首页 > 科技观察

如何实现用于跨数据库连接表的SQL生成器?

时间:2023-03-20 01:41:49 科技观察

用户只需在前端简单配置指标,系统即可自动生成大宽表,方便用户查询所需的实时数据。数据源支持跨数据库,支持多种目标媒体。如何实现数据的这种全局实时可视化?本文从需求分析入手,分享SQL函数自动生成开发中使用的设计模式和数据结构算法设计。一、概述ADC(AlibabaDChainDataConverger)项目的主要目的是做一套工具。用户在前端简单配置好指标后,就可以在系统自动生成的宽表中查询到自己需要的实时数据。数据源支持跨库,支持多目标媒体。在更高的层次上,数据的全局实时可视化本身就是解决供应链数据“龙效应”的有效措施(参考史云老师的书《供应链架构师》[1])。做ADC也是为了这个目标。整个ADC系统架构如下图所示:架构分析:初始数据来自元数据中心。经过元数据适配层后,转换为内部格式数据。调度中心将内部格式的数据传输给计划中心,计划中心分析数据需求和模型,通过SQL生成器生成资源和SQL,并分别通过告警中心和对账中心设置监控标准和对账标准。对账中心定期进行对账,检查数据的对齐情况。告警中心可以对任务错误、高延迟等发出告警。资源生命周期由资源管理中心控制,资源管理中心负责在视图被删除时回收资源。基础资源适配层主要是利用集团的基础资源管理能力,对接阿里云MaxComputer、Flink、阿里云AnalyticDB等阿里各种数据服务。其中,SQL生成器的上下游主要涉及:上游规划中心配置指标:用户在前端配置自己想看的数据。原始数据制作:根据用户输入获取哪些表作为数据源,以及它们之间的连接关系。下游MetricAdapter将SQL发布到Flink,并根据表数据构建物理表。本文主要从技术角度介绍SQL生成器相关内容。2、技术实现在项目实施阶段,需要分需求分析、技术方案设计、测试联调等几个步骤进行工作。本文的重点不是软件开发过程,而是设计模式的选择和数据结构算法的设计。需求分析在需求分析阶段,我们明确了自动生成SQL模块需要考虑的需求,主要包括以下几点:需要支持多事实表(流表)和多维度表。其中一张事实表是主表,其他的是辅助表。维表更改也应该导致最终的数据库更新。主表和副表是1:1或者N1,也就是说主表的粒度是最细的,副表和主表通过唯一键连接。流表中可能存在多个具有相同唯一键的流表,需要通过全连接进行关联。具有不同唯一键的表通过左连接关联。只有链接表和UDF,没有groupby操作。要求同步延迟小,支持多源多目标媒体。由于查询压力在目标介质上,所以对查询qps没有要求。系统流程图明确需求后,我们把SQL生成器的整体功能分为两部分:同步生成SQL和建表数据异步发布SQL和建表之所以把SQL生成阶段做成同步,是因为同步阶段是以内存操作为主。如果发现数据有问题,不能生成SQL,可以failfast。发布阶段调用Metrics需要同步等待很长时间,每个发布步骤都要记录一个状态,可以回滚或者重试。所以它是异步实现的。SQL生成器同步阶段的整体功能细分为小模块,如下图所示:check阶段检查原始数据是否有问题,如果无法生成SQL则迅速失败。参数检查:检查上游是否提供基本参数,如事实表信息(可以没有维表,但必须有事实表)。表类型检查:检查数据源类型是否支持。分区字段检查:是否提供了大而宽的表分区字段。连接约束:检查流表和维表连接信息是否正确。主表唯一约束:检查主表是否包含连接信息,唯一键是否有ETL信息。元数据检查:检查是否包含HBase配置信息。修改主键:修改维表的连接键,必须是维表的唯一键。数据同步同步所有原表和原表的连接数据(比如同步源表生成1:1的HBase表)。生成优先级队列:生成连接、发布等任务的执行优先级。同步填充:填充源表同步阶段对应的HBase表数据,以及对应的配置项,类型转换(比如源表是MySQL表,字段类型需要转换成HBase类型),ETL填充,添加消息队列(通过发送消息的方式通知下游节点运行)。重复列修剪:删除重复列。空白列标记:为满足一定条件的列(例如不需要在大宽度表格中显示、不是唯一键列、连接键列、保证列)标记空白列。保序字段填写:如果上游提供了表示数据创建时间的字段,则将该字段作为保序字段,或者填写系统收到数据的时间作为保序字段。在计算阶段,生成大表和宽表,并用SQL填充。中间表填充:填充全连接生成的中间表。连接关系升级:本文后面会讲解。InverseIndexPopulation:填写“InverseIndex”信息。消息填充:中间表增加消息队列(中间表更新可以触发下游节点)。大宽表填充:填充大宽表的数据。连接链对齐:中间表和大宽表的连接键对齐。ETL填充:填充大表列和宽表列的ETL信息。PartitionFieldPadding:填充大表和宽表的分区字段。SQL填充:填充Flink同步表映射SQL语句、Flink计算SQL语句、Flink结果表映射SQL语句。保存:将SQL和建表数据保存到数据库中,已有数据可以在后续请求中复用,避免重复建表。异步发布阶段会将SQL语句发布到Flink。加倒排索引的原因如果A表和B表之间有连接,那么连接的方式就是把A表的非主键连接到B表的主键上。从时间序列上来说,可能有以下三种情况:B表数据先于A表数据生成几天,B表和A表数据同时生成在A表数据之后几天。让我们对这三种情况一一讨论分析。场景一:B表的数据比A表的数据早几天生成,如果B表的数据存放在支持高qps的数据库中,我们可以直接连接这张表(维表),当表中的数据一个到达。表面。场景二:A表的数据是在B表的数据生成之后很多天比较麻烦的,A表的数据是先生成的,所以过早的落入数据库,所以当B表的数据生成的时候到了,即使连上了B维表,也拿不到数据。这个场景有类似的场景:如果在AB连接完成后更新B,如何让B的更新体现在宽表上?为了解决这个问题,我们增加了一个“倒排索引表”。如果A的主键是id,连接键是ext_id,那么我们可以把ext_id和id的值存到一个表中。当B的数据有更新时,将这张表的ext_id字段与B的主键连接起来,拉取到所有A表的id字段,将A表的id字段回流到Flink中。三种设计模式了解了系统的整体流程之后,我们来看一下系统设计模式的选择。在选择设计模式时,我们考虑到在数据处理相关的开发工作中有一些共性:反汇编后,小函数和很多小函数被复用。小函数执行有严格的顺序,需要记录小函数的运行状态。流程执行可以回滚或中断以恢复执行。因为数据处理任务的步骤比较冗长,又因为每个阶段的结果都与下一阶段的执行相关,不可分割。参考PipeLine(管道)设计模式[2],我们系统综合考虑后的整体设计如下图所示:首先,有一个全局的PipeLineContainer管理着多个pipeLine和pipelinecontext,每个pipeline可以独立执行一个任务,比如pipeline1执行同步生成sql任务。pipeline2执行异步发布任务。发布必须在生成SQL后执行,管道是有状态的,按照一定的顺序连接。每个管道包含多个可重复使用的阀门(功能)。Valve可以重复使用,任意组合,方便完成更多的数据处理任务(比如以后要支持Tisplus转储平台接入,可以简单地拼接已有的Valve)。4数据结构与算法问题讲解SQL生成器的重点,就是表达各个表(Meta节点)之间的关系。Meta之间的关系分为两类,即全连接关联和左连接关联(因为左连接关联涉及到数据的时序,加上反向索引会比较复杂,所以和全连接区别开来,为了简化问题我们首先执行全连接,然后执行左连接)。我们要解决的问题是,多个数据源的同步数据进来后,按照一定的优先级进行关联,最终得到一个大宽表,需要自动发布。抽象到数据结构层面:每个同步数据源对应一个叶子节点,节点之间存在关联。有多种类型的关联和执行优先级。所有节点和关联组成一棵树,最终得到一个根节点(Largewidetable)并发布算法思想。下面解释一下解决这个问题的算法思路。优先级队列因为叶子节点之间连接的执行优先级不同,所以先放入优先级队列。之后每次都取出高优先级的任务执行。具有相同优先级的任务可以重复使用并连续执行多次。优先队列的示意图如下:建树有了优先队列的概念,我们来建一棵树。构建主要分为以下几个步骤:首先获取四个优先级任务,优先级从高到低依次为:节点1、2、3和节点4、5的六个节点的优先级1、同步任务优先级2。FullJoin任务的优先级为3,节点1、4、6的LeftJoin任务的优先级为4,发布任务以优先级为1的任务执行。同步的6个数据源分别对应六片叶子。拿优先级2的任务执行,得到中间表1、2。拿优先级3的任务执行。如果发现节点1和4有父节点,则分别执行中间节点1和2和节点6LeftJoin得到根节点。取优先级为4的任务执行,发布根节点。可以看出最终的数据结构是一棵树,这样我们就可以支持复杂SQL的自动构建。进一步抽象,这种“一个队列驱动一棵树生成”的模式可以解决一类问题:问题的解决方案由一系列不同优先级的任务组成,这些任务需要被重用。从队列中取出优先级高的任务,构建任务关系树。最后遍历树完成每个节点的任务。五、小结限于篇幅,本文着重介绍自动生成sql函数开发中使用的主要数据结构和设计模式。目前我们已经实现了任意表关联SQL的自动生成和发布,整体延迟控制在2s以内。之后,SQL生成器将主要侧重于方便接入更多第三方实时计算平台(如Tisplus),降低系统整体延迟。便捷接入主要考验的是架构的设计,这也是本文的重点(包括数据结构和算法设计,以及设计模式的选择)。降低系统延迟包括优化消息中间件和提高代码执行效率。最后,阿里巴巴供应链国际化团队欢迎有识之士加盟,共同打造东半球零售业首选的国际化供应链平台。有意者请联系:pengcheng.wang@alibaba-inc.com相关链接[1]https://book.douban.com/subject/26995807/[2]https://blog.csdn.net/buyoufa/article/详情/51912262【本文为《阿里巴巴官方技术》专栏作者原创稿件,转载请联系原作者】点此查看该作者更多好文