1、状态流处理概述
提供直观且极富表达力的API来实现有状态的流处理应用。
传统数据处理框架
- 事务型处理:单体->微服务
- 分析型处理:通过提取->转换->加载将事务型的数据库的数据提取到数据仓库【分析型数据库】。批处理的形式。HDFS、S3、HBase
- 定时报表
- 实时数据
状态化流处理
有状态的连续事件流处理
flink解决数据丢失一致性问题: flink本地会保存本地的状态到本地内存或者嵌入式数据库。状态保护会设置检查点保存到远程数据库,用于数据的恢复等故障处理。一般会结合kafka使用,记录消费点和检查点可以重新执行。
以事件日志形式保存,日志都是追加的,顺序是保证的。当系统出现故障时就会利用检查点恢复消费位置,重新消费
事件驱动型应用
不同应用间通过事件日志进行连接,上游写下游读,各自管理状态,使应用间解耦。
应用场景
- 实时推荐
- 模式识别或复杂事件处理
- 异常检测
数据管道
系统间的数据同步,使用日志
流式分析
实时计算入库
- 手机网络质量监控
- 移动应用中的用户行为分析
- 消费者技术中的实时数据分析
引擎历史
- 第一代2011Lamada结构:批处理和实时计算存储到提速表,批处理写入后删除提速表,应用查询时汇总两部分数据
- 第二代2013:依旧依赖时间到来的时间和顺序
- 第三代2015:抛弃lamada
提供精确一次( exactly-once )的状态一致性保障??
使用
downloads.apache.org/flink/flink…
2、流处理基础
Dataflow
dataflow图
- 用于表现数据流动
- 顶点称为算子,表示计算
- 边表示数据依赖关系
- 没有输入端的算子称为数据源
- 没有输出端的算子称为数据汇
- 至少有一个数据源和一个数据汇
数据并行和任务并行
数据并行:让同一操作的多个任务执行再不同的数据子集上。
任务并行:让不同的算子的任务并行计算。
数据交换策略
- 转发策略:接收和发送端一对一
- 广播策略:所有任务都接收执行
- 基于键值的策略:根据一定规则分区处理
- 随机策略:随机执行
并行流处理
数据流是一个可能无限的事件序列
延迟和吞吐
延迟:表示处理一个事件所需的时间 吞吐:衡量系统处理事件能力的指标,系统单位时间可以处理多少事件。取决于事件来的速率,计算系统满载时的性能
当平均延迟越低时吞吐就越高,提高平均延迟的方式
- 优化单个处理速度
- 并行处理
背压
当大数据量涌来,数据会到缓冲区,当缓冲区满了数据丢失,就会产生背压。
数据流上的操作
无状态/有状态处理
- 数据源
- 数据汇
- 转换操作:
- 算子内置
- 自定义函数
- 同时接受多个数据源或产生多条输出流
- 拆分或合并
- 滚动聚合
- 有状态
- 持续更新结果
- 聚合函数满足可结合及可交换的条件
- 窗口操作
- 处理周期范围的场景,可以是时间范围/长度范围
- 滚动窗口:将事件分配到大小固定且互不重叠的桶中
- 滑动窗口:将事件分配到大小固定且允许相互重叠的桶中,单个事件可能在多个筒中
- 会话窗口:同一会话事件,事件间隔划分
- 并行窗口
时间语义
- 处理时间:处理事件的时间,低延迟,不确定性
- 事件时间:事件发生的时间,保证准确性和允许处理延迟和无序的事件
使用事件发生时间可以解决延迟事件和顺序问题
水位线:全局进度指标,可能提前或滞后。对于迟到的事件可以再次处理,写入日志荟修正之前的结果。
状态和一致性模型
- 状态管理
- 状态划分
- 状态恢复
任务故障
- 接收事件放入缓冲区
- 选择性更新内部状态
- 产生输出记录
结果故障
- 至多一次:每个事件最多处理一次,相当于无保障
- 至少一次:每个事件至少处理一次,可能重复,可以采用记录确认解决重复问题
- 精确一次:至少一次为前提,数据重放机制。很大性能开销
- 端对端的精确一次:在整个数据处理管道上结果都是正确的
3、Apache Flink 架构
- flink专注于分布式数据流处理
- 集群管理器:Apache Mesos、YARN、Kubernetes
- 分布式存储:HDFS、S3
- 高可用:zk
组件组成
Java+Scala
- JobManager:主进程,控制单个应用的执行,应用包含JobGraph(逻辑dataflow图)以及资源文件,JobManager将JobGraph转化成ExecutionGraph的物理Dataflow图,交由TaskManager执行。负责集中协调的操作。
- ResourceManager:资源管理,管理处理槽,当没有处理槽时,可以和资源提供者通信,让他们提供而外容器启动更多TaskManager。负责终止空闲的TaskManager
- TaskManager:工作进程,会有多个TaskManager,每个都会有多个处理槽。会向ResourceManager注册处理槽,接到ResourceManager指示后会给JobManager提供一个或多个槽,相同JobManager的槽会产生数据交换
- Dispatcher:提供restful接口用于提交应用,当有应用提交过来会启动一个JobManager