Apache Flink 是一个开源的流处理框架和分布式处理引擎,专门用于对无界(流式)和有界(批处理)数据流进行高效的有状态计算。Flink 的核心设计理念包括:

  1. 流处理优先架构:采用”流批统一”的架构,将批处理视为流处理的一种特例
  2. 分布式执行:支持在YARN、Mesos、Kubernetes等常见集群环境中部署运行
  3. 高性能计算:基于内存执行和优化的网络通信实现低延迟、高吞吐的数据处理
  4. 弹性扩展:可以水平扩展到数千个节点,处理PB级别的数据量

Flink的发展历程

  • 起源:2008年作为柏林工业大学(TU Berlin)的研究项目Stratosphere启动,主要研究大规模数据处理技术
  • 孵化:2014年4月,Stratosphere项目被捐赠给Apache软件基金会,进入孵化器阶段
  • 成熟:2014年12月正式成为Apache顶级项目,并更名为Flink(德语意为”快速”和”灵巧”)
  • 发展:经过多年发展,现已成为最活跃的Apache项目之一,被阿里巴巴、Uber、Netflix等众多知名公司采用

Flink的技术特点

  1. 精确一次的状态一致性(Exactly-once state consistency)
  2. 事件时间处理(Event-time processing)和水位线(Watermark)机制
  3. 分层API:包括SQL/Table API、DataStream API和ProcessFunction API
  4. 容错机制:基于轻量级分布式快照(Checkpoint)实现故障恢复

Flink的生态系统

Flink拥有丰富的生态系统:

  • 连接器(Connectors):支持Kafka、HDFS、JDBC等多种数据源
  • 状态后端(State Backends):提供内存、文件系统、RocksDB等存储选项
  • 部署模式:支持Standalone、YARN、Kubernetes等多种部署方式

Flink特点

Flink是一个开源的批处理框架,它具有以下特点:

  • 批流一体:统一批处理、流处理
  • 分布式:Flink程序可以运行在多个服务器上
  • 高性能:处理性能比较高
  • 高可用:Flink支持高可用性(HA)
  • 准确:Flink可以保证数据处理的准确性

Flink场景

Flink主要用于流式数据分析场景,数据无处不在,绝大多数的企业采取的处理数据的框架都会划分为两类:

  • 事务型处理
  • 分析性处理

事务型处理

  • OLTP:On-Line Transaction Processing 联机事务处理过程
  • 流程审批、数据录入、填报等
  • 特点:线下工作线上化,数据保存在各自的系统中,互不相通(数据孤岛)

OLTP联机事务处理系统以事务元作为数据处理的单位、人机交互的计算机应用系统。它能对数据进行即时更新或其他操作,系统内的数据总是保持在最新状态。

应用主要在:

  • 飞机订票
  • 股票交易
  • 超市销售
  • 饭店前后台管理等等

常见的:ERP、CRM、OA等系统都属于 OLTP 系统。

分析型处理

当数据积累到一定的程度,我们需要对过去发生的事情做一个总结分析时,就需要把过去一段时间内产生的数据拿出来进行统计分析,从中获取我们想要的信息,为公司做决策提供支持,这时候就是在做OLAP了。

OLAP On-Line Analytical Processing:联机分析系统:

  • 分析报表
  • 分析决策
  • 等等

ETL(Extract-Transform-Load):从事务型数据中提取数据,将其转换为通用的表示形式(可能包含数据验证、数据归一化、编码、去重、表模式转换等工作),最终加载到分析型数据库中。

通常数据仓库中的查询可以分为两类:

  • 普通查询:是定制的
  • 即系查询:是用户自定义查询条件的

典型应用场景:

  • 实时ETL:集成流计算现有的诸多数据通道和SQL灵活的加工能力,对流式数据进行实时清洗,归并和结构化处理
  • 实时报表:实时化采集、加工流式数据存储,实时监控和展现业务,客户各类指标
  • 监控预警:对系统和用户行为进行实时监测和分析,以便及时发现危险行为
  • 在线系统:实时计算各类数据指标,并利用实时结果及时调整在线系统的相关策略

Deploy层

  • 可以启动单个JVM,让Flink以Local模式运行
  • Flink也可以以Standalone集群模式运行,同时支持FlinkOnYRAN,Flink应用直接提交到YRAN上面运行
  • Flink还可以运行在谷歌云服务和亚马逊云服务

Core层

在Runtime之上提供了两套核心的API:

  • DataStreamAPI(流处理)
  • DataSet API(批处理)

APIs & Libraries 层

