从Flink documentation开始,我知道循环可以用迭代运算符实现。由于Flink代码被延迟评估,因此无法使用while循环评估终止条件。
但对于像initial.iterate(10){...}
这样的批量迭代,我们可以使用while循环来实现相同的效果吗?
var dataset = ...
while (i < 10) {
dataset = step(dataset);
}
答案 0 :(得分:1)
使用内置批量迭代运算符和使用while循环构建计划的不同之处在于生成的执行计划。
While Loop:
StartDS -> Step1 -> Step2 -> ... -> Step10 -> ResultDS
批量迭代:
StartDS -> IterationHead -> Step -> IterationTail -> ResultDS
^ |
\-----------(9 times)-----/
根据您运行的迭代次数,批量迭代计划的大小可以显着缩小。较小的计划意味着Flink需要更少的时间来优化和安排计划。
此外,优化器可以利用有关显式迭代的信息,并在内存中缓存每次迭代中使用的DataSet。