【译】A Deep-Dive into Flink's Network Stack(1)

Flink的网络堆栈是组成flink-runtime模块的核心组件之一,是每一个Flink工做的核心。 它链接全部TaskManagers的各个工做单元(子任务)。 这是您的流式传输数据流经的地方,所以,对于吞吐量和您观察到的延迟,Flink做业的性能相当重要。 与经过Akka使用RPC的TaskManagers和JobManagers之间的协调通道相比,TaskManagers之间的网络堆栈依赖于使用Netty的低得多的API。html

这篇博文是关于网络堆栈的一系列帖子中的第一篇。 在下面的部分中,咱们将首先深刻了解流操做符所呈现的抽象,而后详细介绍Flink的物理实现和各类优化。 咱们将简要介绍这些优化的结果以及Flink在吞吐量和延迟之间的权衡。 本系列中的将来博客文章将详细介绍监控和指标,调整参数和常见的反模式。java

逻辑视图apache

Flink的网络堆栈在相互通讯时为子任务提供如下逻辑视图,例如在keyBy()要求的网络混洗期间。api

它抽象了如下三个概念的不一样设置:网络

  • 子任务输出类型(ResultPartitionType): 
  1.  流水线的(有界的或无界的):一旦产生数据就能够向下游发送,多是一个接一个地,做为有界或无界的记录流。
  2.  阻塞:仅在生成完整结果时向下游发送数据。
  • 调度类型:
  1.  一次性(急切):同时部署做业的全部子任务(用于流应用程序)。
  2.  第一个输出的下一个阶段(懒惰):一旦任何生产者生成输出,就当即部署下游任务。
  3.  完整输出的下一个阶段:当任何或全部生产者生成完整输出集时,部署下游任务
  • 传输:
  1. 高吞吐量:Flink不是一个一个地发送每一个记录,而是将一堆记录缓冲到其网络缓冲区中并彻底发送它们。这下降了每一个记录的成本并致使更高的吞吐量。
  2. 经过缓冲区超时的低延迟:经过减小发送未彻底填充的缓冲区的超时,您可能会牺牲吞吐量来延迟

咱们将在下面的部分中查看吞吐量和低延迟优化,这些部分将查看网络堆栈的物理层。 对于这一部分,让咱们详细说明输出和调度类型。 首先,重要的是要知道子任务输出类型和调度类型是紧密交织在一块儿的,只能使二者的特定组合有效。性能

流水线结果分区是流式输出,须要实时目标子任务才能发送数据。 能够在生成结果以前或首次输出时安排目标。 批处理做业生成有界结果分区,而流式处理做业产生无限结果。优化

批处理做业也可能以阻塞方式产生结果,具体取决于所使用的运算符和链接模式。 在这种状况下,必须先生成完整的结果,而后才能安排接收任务。 这容许批处理做业更有效地工做而且资源使用更少。3d

批处理做业也可能以阻塞方式产生结果,具体取决于所使用的运算符和链接模式。 在这种状况下,必须先生成完整的结果,而后才能安排接收任务。 这容许批处理做业更有效地工做而且资源使用更少。htm

下表总结了有效组合:blog

1目前Flink未使用。

2批量/流式统一完成后,这可能适用于流式做业。

此外,对于具备多个输入的子任务,调度以两种方式启动:在全部或在任何输入生成器生成记录/其完整数据集以后。 要调整批处理做业中的输出类型和调度决策,请查看ExecutionConfig #setExecutionMode() - 特别是ExecutionMode  - 以及ExecutionConfig #setDefaultInputDependencyConstraint()

物理运输

为了理解物理数据链接,请回想一下,在Flink中,不一样的任务能够经过插槽共享组共享相同的插槽。 TaskManagers还能够提供多个插槽,以容许将同一任务的多个子任务安排到同一个TaskManager上。

未完待续

相关文章
相关标签/搜索