Apache flink 减少操作员并行性对工作性能的影响

Apache flink 减少操作员并行性对工作性能的影响,apache-flink,Apache Flink,我开始想,在flink作业中,与降低特定操作符的并行性性能相关的用例是什么。我理解并行性如何与子任务和插槽数量等相关的所有技术问题 让我们设想一个包含三个任务的作业,即Source->Agg->Sink 如果我将flink配置为使用例如32个插槽,那么如果我将相同的并行度分配给所有3个任务(即32个任务),与分配源减少的并行度10相比,性能会有什么不同? 我的理解是,从源读取的记录会更少(即更少的使用者线程),但这会导致性能下降吗?减少源代码的并行性并不意味着我可以在cpu要求更高的操作符上实现

我开始想,在flink作业中,与降低特定操作符的并行性性能相关的用例是什么。我理解并行性如何与子任务和插槽数量等相关的所有技术问题

让我们设想一个包含三个任务的作业,即Source->Agg->Sink

如果我将flink配置为使用例如32个插槽,那么如果我将相同的并行度分配给所有3个任务(即32个任务),与分配源减少的并行度10相比,性能会有什么不同? 我的理解是,从源读取的记录会更少(即更少的使用者线程),但这会导致性能下降吗?减少源代码的并行性并不意味着我可以在cpu要求更高的操作符上实现更高的并行性,比如assign(32-10)+32=54并行性(我知道如果32个插槽可用,flink不会允许)


如果源产生太多记录,则背压会启动并降低源速度?

当管道仅由正向连接组成时——换句话说,如果没有按键或重新平衡操作,且平行度保持不变,则操作器将链接在一起,避免了网络通信和ser/de的成本。这具有相当大的性能优势

通常是由以下部分组成的管道:

source -> agg -> sink
你真的会做什么

source -> keyBy + agg -> sink
这意味着在源和聚合操作符之间已经有了网络和ser/de。但是,如果没有keyBy,那么更改源和agg之间的并行性将增加网络洗牌/重新平衡的成本

如果没有钥匙,你只会

source + agg + sink
所有这些都在一个线程中运行

但是有了keyBy,只要聚合器和接收器之间的并行性保持不变,这个管道就可以像

source -> keyBy + agg + sink
因为聚合器和接收器将在同一任务中链接在一起(从而在同一线程中运行)

只要源中至少有32个分区或碎片,那么在源中使并行度为32应该可以提高源外的吞吐量

但这一切的具体表现取决于一系列因素。如果密钥不平衡,或者接收器速度慢,或者聚合器的行为非常突发,这些都会影响吞吐量和延迟


如果源生成记录的速度快于聚合+接收器处理记录的速度,则agg+接收器任务将对源进行反压,并且它的读取速度将与管道的其余部分能够处理的速度相同。虽然这是可以的,但最好避免恒定的背压,因为背压可能导致检查点超时。因此,在这种情况下,您可能希望减少源位置的并行性,或者增加agg+接收器任务的并行性。

聚合前面是否有一个键区?@DavidAnderson-很可能。这是一个一般性的问题-但是如果答案取决于
keyBy
,那么答案是肯定的@我现在明白你的意思了<代码>如果是非键控流,您的原始流将不会被分割成多个逻辑流,所有窗口逻辑将由单个任务执行,即并行度为1。肯定是。即使没有自然密钥,我也会随机生成一次,这样记录就可以并行处理了!只有在使用窗口运算符时,您引用的语句才是真的。一般来说,您可以使用并行管道而无需键控,但大多数聚合只有在全局或按键进行时才有意义。