简介: 用户只需在前端简单配置下指标,系统便可自动生成大宽表,让用户查询到他所须要的实时数据,数据源支持跨库并支持多种目标介质。这样的数据全局实时可视化如何实现?本文从需求分析开始,分享自动生成SQL功能开发中运用到的设计模式和数据结构算法设计。前端
一 概述
ADC(Alibaba DChain Data Converger)项目的主要目的是作一套工具,用户在前端简单配置下指标后,就能在系统自动生成的大宽表里面查询到他所须要的实时数据,数据源支持跨库并支持多种目标介质。说的更高层次一点, 数据的全局实时可视化这个事情自己就是解决供应链数据“神龙效应”的有效措施(参考施云老师的《供应链架构师》[1]一书)。作ADC也是为了这个目标,整个ADC系统架构以下图所示:
算法
架构解析:sql
- 初始数据来自于元数据中心。
- 通过元数据适配层后转换为内部格式数据。
- 调度中心把内部格式的数据传到计划中心,计划中心分析数据需求并建模,经过SQL生成器生成资源和SQL,分别经过告警中心、对帐中心设定监控标准和对帐标准。
-
- 对帐中心定时对帐,查看数据的对齐状况。
-
- 告警中心能够针对任务错误、延迟高等状况发送报警。
- 资源的生命周期管控在资源管理中心下,view删除时资源管理中心负责回收资源。
- 基础资源适配层主要借助集团基础资源管理能力串联阿里各种数据服务, 好比阿里云MaxComputer、Flink、阿里云AnalyticDB等。
其中,SQL生成器的上游和下游主要涉及:数据库
- 上游计划中心
-
- 配置指标:用户在前端配置他想看的数据有哪些。
-
- 生产原始数据:根据用户输入获得哪些表做为数据源, 以及它们之间的链接关系。
- 下游基础资源适配层适配器
- 把SQL发布到Flink, 根据建表数据建物理表。
本文主要从技术角度介绍下SQL生成器相关的内容。设计模式
二 技术实现
在项目实施阶段,须要从需求分析、技术方案设计、测试联调几个步骤展开工做。本文重点不放在软件开发流程上, 而是就设计模式选择和数据结构算法设计作下重点讲解。数据结构
需求分析架构
在需求分析阶段, 咱们明确了自动生成SQL模块所须要考虑的需求点, 主要包含以下几点:并发
- 须要支持多个事实表(流表)、多个维度表连表,其中一个事实表是主表,其余的均为辅助表。
- 维表变更也应当引发最终数据库更新。
- 主表对辅助表为1:1或N1,也就是说主表的粒度是最细的, 辅表经过惟一键来和主表链接。
- 流表中可能存在惟一键一致的多张流表, 须要经过全链接关联。惟一键不一样的表之间经过左链接关联。
- 只有连表和UDF,没有groupby操做。
- 要求同步延时较小,支持多种源和目标介质。因为查询压力在目标介质,因此查询qps没有要求。
系统流程图异步
明确需求后, 咱们把SQL生成器整体功能分为两块:数据结构和算法
- 同步生成SQL和建表数据
- 异步发布SQL和建表
之因此把生成SQL阶段作成同步是由于同步阶段内存操做为主,若是发现数据有问题没法生成SQL能作到快速失败。发布阶段调用基础资源适配层须要同步等待较长时间, 每一个发布步骤要作到有状态记录, 可回滚或者重试。因此异步实现。SQL生成器同步阶段的总体功能细化到小模块,以下图所示:
检查阶段
检查原始数据是否有问题, 没法生成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],综合考虑后咱们系统的总体设计以下图所示:
首先有一个全局的PipeLineContainer管理多个pipeLine和pipeline context, 每一个pipeline可独立执行一个任务, 好比pipeline1执行同步生成sql任务。pipeline2执行异步发布任务。发布必须在生成SQL结束后执行, pipeline有状态而且按必定顺序串联。每一个pipeline包含多个可重用的valve(功能)。valve能够重用, 任意组合,方便完成更多的数据处理任务(好比之后若是要支持Tisplus dump平台接入, 则简单拼接现有的valve就能够)。
四 数据结构和算法
问题说明
SQL生成器关键点, 就是把各个表(Meta节点)之间的关系表示出来。Meta之间的关系分为两类,分别是全链接关联和左链接关联(由于左链接关联涉及到数据的时序问题, 须要添加反向索引较为复杂, 因此和全链接区分了一下, 为了简化问题咱们先执行全链接, 再执行左链接)。
咱们要解决的问题是, 多个数据源同步数据进来以后, 按必定的优先级关联, 最终获得一个大宽表并须要自动发布。抽象到数据结构层面就是:
- 每一个同步进来的数据源对应一个叶子节点
- 节点之间有关联关系,关联关系有多类并有执行优先级
- 全部节点和关联关系组成一棵树
- 最终获得一个根节点(大宽表)并发布
算法思路
下面说明下解决该问题的算法思路。
优先级队列
由于叶子节点之间链接执行优先级不一样,先放入优先级队列。以后每次取出高优先级任务执行。相同优先级任务能够复用, 连续执行屡次。优先级队列示意图以下:
构建树
有了优先级队列的概念, 咱们来构建树。构建主要分如下步骤:
1.首先获得四种优先级的任务, 优先级从高到低分别为:
- 优先级1, 六个节点的同步任务
- 优先级2,节点一、二、3和节点四、5的Full Join任务
- 优先级3,节点一、4和节点6的Left Join任务
- 优先级4, 发布任务
2.取优先级1的任务执行,同步进来六个数据源对应六个叶子。
3.取优先级2的任务并执行获得中间表1,2。
4.取优先级3的任务并执行,发现节点一、4有父节点, 则执行中间节点一、2分别和节点6 Left Join获得根节点。
5.取优先级4的任务并执行,发布根节点。
能够看到最终的数据结构是一棵树, 经过这种方式咱们能支持复杂sql的自动构建。进一步抽象, 这种“一个队列驱动一棵树生成”的模式能够解决一类问题:
- 问题的解决由一系列不一样优先级的任务组成, 任务须要复用。
- 经过从队列取优先级高的任务的方式构建任务关系树。
- 最后遍历树完成各个节点任务。
五 总结
限于篇幅, 本文重点在于介绍自动生成sql功能开发中运用到的主要数据结构和设计模式思想。
目前咱们实现了任意张表关联sql自动生成并发布, 总体延迟控制在2s之内。以后SQL生成器主要会针对方便接入更多第三方实时计算平台(好比Tisplus), 下降总体系统延迟工做展开。方便接入主要考验的是架构的设计, 也是本文着重写的点(包括数据结构和算法设计、设计模式的选择)。下降系统延迟则包括消息中间件优化,代码执行效率提高等。
原文连接 本文为阿里云原创内容,未经容许不得转载。