如何为一组操作/工作流创建 DAG 表示?
Posted
技术标签:
【中文标题】如何为一组操作/工作流创建 DAG 表示?【英文标题】:How to create a DAG representation for set of operations/workflow? 【发布时间】:2020-02-10 09:38:15 【问题描述】:我们使用 apache flink 进行流处理。文档说,flink 基于定义的操作(流数据的转换链)生成执行图/DAG。我还可以在 UI 门户上看到 DAG 表示。
我有点好奇这是如何在幕后完成的。是否有任何可用的库可以为 flink 执行此操作或由 Flink 本身实现。
【问题讨论】:
【参考方案1】:如果你想查看你的工作的执行计划,你可以这样做:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
...
System.out.println(env.getExecutionPlan());
env.execute();
您需要在作业结束时捕获此计划,因为此时作业图已完全构建。
它看起来像这样:
"nodes": [
"id": 1,
"type": "Source: Collection Source",
"pact": "Data Source",
"contents": "Source: Collection Source",
"parallelism": 1
,
"id": 3,
"type": "Map",
"pact": "Operator",
"contents": "Map",
"parallelism": 4,
"predecessors": [
"id": 1,
"ship_strategy": "REBALANCE",
"side": "second"
]
,
"id": 5,
"type": "Source: Collection Source",
"pact": "Data Source",
"contents": "Source: Collection Source",
"parallelism": 1
,
"id": 6,
"type": "Flat Map",
"pact": "Operator",
"contents": "Flat Map",
"parallelism": 4,
"predecessors": [
"id": 5,
"ship_strategy": "REBALANCE",
"side": "second"
]
,
"id": 8,
"type": "Co-Process-Broadcast-Keyed",
"pact": "Operator",
"contents": "Co-Process-Broadcast-Keyed",
"parallelism": 8,
"predecessors": [
"id": 3,
"ship_strategy": "HASH",
"side": "second"
,
"id": 6,
"ship_strategy": "BROADCAST",
"side": "second"
]
,
"id": 9,
"type": "Sink: Print to Std. Out",
"pact": "Data Sink",
"contents": "Sink: Print to Std. Out",
"parallelism": 8,
"predecessors": [
"id": 8,
"ship_strategy": "FORWARD",
"side": "second"
]
]
【讨论】:
【参考方案2】:由 Flink 自己实现。
如果你深入研究代码,你会发现一个org.apache.flink.streaming.api.graph.JSONGenerator
类,它是@Internal
,并且有一个getJSON
方法。它用于生成 StreamGraph
实例的 Json 表示(此处涉及杰克逊库)。 StreamGraph
本身代表了一个完整的作业拓扑,并且可以以多种方式呈现。
Flink sources
【讨论】:
【参考方案3】:除了大卫所说的,你可以使用flink-crawler FlinkUtils中的planToDot()
方法将他提到的JSON转换成标准的图形格式(.dot
文件),然后可以用几种中的任何一种打开图形可视化程序。请注意,这是合乎逻辑的计划,因此您不会像 Flink 的 Web UI 中那样看到 operator pipe-lining 的结果。
【讨论】:
以上是关于如何为一组操作/工作流创建 DAG 表示?的主要内容,如果未能解决你的问题,请参考以下文章