《基于Apache Flink的流处理》Part1

发布时间 2023-03-30 20:06:51作者: Shallowker

流处理基础

DataFlow 图

Dataflow 程序描述了数据如何在不同操作之间流动。Dataflow 程序通常表示为有向图。图中顶点称为算子,表示计算;而边表示数据依赖关系。算子是Dataflow 程序的基本功能单元,它们从输入获取数据,对其进行计算,然后产生数据并发往输出以供后续处理。没有输入端的算子称为数据源,没有输出端的算子称为数据汇。一个 Dataflow 图至少要有一个数据源和一个数据汇
image

数据并行和任务并行

数据并行

将输入数据分组,让同一操作的多个任务并行执行在不同数据子集上,这种并行成为数据并行(data parallelism)

能够将计算负载分配到多个节点上从而允许处理大规模的数据

任务并行

让不同的算子的任务(基于相同或者不同的数据)并行计算,这种并行称为任务并行(task parallelism)

通过任务并行,可以更好地利用集群的计算资源

数据交换策略

image

  • 转发策略(forward strategy) 在发送端任务和接收端任务之间一对一地进行数据传输。如果两端任务运行在同一物理机器上(通常由任务调度器决定),该交换策略可以避免网络通信。
  • 广播策略(broadcast strategy) 会把每个数据项发往下游算子的全部并行任务。该策略会把数据复制多份且涉及网络通信,因此代价十分昂贵。
  • 基于键值的策略(key-based strategy) 根据某一键值属性对数据分区,并保证键值相同的数据项会交由同一任务处理。
  • 随机策略 (random strategy) 会将数据均匀分配至算子的所有任务,以实现计算任务的负载均衡。

并行流处理

延迟

延迟表示处理一个事件所需的时间。本质上,它是从接收时间到在输出中观察到事件处理效果的时间间隔。在流处理中,延迟是以时间片(例如毫秒)为单位测量的。例如:平均延迟为10 毫秒表示平均每条数据会在 10 毫秒内处理;而第 95 百分位延迟在 10 毫秒意味着 95%的事件会在 10 毫秒内处理。

吞吐

吞吐是用来衡量系统处理能力(处理速率)的指标,它告诉我们系统每单位时间可以处理多少事件。

数据流上的操作

数据接入和数据输出

数据接入和数据输出操作允许流处理引擎和外部系统进行通信。数据接入操作是从外部数据源获取原始数据并将其转换成适合后续处理的格式。实现数据接入操作逻辑的算子称为数据源。数据源可以从 TCP 套接字、文件、Kafka 主题或传感器数据接口中获取数据。数据输出操作是将数据以适合外部系统使用的格式输出。负责数据输出的算子称为数据汇,其写入的目标可以是文件、数据库、消息队列或监控接口等。

转换操作

转换操作是一类“只过一次”的操作,它们会分别处理每个事件。这些操作逐个读取事件,对其应用某些转换并产生一条新的输出流。转换逻辑可以是算子内置的,也可以由用户自定义函数提供。函数由应用开发人员编写,可用来实现某些自定义的计算逻辑。

image

滚动聚合

滚动聚合(如求和、求最小值和求最大值)会根据每个到来的事件持续更新结果。聚合操作都是有状态的,它们通过将新到来的事件合并到已有状态来生成更新后的聚合值。注意,为了更有效地合并事件和当前状态并生成单个结果,聚合函数必须满足可结合(associative)及可交换 (commutative) 的条件,否则算子就需要存储整个流的历史记录。图 2-5 展示了一个求最小值的滚动聚合,其算子会维护当前的最小值,并根据每个到来的事件去更新这个值。

image

窗口操作

窗口操作会持续创建一些称为“桶”的有限事件集合,并允许我们基于这些有限集进行计算。事件通常会根据其时间或其他数据属性分配到不同桶中。

其中参与计算的决策会根据触发条件判定,当触发条件满足时,,桶内数据会发送给一个计算函数 (evaluation function) , 由它来对桶中的元素应用计算逻辑。这些计算函数可以是某些聚合 (例如求和、求最小值),也可以是一些直接作用于桶内收集元素的自定义操作。策略的指定可以基于时间 (例如最近 5 秒钟接收的事件)、数量 (例如最新 100 个事件) 或其他数据属性。

滚动窗口

滚动窗口 (tumbling window) 将事件分配到长度固定且互不重叠的桶中。在窗口边界通过后,所有事件会发送给计算函数进行处理。基于数量的 (count-based) 滚动窗口定义了在触发计算前需要集齐多少条事件。图 2-6 中基于数量的滚动窗口将输入流按每 4 个元素一组分配到不同的桶中。基于时间的 (time-based) 滚动窗口定义了在桶中缓冲数据的时间间隔。图 2-7 中基于时间的滚动窗口将事件汇集到桶中,每 10 分钟触发一次计算。

image

滑动窗口

滑动窗口 (sliding window) 将事件分配到大小固定且允许相互重叠的桶中,这意味着每个事件可能会同时属于多个桶。我们通过指定长度和滑动间隔来定义滑动窗口。滑动间隔决定每隔多久生成一个新的桶。在图 2-8 中,基于数量的滑动窗口的长度为 4 个事件,滑动间隔为 3 个事件。

image

时间语义

处理时间

处理时间是当前流处理算子所在本地机器上的本地时钟时间。

事件时间

事件时间是数据流中事件实际发生的时间,它以附加在数据流中事件的时间戳为依据。这些时间戳通常在事件数据进入流处理管道之前就存在(例如事件的生成时间)。

事件时间将处理速度和结果内容彻底解耦。基于事件时间的操作是可预测的,其结果具有确定性。无论数据流的处理速度如何、事件到达算子的顺序怎样,基于事件时间的窗口都会生成同样的结果。