为什么 Flink 中 env.readTextFile(...).first(10).print 会读取所有数据?

Why does env.readTextFile(...).first(10).print in Flink read all data?

当我只想获取 Apache Spark 中的前 N ​​条记录时,我使用:

sc.textFile(path_to_files).take(10)

这将 return 快速给我前 10 行文本。 当我在 Apache Flink 中做类似的事情时:

env.readTextFile(path_to_files).first(10).print()

它将在 returning 结果之前完整读取所有文件。这是为什么?

Flink 使用流水线(基于流)执行模型。因此,在启动程序时,源端只是开始消费数据,而不知道下游的运营商。因此,所有数据都被读取并且 first(10) 仅 return 10 条记录。

由于流水线执行模型,很难应用优化来提前停止源。想象一下,中间可能有过滤器、聚合等,因此源无法知道它必须读取多少数据才能得到 10 个最终结果记录。