1 什么是Flink
官网定义:Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.
大致的意思就是:Apache Flink是一个分布式大数据处理框架,可对有界数据流和无界数据流进行有状态计算。可部署在各种集群环境,对各种大小的数据规模进行快速计算。
1.1 无界流
有定义开始但没有定义的结束。必须在获取事件数据后立即处理事件,输入是无界的,在任何时间点都不会结束。处理无界数据通常要求以特定顺序(例如事件发生的顺序)获取事件。无界流的处理,也称实时处理或流处理。
用白话说,无界流:就是有一个数据源给你不断的发送数据,比如一个传感器不断的向服务器发送状态信息,比如服务器的实时监控程序。
1.2 有界流
定义了数据的开始和结束。能够在执行任务计算之前,获取所有需要计算的数据。有界流的处理也称为批处理。
用白话说,有界流,就是有限量的静态数据,比如数据库里现在存好的数据,它就是有界的。
2 Flink特点
Flink 功能强大,支持开发和运行多种不同种类的应用程序。在启用高可用选项的情况下,它不存在单点失效问题。事实证明,Flink 已经可以扩展到数千核心,其状态可以达到 TB 级别,且仍能保持高吞吐、低延迟的特性。世界各地有很多要求严苛的流处理应用都运行在 Flink 之上。
Flink的主要特点有:
- 基于事件驱动,支持高性能,高吞吐,低延迟的数据流处理
- 支持 java、python、scala api等开发语言,提供分层的API
- 流(dataStream)批(dataSet)一体化,批数据只是流数据的一个极限特例
- 支持事件处理和无序处理通过DataStream API,基于DataFlow数据流模型
- 在不同的时间语义下,支持灵活的窗口(时间,滑动、翻滚,会话,自定义触发器),支持乱序数据的处理
- 支持有状态计算的Exactly-once(仅处理一次)容错保证
- 支持基于轻量级分布式快照checkpoint机制实现的容错
- 支持savepoints 机制,在升级应用或者处理历史数据是能够做到无状态丢失和最小停机时间
- 支持大规模的集群模式,支持yarn、Mesos。可运行在成千上万的节点上
- 自动反压机制
- 高效的自定义内存管理
- 图处理(批) 机器学习(批) 复杂事件处理(流)
3 Flink与其他实时框架的区别
3.1 数据模型
spark 采用 RDD 模型,spark streaming 的 DStream 实际上也就是一组组小批数据 RDD 的集合(微批处理)
flink 基本数据模型是数据流,以及事件(Event)序列
3.2 运行时架构
spark 是批计算,将 DAG 划分为不同的 stage,一个完成后才可以计算下一个
flink 是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理
3.3 各框架总体区别
Spark Streaming | Flink | Storm | |
设计理念 | 流是批的特例 | 批是流的特例 | 事件驱动 |
时间语义 | 处理时间 | 事件时间,注入时间,处理时间 | 事件时间,处理时间 |
窗口 | 滑动窗口 | 滚动窗口、滑动窗口、会话窗口 | 新版本也开始支持滚动窗口和滑动窗口 |
一致性 | Exactly-Once | Exactly-Once | At-Least-Once,通过Trident可以实现Exactly-Once |
反压 | 支持 | 支持 | 支持 |
延迟 | 秒级 | 毫秒级 | 毫秒级 |
吞吐量 | 高 | 高 | 低 |
容错性 | RDD checkpoint | checkpoint | Record ACKs |
状态 | 支持(DStream) | 支持(Operators) | 不支持 |
流批一体 | 支持 | 支持 | 不支持 |
开发难度 | 较容易,多语言API | 容易,多语言API和SQL | 较难 |
机器学习 | 支持(MLlib) | 支持(FlinkML) | 不支持 |
社区 | 活跃 | 活跃 | 活跃较低 |
flink自身提供了不同级别的抽象来支持我们开发流式或者批处理程序,上图描述了Flink 支持的四种不同级别的抽象。
Stateful Stream Processing
- 位于最底层, 是core API 的底层实现
- processFunction (处理函数)
- 利用低阶,构建一些新的组件或者算子
- 灵活性高,但开发比较复杂
- 表达性最强,可以操作状态,time等
Core API
- DataSet - 批处理 API
- DataStream –流处理 API
- 封装了一些算子
Table API & SQL
- 构建在Table 之上,都需要构建Table 环境
- 不同的类型的Table 构建不同的Table 环境
- Table 可以与DataStream或者DataSet进行相互转换
- Streaming SQL不同于存储的SQL,最终会转化为流式执行计划