核心API上又扩展了一些高阶的库和API:

  • CEP流处理
  • Table API 和 SQL
  • Flink ML机器学习库
  • Gelly 图计算
  • 输入 Connectors (左侧部分):
    1. 流式处理中包含Kafka(消息队列)、AWS Kinesis(实时数据流服务)、RabbitMQ(消息队列)、NIFI(数据管道)、Cassandra(NoSQL数据库)、Elasticsearch(全文检索)、HDFS(滚动文件)
    2. 批处理方式:包含HBase(分布式列式数据库)、HDFS(分布式文件系统)

Flink处理模型

Flink 流处理与批处理,Flink专注于无限流处理,有限流处理是无限流处理的一种特殊情况。

无限流处理

  • 输入的数据没有尽头,像水流一样源源不断
  • 数据处理从当前或者过去的某一个时间点开始,持续不停地进行

有限流处理

  • 从某一个时间点开始处理数据,然后在另一个时间点结束
  • 输入数据可能本身是有限的(即输入数据集并不会随着时间的增长),也可能出于分析的目的被人为设定为有限集

Flink封装了DataStreamAPI进行流处理,封装了DataSetAPI进行批处理。同时,Flink是一个批流一体的处理引擎,提供了TableAPI/SQL统一批处理和流处理。

流处理引擎的技术选型

市面上的流处理引擎不止Flink一种,其他的Storm、SparkStreaming、Trident等,实际应用如何进行选型:

  • 流数据要进行状态管理,选择使用 Trident、SparkStreaming或者Flink
  • 消息投递需要保证At-least-once(至少一次)或者 Exactly-once(仅一次)不能选择Storm
  • 对于小型独立项目,有低延迟要求,可以选择使用Storm,更简单
  • 如果项目已引入大框架Spark,实时处理需求可以满足的话,建议直接使用Spark中的SparkStreaming
  • 消息投递要满足Exactly-once (仅一次),数据量大、有高吞吐、低延迟要求、要进行状态管理或者窗口统计,建议使用Flink

架构组件

JobManager(作业管理器)

JobManager 是 Flink 集群的核心控制组件,负责整个数据流处理作业的生命周期管理。它的主要职责包括:

  • 任务调度:JobManager 负责将用户提交的作业划分为多个任务,并调度这些任务到不同的 TaskManager 执行
  • 资源管理:它与资源管理系统(如 YARN 或 Kubernetes)进行交互,以分配和管理作业执行所需的资源
  • 故障恢复:当作业中的某个任务失败时,JobManager 负责重新调度该任务并从故障点恢复执行
  • 协调点(Checkpointing):JobManager 负责协调 Flink 的容错机制,通过管理 Checkpointing 来保证作业的状态一致性

TaskManager(任务管理器)

TaskManager 是 Flink 集群中的工作节点,负责执行由 JobManager 分配的具体任务。它的职责包括:

  • 任务执行:TaskManager 接受 JobManager 分配的任务,并执行这些任务。每个 TaskManager 可以同时执行多个任务实例
  • 状态管理:在有状态流处理应用中,TaskManager 负责管理任务的本地状态
  • 数据传输:TaskManager 负责在不同任务之间传输数据

Dispatcher(调度器)

Dispatcher 是一个相对较新的组件,它的主要职责是处理客户端提交的作业,并将这些作业分配给集群中的 JobManager 进行处理。Dispatcher 也管理 Flink 集群的 REST API

ResourceManager(资源管理器)

ResourceManager 负责与集群管理器(如 YARN、Kubernetes、Standalone 等)交互,管理 Flink 作业所需的资源

Client(客户端)

客户端是用户与 Flink 集群交互的入口。用户通过客户端提交作业到 Dispatcher

Flink Runtime 是 Flink 核心数据处理引擎所在的地方。它负责处理数据流、执行用户定义的操作

State Backend(状态后端)

State Backend 是 Flink 中用来存储任务状态的模块。有两种主要的状态后端:

  • 内存状态后端:将状态存储在 TaskManager 的内存中,适用于小规模的作业
  • RocksDB 状态后端:将状态存储在嵌入式的 RocksDB 数据库中,适用于大规模、有状态的流处理应用

Checkpointing 和 Savepoints

Flink 提供了 Checkpointing 和 Savepoints 两种机制来实现容错:

  • Checkpointing:定期将任务的状态保存到分布式存储中,以确保在故障时可以从最近的检查点恢复
  • Savepoints:用户触发的状态快照,可以在程序升级或重新部署时使用

Data Stream 和 Data Set API

  • DataStream API:用于流处理,支持无界和有界数据流
  • DataSet API:用于批处理,支持有界数据集处理

Execution Graph(执行图)

当一个 Flink 作业被提交时,它会被转化为一个执行图(Execution Graph)。执行图描述了作业中的各个任务及其之间的依赖关系