本文整理自 Dinky 实时计算平台 Maintainer 亓文凯老师在 Apache Doris & Apache SeaTunnel 联合 meetup 的实践分享,通过 Doris + Flink + DolphinScheduler + Dinky 构建开源数据平台。
作者:开源项目 Dinky 的发起人,亓文凯
GitHub 地址
https://github.com/DatalinkDC/dlink
https://gitee.com/DatalinkDC/Dinky
欢迎大家关注 Dinky 的发展~
一、背景
当前行业不断有许多新概念与新技术涌现,同时伴随着大量开源项目的诞生和发展,也有越来越多的企业转向开源软件。面对海量的业务需求和数据,应该如何高效地进行数据处理与分析,如何搭建一个数据平台?如何选择合适的开源项目来搭建呢?这是目前大家比较困扰的一个问题。
本次分享将介绍如何运用 Doris + Flink + DolphinScheduler + Dinky 四个开源项目来构建一个基本的数据平台,并支持离线、实时、OLAP 三种技术需求。
二、开源数据平台思路
本章节主要讲述数据平台搭建所用的开源项目介绍以及设计思路。
技术介绍
Apache Doris
首先要运用到的是 Apache Doris。Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。
如图所示,一般在平台架构中,Doris 常作为数据仓库使用,并向用户提供各种实时高效的查询能力。其数据输入可以使用常见的数据集成框架或工具,如 Flink、Spark 等。此外 Doris 还可以以外表的形式连接 Hive、Iceberg 、数据湖及 MySQL、Oracle 数据库,这也为数仓转型和数据库分析带来更多易用便捷的能力。
Apache Flink
Flink 是一个计算框架和分布式处理引擎,主要用于无边界与有边界数据流上进行有状态的计算,Flink 能在所有常见集群环境中运行,并且能以内存速度和任意规模进行计算。在企业应用中,Flink 常用于高效连接消息流,如 Kafka,各种数据库、文件系统等,可以实时加工处理、也支持批处理,最终将数据高效写入消息流、数据库、软件系统等。
Flink CDC
Flink CDC 是 Flink 的子项目,是 Flink 的一组原连接器,用于 CDC 从不同数据库接收/更改数据,Flink CDC 将 Debezium 集成为引擎,异步或数据更改,因此 Flink CDC 可以充分使用和发挥 Debezium 的能力,并且可以无缝对接 Flink 使用其 SQL API 和 DataStream API 的能力,最终写入各种数据源。
Apache DolphinScheduler
DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。DolphinScheduler 采用了多 Master 和多 Worker 的实现形式,实现分布式、去中心化,支持 Flink、SQL等丰富的任务类型,且易于扩展。
Dinky 实时计算平台
Dinky 是基于 Apache Flink 二次开发的一款实时计算平台,主要为了更好地进行数据仓库和数据湖的建设与运维。Dinky 主要分为两大块,Data Studio 以及运维平台,数据开发方面主要支持 Flink SQL、Flink Jar 以及普通的 SQL 任务。
Dinky 平台是通过 Flink API、Flink Client、Yarn、K8s 等提交和管理 Flink 任务,全过程只需要在 Dinky 中开发 Flink SQL ,不需要进行编译打包,Flink 任务就可自动提交到各种环境的集群。它支持多种提交方式,包括 Local、Standalone、Yarn、K8s 等方式,此外还提供了平台的管理能力,比如数据源、集群、监控报警的能力。对外可以通过 Flink 连接器以及数据源连接扩展来对外部数据源进行数据处理及管理。
设计思路
开源数据平台的设计思路是通过 Flink SQL Batch 以及 Doris SQL 的能力实现一个离线任务的开发;使用 DolphinScheduler 进行离线工作流编排和调度;通过 Flink CDC 和 Flink SQL 实现流处理能力,进行实时任务的开发;选择 Doris 作为实时数据仓库来写入数据并进行 OLAP 查询;通过 Dinky 来提供一个完整的任务开发运维的平台能力,满足常见的企业数据平台需求。
在本文中,Doris SQL 是一个探索阶段的思路,目前主要以 Flink SQL 来实现。在我们的生产实践中,Doris SQL 多用于对 Flink 清洗加工后的明细数据进行快速关联统计,然后采用视图或将计算结果 insert 到下游 Doris 主题表里,最终通过 Doris 对下游 BI 或系统提供高效的 OLAP 查询支撑,减少实时和离线数仓的建设成本。
三、离线数据分析平台
接下来将分享如何构建一个离线的数据平台。
思路介绍
在离线数据分析平台中,Doris 作为核心数据仓库,Flink SQL Batch 和 Doris 的外部表提供一个数据的装载能力,也可以通过 Flink SQL Batch 和 Flink SQL 的提供一个 ETL 的能力,在 Dinky上进行 Flink SQL 和 Doris SQL 的开发、调试以及运维工作,而离线任务调度则使用 DolphinScheduler 来提供工作流的调度,最终通过 Doris 提供一个 OLAP 的能力,供下游的业务系统或 BI 系统来直接消费。
FlinkSQL 写入 Doris
首先会运用到 Flink SQL 来写入Doris(本文介绍的是 Doris 版本为 0.15,1.1 版本改动较大请参考 Doris 官网文档),需要在 Flink Lib 以及 Dinky Plugins 下添加对应编译好的 Flink、Doris 的连接器,需要注意 Flink 、Scala、Doris对应版本,其次是如果要实现一个写入的更新,则需要开启一些配置。比如说:
1)
2) 只支持 Unique 模型
3) FlinkDDL 指定主键信息
在写入的过程中,可能会由于换行符导致分割错误,我们通常会加上两行配置,重新定义下数据格式,解决分割错误:
FlinkSQL 读取 Doris
在 FlinkSQL 读取 Doris 过程中通常会遇到一个问题,在默认的 Doris 连接器实现中存在一个隐藏列,因此需要在 Flink DDL 中声明 Doris 的隐藏列,如下图所示。
FlinkSQL 调试查询
之后可以在 Dinky 中来实现一个 FlinkSQL 的调试查询。下图是 Dinky 的开发页面,中间是SQL 开发编辑器,右侧是作业的配置;下方则是 FlinkSQL 实时调试的查询结果,类似于 SQL-Client。
Flink Catalog 管理
为方便进行 Flink Catalog 的管理。
FlinkSQL 表值聚合函数 AGGTABLE
Dinky 提供了很多特殊的语法。比如表示聚合的语法:AGGTABLE
FlinkSQL 全局变量
全局变量在企业数据开发中是非常关键和灵活的。
FlinkSQL 血缘分析
Dinky 提供了字段血缘分析的能力,可以从 Flink SQL 作业中的多个 insert 语句中分析出该任务的字段血缘分析。
此前 Dinky 是基于 StreamGraph 来分析 Flink 血缘,在 Local 的环境下对 StreamGraph 进行字段血缘的推导。在推导的过程中,通常会运用到一些比较关键的信息,下图中所展示的是 SQL 任务提交过程中构建的 StreamGraph,血缘实现的原理是基于 Pact、Contents、Predecessors 等参数实现 Source 和 Sink 字段关系的推导,但是有一些自定义的 UDF 以及连接器是不包含类似元数据的信息,比如说 Hudi 的连接器是无法进行 Hudi 的血缘。
目前 Dinky 的血缘算法进行了优化,直接通过 Optimized Logical Plan 来进行推导,降低了算法成本,并且解决了上文提到的 UDF 与 Hudi 的问题。
Doris 血缘分析
Dinky 也提供了 Doris 的血缘分析能力。该血缘分析主要是基于 Alibaba Druid 来实现的。
构建 DolphinScheduler 工作流任务
基于上文血缘分析的能力,可以人工编排在数据仓库中的 DAG 工作流。主要是通过 DolphinScheduler 的工作流进行处理,在 DolphinScheduler 中扩展了 Dinky 的作业类型,目前需要等到 3.1 的版本才可以使用。
任务监控
通过 DolphinScheduler 调度的任务,在 Dinky 计算平台中也可以实时看到作业的运行情况。在运维中心中可以看到每个作业的细节,在 DolphinScheduler 所实现的任务类型既支持实时也支持离线,实时需要等到任务触发手动停止才会跑到下一个节点,离线则会等到离线作业 Finished,再进行到下一个节点。Dinky 提供了简单的一个任务监控,也提供了 Flink Web UI 的快捷跳转的按钮跳转到 Web UI 来查看更多详细信息。
作业发布版本对比
在管理大量作业的时候,通常会发生数据口径 FlinkSQL 的变化。Dinky 提供了作业版本管理的能力,在发布的时候会自动创建一个新的版本,后续可以对比每个版本中 SQL 的差异性,以及进行作业版本回滚操作。
Doris OLAP 及 Charts 渲染
Dinky 支持 Doris SQL 语句查询和执行能力,此外还提供了简单的 BI 的功能,可以将 Doris 语句的查询结果进行 BI 渲染,如柱状图、折线图、饼图等。
总结
1.核心存储层选择 Doris 来提供统一数仓的能力,可以同时支持实时数据服务、交互数据分析和离线数据处理场景。
2.计算层选择 Flink 来提供各种数据源数据离线采集及清洗转换的 ETL 能力。可以发挥其高吞吐、高性能的优势。
3.平台层选择 Dinky 来提供数据开发与运维的能力, 通过 DolphinScheduler 提供工作流调度的能力。
四、实时数据分析平台
本文分享的的实时数据分析平台解决方案链路比较短。主要是:
FlinkCDC+FlinkSQL 入库 Doris
在使用 Flink CDC 和 FlinkSQL 的过程中:
第一种方式是使用官方 Flink CDC + Flink SQL 进行 ETL 操作。对于实时性要求较高且比较独立重要的需求,比如:不是在 Doris 中进行一个数仓的分层处理的,如 DWD、DWS 等,可以从源头 CDC 进行流处理后将结果写入 Doris 中,再通过 Doris 供上游 BI 系统直接使用 MySQL 协议来进行查询消费。
Flink CDC 目前支持了非常多的数据源,我们主要用到关系型的数据库,比如 MySQL、Oracle、Postgres 等 。Flink CDC 每一个 DDL 都会创建一个连接数,需要在使用的过程中保证足够的连接数,否则可能会影响业务系统的正常运转。
Dinky 整库同步 CDCSOURCE 语法
第二种方式是 Dinky 提供了整库同步 CDCSOURCE 语法来进行 ELT 操作 。CDCSOURCE 语法会创建一个完整的连接数只有 1 的 FlinkCDC 整库同步任务。主要是使用了分流原理,此外可以通过 Sink 来指定下游数据库的各种的配置。它在创建任务时,会自动获取数据源元数据信息,自动映射出对应的字段名和类型,自动构建每个表的 Sink,且支持 Flink SQL 的所有 Sink 类型。当前如果源库 DDL 发生变动时,通常只能通过从恢复点重启 CDCSOURCE 任务来自动映射变动后的 DDL。
Dinky 整库同步原理
整库同步的原理是一个分流的操作:从 CDC 中读取出数据换成 Map,通过 Map 对 Schema 和 Table 进行过滤 ,过滤完之后组装成 Datastream<Row> ,最终再将 Datastream 转换成 TemporaryView,转换成视图之后,就可以使用 Flink SQL 进行操作。目前的操作是直接将它输出到任意的一个 Sink,当然此处可以进行改造,比如添加其他的定制处理,此外在上图的第四步,在组装 Datastream<Row> 后,也可以直接使用 Datastream 的 API 进行输出。当前 Dinky 对第三步 Filter 进行了优化,采用测输出流的方式来提升吞吐性能,提升约 20 倍。
总结
1.采集层使用 Flink CDC 替代传统的 CDC 方案,功能更全面,且无缝对接 FlinkSQL。
2.对于 ETL 需求可以直接使用 FlinkSQL+ Flink CDC 计算完成后入库 Doris。
3.对于 ELT 需要整库同步至 Doris 作为 ODS 进行实时 OLAP 时,可以采用 Dinky 整库同步来快捷构建实时任务。
五、未来规划
Dinky Roadmap
Dinky on Doris Roadmap
Dinky on Flink Roadmap
Dinky on DolphinScheduler Roadmap
六、结束语
以上就是本篇文章【Doris + Flink + DolphinScheduler + Dinky 构建开源数据平台】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/quote/2549.html 行业 资讯 企业新闻 行情 企业黄页 同类资讯 网站地图 返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多