Flink:流拓扑中未定义任何运算符。不能执行

时间:2019-03-04 05:47:11

标签: scala apache-flink flink-streaming

我正在尝试设置一个非常基本的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 :(得分:0)

在编程语言理论中,惰性评估(或按需调用)是一种评估策略,它可以延迟对表达式的评估,直到需要其值为止,并且还避免了重复评估。懒惰评估的反义词是渴望评估,有时也称为严格评估。 懒惰评估的好处包括:

  • 将控制流(结构)定义为抽象的能力 而不是原始语言。
  • 定义潜在无限数据结构的能力。这个 允许更直接地实现某些算法。
  • 通过避免不必要的计算并避免出现性能提升 计算复合表达式时的错误条件。

惰性评估可以减少内存占用,因为在需要时会创建值。但是,由于运算的顺序变得不确定,因此延迟评估很难与诸如异常处理和输入/输出之类的命令性功能结合使用。

通常,Flink将操作分为两类:转换操作和接收器操作。如您所料,Flink转换是惰性的,这意味着它们只有在调用接收器操作后才会执行。

  

Flink程序是常规程序,可在   分布式集合(例如,过滤,映射,更新状态,   连接,分组,定义窗口,聚合)。集合是   最初是根据来源创建的(例如,通过读取文件,Kafka   主题,或来自本地内存中的收藏集)。返回结果   通过接收器,例如,可以将数据写入(分布式)   文件或标准输出(例如,命令行终端)。