Dataflow图
- Dataflow逻辑图
有向图,顶点表示算子,边表示数据依赖关系。没有输入端的算子为数据源,没有输出端的算子为数据汇。一个Dataflow图至少有一个数据源和数据汇。为了执行Dataflow程序,我们需要将逻辑图转为物理图。 - Dataflow物理图
在物理图中顶点表示任务,逻辑图中的一个算子,在物理图中可能会分成多个并行算子任务进行执行,每个任务负责计算一部分输入数据。
数据并行和任务并行
- 数据并行
将数据进行分组,然后用相同的方法对数据进行处理。比如统计一个网站男女的pv,可以先对性别进行分组,然后对各个组的数据进行累加处理。结合Dataflow物理图来看的话就是一个任务的下游有两个任务。 - 任务并行
将单一的任务拆成几部分,这几个部分的任务并行执行。比如一个任务C为(1+1)*(2+2),可以拆成任务A(1+1)和任务B(2+2),A和B可以并行执行提高效率。结合Dataflow物理图来看的话就是一个任务的上游有两个任务。
数据交换策略
数据交换策略定义了如何将Dataflow物理图中任务到任务之间数据的传输,有下面几种转发策略。
- 转发策略
发送端任务和接受端任务一对一 - 广播策略
发送端任务会将数据广播到下游每一个接收端任务 - 基于键值策略
发送端任务会将数据根据某一键值属性进行分区,保证键值相同的数据会交给同一个下游接收端任务。 - 随机策略
发送端任务会将数据均匀分配给下游接收端所有任务。
并行流处理
如何利用Dataflow编程范式并处理无线数据流
延迟和吞吐
- 延迟
延迟表示处理一个事件所需时间,也就是说从接受事件到在输出中观察到事件处理效果的时间间隔。 - 吞吐
吞吐表示系统处理能力(处理速率)的指标,也就是说系统每单位时间可以处理多少事件。
由上可见延迟和吞吐是相互影响的,当延迟低的时候,吞吐量自然就会上去。所有我们可以通过并行处理多条数据流来降低数据处理的延迟时间。
数据流上的操作
通过对数据流的操作来实现数据流的获取、转换以及输出。这些操作可以分为无状态的操作和有状态的操作。有状态的操纵可能需要维护之前接受事件的信息,比较复杂,而无状态的操作相对较简单。
- 数据接入和数据输出
数据接入操作逻辑的算子称为数据源,负责数据输出的算子称为数据汇。 - 转换操作
转换操作是一类"只过一次"的操作,处理分一个到来的事件,产生一条新的数据流。 - 滚动聚合
滚动聚合会根据事件的到来不断更新聚合的结果,聚合操作都是有状态的,通过新来的事件合并到已有状态来生成更新后的聚合值。聚合函数必须满足可结合和可交换的条件,否则算子就需要存储整个流的历史纪录。 - 窗口操作
窗口操作会持续创建一些称为"桶"的有限事件集合,并允许我们基于这些有限集进行计算。窗口的行为是由一系列策略定义的,这些窗口策略决定了①什么时间创建桶②事件如何分配到桶中③桶内数据什么时间参与计算。
1.滚动窗口
将事件分配到长度固定且互不重叠的桶中。分为基于时间和基于数量的滚动窗口
2.滑动窗口
将事件分配到长度固定且允许重叠的桶中。分为基于时间和基于数量的滑动窗口
3.会话窗口
会话由发生在相邻时间内的一系列事件外加一段非活动时间组成。将同一会话的事件分配到相同桶中,会话窗口会根据会话间隔将事件分为不同的会话。
时间语义
- 处理时间
处理时间是当前流处理算子所在机器上的本地时钟时间。 - 事件时间
事件时间是数据流中事件实际发生的时间。 - 水位线
水位线是一个全局进度指标,表示我们确信不会再有延迟事件到来的某个时间点。本质上,水位线提供了一个逻辑时钟,用来通知系统当前的事件时间。当一个算子接收到时间为T的水位线,就可以任务不会再收到任何时间戳小于或等于T的事件了。
状态和一致性模型
任务故障
对于输入流的每个事件,任务都需要执行这几个步骤①接受事件并将它们存在本地缓冲区②选择性地更新内部状态③产生输出记录。这几个步骤都可能导致任务故障。
结果保障
保障流处理引擎内部状态的一致性
- 至多一次
每个事件对内部的状态的更新最多一次,相当于没有保障。 - 至少一次
每个事件对内部的状态的更新至少一次,需要支持数据重放机制。 - 精确一次
每个事件对内部的状态的更新都只有一次,如同故障没有发生一般,需要支持数据重放机制。