Как создать представление DAG для набора операций / рабочего процесса? - PullRequest
0 голосов
/ 10 февраля 2020

Мы используем apache flink для потоковой обработки. В документации говорится, что flink генерирует График выполнения / DAG на основе определенных операций (цепочка преобразований потоковых данных). Я также могу видеть представление DAG на портале пользовательского интерфейса.

Мне немного любопытно, как это можно сделать под капотом. Есть ли доступная библиотека, которая делает это для Flink или реализована самим Flink.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Это реализовано самим Флинком. Если вы погрузитесь в код, вы найдете класс org.apache.flink.streaming.api.graph.JSONGenerator, который равен @Internal и имеет метод getJSON. Он используется для генерации Json представления StreamGraph экземпляра (здесь участвует библиотека Джексона). StreamGraph представляет собой целую топологию задания и может отображаться различными способами.

Источники Flink

0 голосов
/ 11 февраля 2020

В дополнение к тому, что сказал Дэвид, вы можете использовать метод planToDot() в flink-crawler FlinkUtils для преобразования упомянутого им JSON в стандартный формат графика (файл .dot), который затем можно открыть с помощью одной из нескольких программ визуализации графиков. Обратите внимание, что это логический план, поэтому вы не увидите результаты конвейерной обработки операторов, такие как показанные в веб-интерфейсе Flink.

0 голосов
/ 10 февраля 2020

Если вы хотите увидеть план выполнения вашей работы, вы можете сделать это:

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"
        }
      ]
    }
  ]
}
...