为什么 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 个最终结果记录。
当我只想获取 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 个最终结果记录。