简介: 用户只需在前端简略配置下指标,零碎即可主动生成大宽表,让用户查问到他所须要的实时数据,数据源反对跨库并反对多种指标介质。这样的数据全局实时可视化如何实现?本文从需要剖析开始,分享主动生成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), 升高整体零碎提早工作开展。不便接入次要考验的是架构的设计, 也是本文着重写的点(包含数据结构和算法设计、设计模式的抉择)。升高零碎提早则包含消息中间件优化,代码执行效率晋升等。

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