Flink

206 阅读5分钟

1、状态流处理概述

提供直观且极富表达力的API来实现有状态的流处理应用。

传统数据处理框架

  • 事务型处理:单体->微服务
  • 分析型处理:通过提取->转换->加载将事务型的数据库的数据提取到数据仓库【分析型数据库】。批处理的形式。HDFS、S3、HBase
    • 定时报表
    • 实时数据

状态化流处理

有状态的连续事件流处理

flink解决数据丢失一致性问题: flink本地会保存本地的状态到本地内存或者嵌入式数据库。状态保护会设置检查点保存到远程数据库,用于数据的恢复等故障处理。一般会结合kafka使用,记录消费点和检查点可以重新执行。

以事件日志形式保存,日志都是追加的,顺序是保证的。当系统出现故障时就会利用检查点恢复消费位置,重新消费

事件驱动型应用

不同应用间通过事件日志进行连接,上游写下游读,各自管理状态,使应用间解耦。

应用场景

  • 实时推荐
  • 模式识别或复杂事件处理
  • 异常检测

数据管道

系统间的数据同步,使用日志

流式分析

实时计算入库

  • 手机网络质量监控
  • 移动应用中的用户行为分析
  • 消费者技术中的实时数据分析

引擎历史

  • 第一代2011Lamada结构:批处理和实时计算存储到提速表,批处理写入后删除提速表,应用查询时汇总两部分数据
  • 第二代2013:依旧依赖时间到来的时间和顺序
  • 第三代2015:抛弃lamada

提供精确一次( exactly-once )的状态一致性保障??

使用

flink.apache.org/

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