前言
flink-table-planer 模块从SQL转换成 StreamGraph 的过程。以下是利用Flink的 StreamGraph 通过低代码的方式,来实现StreamGraph的生成,并最终实现 Flink 程序零代码开发的解决方案。
一、Flink 相关概念
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();DataStream dataStream = env.addSource(new FlinkKafkaConsumer("topic"));DataStream filteredStream = dataStream.filter(new FilterFunction() {@Overridepublic boolean filter(Object value) throws Exception {return true;}});DataStream mapedStream = filteredStream.map(new MapFunction() {@Overridepublic Object map(Object value) throws Exception {return value;}});mapedStream.addSink(new DiscardingSink());env.execute("test-job");
StreamGraph
JobGraph
ExecutionGraph
Physical Graph
二、画布模式实现思路
实现流程
构建有向无环图(DAG),并持久化。通过拖拉拽的方式(画布模式)构建你的Flink应用,后端的持久化存储采用邻接表方式。我们在 mysql 关系数据库中将 Node(算子:Source、Sink、中间加工逻辑算子)存储到 flink_node 表中;将边存到一张 flink_realation 表中。
重新组将Flink作业
要组装以上画布模式的Flink应用,首先需要初始化好 StreamExecutionEnvironment 相关参数,其次将上述表中的 flink_node 和flink_edge 转化为DataStream,并将转化出的 DataStream 合理地拼接成一个 DataStream API Flink 应用程序。
在将flink_node、flink_edge转为为DataStream时选择何种遍历算法来组装呢?我们知道有向无环图的遍历最常用的有:深度优先遍历(DFS)和广度优先遍历(BFS)。这里我们采用了BFS算法+层序遍历的方式,BFS便于在组装的过程中将已visit到的node节点拼装到其parent 的节点上。
总结
扫一扫,加入技术交流群


