您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
基于图遍历的Flink任务画布模式下零代码开发实现方案
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
基于图遍历的Flink任务画布模式下零代码开发实现方案
1669877492_m
2024-11-04
IP归属:北京
42浏览
# 前言 提交一个DataSteam 的 Flink应用,需要经过 StreamGraph、JobGraph、ExecutionGraph 三个阶段的转换生成可成执行的有向无环图(DAG),并在 Flink 集群上运行。而提交一个 Flink SQL 应用,其执行流程也类似,只是多了一步使用 `flink-table-planer` 模块从SQL转换成 StreamGraph 的过程。以下是利用Flink的 StreamGraph 通过低代码的方式,来实现StreamGraph的生成,并最终实现 Flink 程序零代码开发的解决方案。 # 一、Flink 相关概念 在Flink程序中,每个算子被称作Operator,通过各个算子的处理最终得到期望的加工后数据。比如下面这段程序中,增加了Source, Fiter, Map, Sink 4个算子。 ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream dataStream = env.addSource(new FlinkKafkaConsumer("topic")); DataStream filteredStream = dataStream.filter(new FilterFunction() { @Override public boolean filter(Object value) throws Exception {return true;} }); DataStream mapedStream = filteredStream.map(new MapFunction() { @Override public Object map(Object value) throws Exception {return value;} }); mapedStream.addSink(new DiscardingSink()); env.execute("test-job"); ``` ## StreamGraph Flink的逻辑执行图,描述了整个流处理任务的流程和数据流转递规则,包括了数据源(Source)、转换算子(Transform)、数据目的端(Sink)等元素,以及它们之间的依赖关系和传输规则。StreamGraph是通过Flink的API或者DSL来构建的向无环图(DAG),它与JobGraph之间是一一对应的关系。StreamGraph中的顶点称为streamNode,是用来表示Operator算子的类,包含了算子uid、并行度,是否共享slot(SlotSharingGroup)等信息。边称作streamEdge。通过StreamingJobGraphGenerator类生成JobGraph。 ![streamGraph](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-09-26-21-40AMDrmmXc9nOkenY.png) ## JobGraph StreamGraph 经过 flink-optimizer 模块优化后生成 JobGraph。生成 JobGraph 时,会将多个满足条件的算子chain 链接到一起作为一个顶点(JobVertex), 在运行时对应1个 Task。Task 是 Flink 程序的基本执行单元,任务调度时将Task分配到TaskManager上执行。 ![jobGraph](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-09-26-21-41UZ8jQd6LnRJ97jw.png) ## ExecutionGraph 物理执行图是由JobGraph转换而来,描述了整个流处理任务的物理执行细节,包括了任务的调度、任务的执行顺序、任务之间的数据传输、任务的状态管理等。Task会在步骤中拆分为多个SubTask。对应Task中的每个并行度。 ![executionGraph](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-09-26-21-56NzDZFhlkxz9Jh9l.png) ## Physical Graph PhysicalGraph是在执行时的ExecutionGraph。ExecutionGraph中的每一个顶点ExecutionJobVertex都对应一个或多个顶点ExecutionVertex,它们是物理执行图中的节点。 # 二、画布模式实现思路 ## 实现流程 首先,我们采用画布模式(拖拉拽方式)来实现Flink程序的组装,将极大程度上方便我们复用部分加工的算子,最终实现零代码的Flink应用开发。我们通过绘图的方式,直接将内置的算子绘制在图标上。如下所示: ![画布模式](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2024-10-08-09-1888pldfffKJvkjzR.png) 1. 构建有向无环图(DAG),并持久化。通过拖拉拽的方式(**画布模式**)构建你的Flink应用,后端的持久化存储采用**邻接表**方式。我们在 mysql 关系数据库中将 Node(算子:Source、Sink、中间加工逻辑算子)存储到 flink_node 表中;将边存到一张 flink_realation 表中。 2. 重新组将Flink作业 要组装以上画布模式的Flink应用,首先需要初始化好 StreamExecutionEnvironment 相关参数,其次将上述表中的 flink_node 和flink_edge 转化为DataStream,并将转化出的 DataStream 合理地拼接成一个 DataStream API Flink 应用程序。 在将flink_node、flink_edge转为为DataStream时选择何种遍历算法来组装呢?我们知道有向无环图的遍历最常用的有:深度优先遍历(DFS)和广度优先遍历(BFS)。这里我们采用了BFS算法+层序遍历的方式,BFS便于在组装的过程中将已visit到的node节点拼装到其parent 的节点上。 # 总结 在实际的实现过程中,遇到的问题往往比以上复杂很多。比如需要将更多的信息存储在node节点和edge边上。node上需要存储并行度、算子处理前后的表schema等;edge需要存储keyby的字段、上下游之间的数据shuffle的方式等等。此外在内置的算子无法满足用户需求时,还需要考虑如何友好的支持自定义算子(UDF)的嵌入等问题。
上一篇:如何在服务器端自动ban掉扫描ssh的IP
下一篇:品牌标识管理之一:品牌命名的原理、策略与流程
1669877492_m
文章数
3
阅读量
208
作者其他文章
01
Flink State 状态原理解析
一、Flink State 概念State 用于记录 Flink 应用在运行过程中,算子的中间计算结果或者元数据信息。运行中的 Flink 应用如果需要上次计算结果进行处理的,则需要使用状态存储中间计算结果。如 Join、窗口聚合场景。Flink 应用运行中会保存状态信息到 State 对象实例中,State 对象实例通过 StateBackend 实现将相关数据存储到 FS 文件系统或者 Roc
01
什么是 Flink SQL 解决不了的问题?
简介在实时数据开发过程中,大家经常会用 Flink SQL 或者 Flink DataStream API 来做数据加工。通常情况下选用2者都能加工出想要的数据,但是总会有 Flink SQL 覆盖不了的问题,但 SQL 的易用性又难以让人释怀。所以有些场景在使用 FLink SQL 开始就与需要额外注意,下面就介绍一种多表关联时存在部分列更新(partial Update)场景,在 DataSt
01
基于图遍历的Flink任务画布模式下零代码开发实现方案
前言提交一个DataSteam 的 Flink应用,需要经过 StreamGraph、JobGraph、ExecutionGraph 三个阶段的转换生成可成执行的有向无环图(DAG),并在 Flink 集群上运行。而提交一个 Flink SQL 应用,其执行流程也类似,只是多了一步使用 flink-table-planer 模块从SQL转换成 StreamGraph 的过程。以下是利用Flink的
1669877492_m
文章数
3
阅读量
208
作者其他文章
01
Flink State 状态原理解析
01
什么是 Flink SQL 解决不了的问题?
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号