关于jquery:如何实现一个跨库连表SQL生成器

31次阅读

共计 3941 个字符,预计需要花费 10 分钟才能阅读完成。

简介: 用户只需在前端简略配置下指标,零碎即可主动生成大宽表,让用户查问到他所须要的实时数据,数据源反对跨库并反对多种指标介质。这样的数据全局实时可视化如何实现?本文从需要剖析开始,分享主动生成 SQL 性能开发中使用到的设计模式和数据结构算法设计。

一 概述

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

架构解析:

  • 初始数据来自于元数据中心。
  • 通过元数据适配层后转换为外部格局数据。
  • 调度核心把外部格局的数据传到打算核心,打算核心剖析数据需要并建模,通过 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,节点 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 的工作并执行,公布根节点。

能够看到最终的数据结构是一棵树,通过这种形式咱们能反对简单 sql 的主动构建。进一步形象,这种“一个队列驱动一棵树生成”的模式能够解决一类问题:

  • 问题的解决由一系列不同优先级的工作组成,工作须要复用。
  • 通过从队列取优先级高的工作的形式构建工作关系树。
  • 最初遍历树实现各个节点工作。

五 总结

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

目前咱们实现了任意张表关联 sql 主动生成并公布,整体提早管制在 2s 以内。之后 SQL 生成器次要会针对不便接入更多第三方实时计算平台(比方 Tisplus),升高整体零碎提早工作开展。不便接入次要考验的是架构的设计,也是本文着重写的点(包含数据结构和算法设计、设计模式的抉择)。升高零碎提早则包含消息中间件优化,代码执行效率晋升等。

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

正文完
 0