Flink

Rescaling Stateful Applications

2018-08-19  本文已影响10人  远o_O

一、概述

数据局部性是Flink中的一个关键原则,并且强烈影响状态的存储和访问方式。Flink中的状态都是Local State。Why local state is a fundamental primitive in stream processing

Apache Flink是一个大规模并行分布式系统,允许大规模的有状态流处理。对于可伸缩性,Flink作业在逻辑上被分解为运算符图,并且每个运算符的执行在物理上被分解为多个并行运算符实例。从概念上讲,Flink中的每个并行运算符实例都是一个独立的任务,可以在无共享机器的网络连接集群中的自己的机器上进行调度。

对于此设置中的高吞吐量和低延迟,必须最小化任务之间的网络通信。在Flink中,用于流处理的网络通信仅发生在作业运算符图中的逻辑边缘(垂直),以便流数据可以从上游传输到下游operator。

对于此设置中的高吞吐量和低延迟,必须最小化任务之间的网络通信。在Flink中,用于流处理的网络通信仅发生在作业运算符图中的逻辑边缘(垂直),以便流数据可以从上游传输到下游operator。

二、Rescaling Stateful Stream Processing Jobs

image.png

三、Reassigning Operator State When Rescaling

image.png

Operator States的动态扩展是非常灵活的,现提供了3种扩展,下面分别介绍:

1、Operator State只有一种数据结构即:ListState<T>,并且是全局的, Operator State的每个SubTask贡献一部分T给ListState<T>。正是因为是List,Operator在rescaling的时候,才会进行分配。否则一个T,对于Flink,这个T就是一个黑盒,Flink无法进行分配。
2、为什么Operator State只提供了一种数据结构ListState<T>,就是因为Operator State的Rescale的问题。

图解

作为解决这个黑盒问题的一种通用方法,我们稍微修改了一个名为的checkpointing接口,称为ListCheckpointed。图2B显示了新的检查点接口,它返回并接收状态分区列表。引入列表而不是单个对象会使状态的有意义分区显式化:列表中的每个T仍然是Flink的黑盒子,但被认为是原子的,可独立重新分配的operator state的一部分。

image.png

四、Reassigning Keyed State When Rescaling

1、Question:

虽然这会自动解决重新缩放后逻辑上将状态重新映射到子任务的问题(因为由key😄),但还有一个实际问题需要解决:我们如何才能有效地将状态转移到子任务的本地后端?

2、Answer

一种天真的方法可能是从所有子任务中的检查点读取所有先前的子任务状态,并过滤掉每个子任务的匹配键。虽然这种方法可以从顺序读取模式中受益,但是每个子任务可能会读取大部分不相关的状态数据,并且分布式文件系统接收大量的并行读取请求。

另一种方法可以是构建一个索引,该索引跟踪检查点中每个密钥的状态位置。通过这种方法,所有子任务都可以非常有选择地定位和读取匹配的键。这种方法可以避免读取不相关的数据,但它有两个主要缺点。1、所有键的物化索引(即键 - 读 - 偏移映射)可能会变得非常大。此外,2、这种方法还可以引入大量的随机I/O(当寻求单个key的数据时,参见图3A,这通常在分布式文件系统中带来非常糟糕的性能)。

image.png

However, the new parallelism can be at most the previously configured max-parallelism. Once a job was started, the max-parallelism is baked into the savepoints and cannot be changed anymore.
新的并行度最多可以是先前配置的最大并行度。作业启动后,最大并行度将被烘焙到保存点中,并且无法再进行更改。除非抛弃所有状态,作为一个新job开始

image.png
上一篇 下一篇

猜你喜欢

热点阅读