我正在尝试设置一个非常基本的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()
是这里的水槽吗?任何帮助,将不胜感激。谢谢。
答案 0 :(得分:0)
在编程语言理论中,惰性评估(或按需调用)是一种评估策略,它可以延迟对表达式的评估,直到需要其值为止,并且还避免了重复评估。懒惰评估的反义词是渴望评估,有时也称为严格评估。 懒惰评估的好处包括:
惰性评估可以减少内存占用,因为在需要时会创建值。但是,由于运算的顺序变得不确定,因此延迟评估很难与诸如异常处理和输入/输出之类的命令性功能结合使用。
通常,Flink将操作分为两类:转换操作和接收器操作。如您所料,Flink转换是惰性的,这意味着它们只有在调用接收器操作后才会执行。
Flink程序是常规程序,可在 分布式集合(例如,过滤,映射,更新状态, 连接,分组,定义窗口,聚合)。集合是 最初是根据来源创建的(例如,通过读取文件,Kafka 主题,或来自本地内存中的收藏集)。返回结果 通过接收器,例如,可以将数据写入(分布式) 文件或标准输出(例如,命令行终端)。