什么是 Flink
Apache Flink 是一个分布式计算框架,它能够对有界和无界的数据流进行高效的处理。
- 有界数据:即批数据(离线数据),具有已定义的起止位置,属于静态数据集
- 无界数据:即流式数据(实时数据),无已定义的结束位置,属于动态数据集
Flink 特点
在官方的介绍中,Flink 具有以下优势:
- Deploy Applications Anywhere:Flink 集成了所有常见的集群资源管理器,例如 Hadoop YARN、Apache Mesos 和 Kubernetes,也可以设置为作为独立集群运行
- Run Applications at any Scale:Flink 的设计目标就是为了支撑任意规模、有状态流应用程序的运行,应用程序被并行化为分布式集群中的数千个任务,因此,可以利用几乎无限量的 CPU、主内存、磁盘和网络 IO
- Leverage In-Memory Performance:在 Flink 中,任务状态始终保存在内存中,因此,任务通过访问本地的状态(通常在内存中)来执行所有计算,从而产生非常低的处理延迟
综合所有方面来看,Flink 具有以下特点:
- 支持 Scala 和 Java API
- 支持批流一体
- 同时支持高吞吐、低延迟、高性能
- 支持事件时间和处理时间语义,基于事件时间语义能够针对无序事件提供精确、一致的结果;基于处理时间语义能够用在具有极低延迟需求的应用中
- 支持不同时间语义下的窗口编程
- 支持有状态计算
- 支持具有 Backpressure 功能的持续流模型
- 提供精确一次(exactly once)的状态一致性保障
- Flink 在 JVM 内部实现了自己的内存管理
- 基于轻量级的分布式快照 CheckPoint 的容错
- 支持 SavePoint 机制,手工触发,适用于升级
- 支持高可用性配置(无单点失效),与 k8s、Yarn、Apache Mesos 紧密集成。
- 提供常见存储系统的连接器:Kafka,Elasticsearch 等
- 提供详细、可自由定制的系统及应用指标(metrics)集合,用于提前定位和响应问题
与其他框架的对比
指标/框架 | Flink | Spark | Storm | Storm-Trident |
---|---|---|---|---|
处理模型 | Native | Micro-Batch | Native | Micro-Batch |
处理语义 | Exactly-Once | Exactly-Once | At-Least-Once | Exactly-Once |
容错 | CheckPoint | CheckPoint | Ack | Ack |
吞吐量 | High | High | Low | Medium |
延迟 | Low | High | High | Very Low |
Flink 集群架构
Flink 的架构与大数据中常见的分布式架构(如 HDFS、HBase、Spark 等)相似,都遵循主从模式。
下图为官方提供的 Flink 架构图:
图中蓝色部分为 Flink 核心组件:
组件名 | 组件职责 | 实现 |
---|---|---|
Flink Client | Flink 客户端,可以将作业提交给 JobManager | Command Line Interface、REST Endpoint、SQL Client、Python REPL、Scala REPL |
JobManager | Flink 的中心协调组件 | Standalone、Kubernetes、YARN、Mesos |
TaskManager | 执行 Flink 作业的进程 |
橙色部分为外部支撑组件:
组件名 | 组件职责 | 实现 |
---|---|---|
High Availability Service Provider | 高可用性服务提供商,支撑 JobManager 运行在高可用模式下 | Zookeeper、Kubernetes HA |
File Storage and Persistency | 外部文件系统(用于支撑 checkpoint 等功能) | HDFS、Alluxio、阿里云 OSS |
Resource Provider | 资源提供者 | Yarn、Mesos、Kubernetes |
Metrics Storage | Flink 指标模块,用于暴露运行时指标 | JMX、InfluxDB、Prometheus |
Flink 核心概念
概念 | 说明 |
---|---|
Task | 一个阶段多个功能相同 subTask 的集合,类似于 Spark 中的 TaskSet。 |
SubTask | Flink 中任务最小执行单元,是一个 Java 类的实例,这个 Java 类中有属性和方法,完成具体的计算逻辑。 |
Slot | Flink 中计算资源进行隔离的单元,一个 Slot 中可以运行多个 subTask,但是这些 subTask 必须是来自同一个 application 的不同阶段的 subTask。 |
State | Flink 在运行过程中计算的中间结果。 |
Source | Flink 作业的数据源,可以是本地文件、Socket、Kafka 等。 |
Transformation | 负责数据处理的算子&# |