流处理基础概念

对于流处理,一个核心的概念就是Dataflow编程

其是一个有向图,图中的顶点是算子,表示计算逻辑,边则是数据依赖关系,

整体的过程就是,从图的顶点开始,获取数据,然后交给后面的节点进行计算,之后产生数据并发往后续处理,最初的顶点被称为数据源,最终的顶点被称为数据汇(输出算子)

而一个Dataflow至少要有一个数据源和一个数据汇

图片

而接下来一个概念,是数据并行和任务并行

因为一个Dataflow中,一个算子可能会启多个相同任务Task在不同的机器上运行并行任务

算子和算子之间也会并行的运行

图片

任务并行就如同上图的一个算子运行在两个物理机器上的.

数据并行则是将输入数据分组,同一个操作任务并行执行在不同数据子集上.

两者结合来最大化的利用集群资源.

数据交换,

定义了在整个DataFlow图中,上游算子如何和下游算子交互的方式

常见的策略有:

转发,一对一地进行数据传输,如果两端运行在同一个物理机器上,可以避免网络传输

图片

广播,上游算子将数据发往下游算子的全部并行任务中

图片

基于键值的策略,根据某一键值属性来对数据进行分区,来确保根据键值来发送给下游算子

图片

随机策略,会将数据均匀分配至算子的所有任务,来实现负载均衡

图片

上面就是DataFlow基本概念,但是在继续讲解流处理概念之前,我们先说下评测流处理性能的两个指标 延迟和吞吐

在之前的批处理之中,关心的主要指标是总执行时间,也就是批处理引擎获取输入,执行计算,写回的总时间.但是流处理事件数量不确定,故不能以总执行时间作为衡量指标,而是需要已延迟和吞吐作为两个指标.

对于延迟,则是有两个衡量方式,分别是平均值和延迟的百分位数值,比如平均延迟为10ms表示每条数据会在10ms内处理,而95百分位延迟在10ms则是95的事件会在10ms内处理.但是对于其中的一些极限事件,还是需要人为的查看.

对于吞吐,是衡量系统处理能力的指标,系统每单位时间可以处理多少事件,通常情况是延迟越低越好,吞吐越高越好.而吞吐也取决于上层系统的事件生产速度,所以我们需要确定系统的极限吞吐,如果事件生产速度突破了系统吞吐量极限,那么就会出现缓存事件,而长时间的缓存最终就会导致缓存区耗尽,最终丢失数据,这种情况也被称为背压 backpressure

为了平衡两点,我们可以先确定极限吞吐和延迟的平衡点,然后在高峰时刻,考虑增加节点这种方式来降低延迟增加吞吐.

上面说了一个流处理的基石,Dataflow编程,规定了一个流处理的过程,而如何将Dataflow编程应用到数据流中是接下来的讨论议程.

首先我们先给出数据流的概念,这是一个无限的事件序列.

而处理无限的事件的情况下,操作可以分为有状态的和无状态的,无状态的很简单,处理事件无需依赖已经处理过的事件,也不保存历史数据

如果是有状态的,则需要维护之前收到的事件信息,而且需要提供出错时候的可靠故障恢复.

而无论无状态还是有状态操作,都必须要有一个输入节点和一个输出节点

输入节点将数据从外部数据源获取,并将原始数据转换为适合后续处理的格式,数据源可以从TCP套接字,文件,Kafka主题等获取数据

输出节点则是将数据以适合外部系统的格式输出,目标可以是文件,数据库,消息队列等

而在整个流计算中,可以将其他的逻辑节点分为以下几种

  1. 转换操作,这种操作会逐个读取事件,然后对其进行转换,并产生一个新的输出流,当然转换算子是可以内置的,亦或者交给用户自定义函数提供的

图片

  1. 滚动聚合,这是一个有状态的操作,依据每个到来的事件,持续的更新结果,也就是会根据新到来的事件聚合出新的聚合值,比如下面的聚合操作是维护这个数据流的最小值

图片

窗口操作

因为在实际操作中,有些需求是需要收集一些事件之后再进行计算的.

比如对交通,需求可以是某一个路口每5分钟的车流量

窗口操作会持续创建一些称之为”桶”的有限事件集合,并基于这些有限事件集合进行计算,也就是桶的触发条件满足之后,桶内的数据会发送给一个计算函数,从而对桶中的数据进行计算逻辑,这些计算函数可以是聚合,可以是收集特定信息.

那么如何划分桶,以及桶产生的频率?其实窗口的类型就是依据了桶的创建方式不同.

滚动窗口,会将事件分配到长度固定且互不重叠的桶,满足一定时间或者一定数量之后,就会触发计算,比如基于时间的滚动窗口定义了桶中缓冲数据的时间间隔

图片

滑动窗口则是将事件划分到大小固定且互相重叠的桶,这意味着每个事件可能属于多个桶.这样通过指定长度和滑动间隔来定义滑动窗口,比如下面的滑动窗口就是包含4个事件,间隔为3个

图片

会话窗口则是按照一些诸如用户会话,用户一些列活动等进行划分,将同一会话中的事件分配到相同桶中,会话窗口依靠了会话间隔来定义了关闭前的非活动时间长度.

图片

而且上述的窗口都是支持在流进行换分之后再次进行窗口计算的

图片

比如希望在窗口计算前,按照用户权限组进行划分.

窗口操作和流计算中两个核心概念息息相关,时间语义和状态管理,时间是流计算中一个重要方面,因为在现实生活中,数据流往往有所延迟以及乱序到达,这种情况下如何提供精准的,确定的结果至关重要.接下来我们来讲解下流计算中的时间语义.

发表评论

邮箱地址不会被公开。 必填项已用*标注