Flink中的程序本质上是并行的和分布式的。在执行期间,流有一个或多个流分区,每个操作符有一个或多个操作符子任务。操作符子任务相互独立,在不同的线程中执行,可能在不同的机器或容器上执行。
运算符子任务的数量是特定运算符的并行度。一个流的并行性总是它的生产操作符的并行性。同一程序的不同运算符可能具有不同级别的并行性。
流可以在两个操作符之间以一对一(或转发)模式传输数据,也可以在重分发模式中传输数据:
一对一One-to-one流(例如上图中源和map()运算符之间的流)保持元素的分区和顺序。这意味着map()操作符的子任务将看到与源操作符的子任务生成的元素相同的顺序。
重新分布Redistributing流(如上面的map()和keyBy/window之间,以及keyBy/window和Sink之间)改变流的分区。每个操作符子任务根据所选的转换将数据发送到不同的目标子任务。例如:keyBy()(通过散列键来重新分区)、broadcast()或rebalanced()(随机重新分区)。在重分发交换中,元素之间的顺序只保留在每一对发送和接收子任务中(例如map()的子任务和keyBy/window的子任务)。因此,在本例中,每个键中的顺序都是保留的,但是并行性确实引入了关于不同键的聚合结果到达sink的顺序的不确定性。
原文地址:http://blog.51cto.com/13959448/2316202
时间: 2024-10-09 03:58:09