如何为一组操作/工作流创建 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 表示?的主要内容,如果未能解决你的问题,请参考以下文章

如何为自定义帖子类型存档页面创建导航

工作流调度引擎---Oozie

如何为以下操作创建 SQL 查询?

Magento:如何为部分付款创建模块?

如何为一组任务确定计划,估计每个任务所需的时间?

如何为开始日期和结束日期之间的每个工作日创建多行