Flink: операторы не определены в топологии потоковой передачи.Невозможно выполнить - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь настроить очень простую работу Flink.Когда я пытаюсь запустить, получаю следующую ошибку:

Caused by: java.lang.IllegalStateException: No operators defined in streaming topology. Cannot execute.
    at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.getStreamGraph(StreamExecutionEnvironment.java:1535)
    at org.apache.flink.streaming.api.environment.StreamContextEnvironment.execute(StreamContextEnvironment.java:53)
    at org.apache.flink.streaming.api.scala.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.scala:654)
    at com.test.flink.jobs.TestJobRunnable$.run(TestJob.scala:223)

Ошибка вызвана кодом ниже:

val streamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
val messageStream = streamExecutionEnvironment.addSource(kafkaConsumer)
messageStream.keyBy(_ => "S")

streamExecutionEnvironment.execute("Test Job")

Ошибка исчезает, когда я добавляю вызов print()до конца потока:

val streamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
val messageStream = streamExecutionEnvironment.addSource(kafkaConsumer)
messageStream.keyBy(_ => "S")
messageStream.print()

streamExecutionEnvironment.execute("Test Job")

Я не понимаю, почему print() решает эту проблему.Является ли идея, что потоковая топология не обрабатывает ни одного из своих операторов, пока не будет введен приемник?print() действует здесь как раковина?Любая помощь будет оценена.Спасибо.

1 Ответ

0 голосов
/ 04 марта 2019

В теории языка программирования отложенная оценка или вызов по требованию - это стратегия оценки, которая задерживает оценку выражения до тех пор, пока не потребуется его значение, а также избегает повторных вычислений.Противоположностью ленивой оценки является жаждущая оценка , иногда известная как строгая оценка.Преимущества отложенной оценки включают:

  • Возможность определять поток управления (структуры) как абстракции вместо примитивов.
  • Возможность определять потенциально бесконечные структуры данных.Это обеспечивает более простую реализацию некоторых алгоритмов.
  • Повышение производительности за счет исключения ненужных вычислений и исключения ошибок при оценке составных выражений.

Ленивая оценка может привести к уменьшению объема памяти, поскольку значения создаются при необходимости.Тем не менее, ленивую оценку трудно совместить с императивными функциями, такими как обработка исключений и ввод / вывод, потому что порядок операций становится неопределенным.

Как правило, Flink разделяет операции на два класса: преобразования операции и прием операций.Как вы догадываетесь, преобразования Flink ленивы, то есть они не выполняются до тех пор, пока не будет вызвана операция приемника.

Программы Flink - это обычные программы, которые реализуют преобразования в распределенных коллекциях (например, фильтрация, отображение, обновление).состояние, объединение, группировка, определение окон, агрегирование).Коллекции первоначально создаются из источников (например, путем чтения из файлов, тем Kafka или из локальных коллекций в памяти).Результаты возвращаются через приемники, которые могут, например, записывать данные в (распределенные) файлы или в стандартный вывод (например, терминал командной строки).

...