Flink的介绍及应用
一、概述
Flink 是一种开源的分布式计算框架,专为处理大规模数据流而设计。它能够在低延迟和高吞吐的场景下高效地处理实时和批量数据。Flink 的全称是 Apache Flink,它是 Apache 软件基金会的顶级项目之一。
二、初识Flink
- 2010年,Flink 最早由 Data Artisans(后来的阿里巴巴 Flink 团队)开发。Flink 的前身是 Stratosphere 项目,这个项目在德国柏林的 Humboldt University(洪堡大学)由 Costin Raiciu 和 Kostas Tzoumas 等人发起。Stratosphere 项目是为了应对大规模数据处理,特别是在流式数据和批量数据的统一处理方面的挑战。
- 2014年,Stratosphere 进入 Apache 孵化器并更名为 Flink,开始专注于流处理。
- 2015年,Flink 从孵化器毕业,成为 Apache 顶级项目。
- 2016年,发布首个稳定版本 1.0,标志着其正式进入生产可用阶段。
三、Flink的核心特点
- 统一的流处理和批处理架构:Flink 的核心是一个流处理引擎,所有的数据都被视为数据流。实时流处理:Flink 能够实时处理无限的数据流(如事件日志、传感器数据)。批处理:Flink 将批处理视为有限数据流的特例,因此可以高效地处理批量数据。
- 低延迟和高吞吐:Flink 支持事件驱动的计算模型,能够以毫秒级延迟处理数据,同时保持高吞吐量。
- 事件时间支持:Flink 对事件时间有原生支持,可以根据数据的发生时间(而非到达时间)进行处理。这使得 Flink 能够处理乱序数据和延迟数据。
- 分布式计算和容错机制:Flink 提供了分布式执行环境,能够在多节点集群中运行任务。无论是流处理还是批处理,Flink 都支持一致的 状态管理 和 容错机制。Flink 在流处理任务中通过 检查点 和 保存点 保障状态一致性,而在批处理任务中也可以通过类似的机制来确保数据处理的一致性和容错。
- 跨语言支持:允许使用 Java、Scala、Python 等语言进行流处理和批处理。通过 PyFlink,Python 用户可以在 Flink 上执行数据处理任务。Flink 还支持统一的 SQL 接口、REST API 和跨语言 UDFs,方便不同语言的开发者协作与集成。
- 丰富的 API:Flink 提供丰富的 API,包括 DataStream(流处理)、DataSet(批处理)、Table API & SQL(声明式查询)、CEP(复杂事件处理)、Stateful Functions(有状态函数)和 Gelly(图计算),支持多样化的数据处理需求,适用于实时、批量和复杂事件场景。
- 扩展性强:Flink 提供了丰富的连接器,可轻松集成 Kafka、Hadoop、HBase 等外部系统,同时还支持插件化架构,方便开发者扩展功能。
四、Flink的核心组件
- JobManager(任务调度与协调):负责接收用户提交的作业,将其拆分为任务并分配给 TaskManager,同时管理作业的执行状态、检查点和故障恢复,是集群的“大脑”。
- TaskManager(任务执行与计算):负责运行 JobManager 分配的任务,处理数据计算,管理任务的内存、网络和状态,并与其他 TaskManager 通信以完成数据交换。
- Dispatcher(作业提交入口):提供 REST 接口,接收用户提交的作业并将其传递给 JobManager,支持多租户和交互式作业提交。
- DataStream/DataSet API(流批处理编程接口):DataStream API 用于处理无界数据流,DataSet API 用于处理有界数据集,提供丰富的操作符支持复杂计算。
- State(状态管理):用于存储任务在计算过程中的中间结果和上下文信息,支持键控状态(Keyed State)和算子状态(Operator State),确保数据处理的连续性和一致性。
- Checkpoint(检查点机制):通过分布式快照定期保存任务的状态,用于故障恢复,提供精确一次(Exactly-Once)语义保障,确保数据处理的准确性和可靠性。
五、Flink和其它框架的对比
特点 | Flink | Spark | Storm |
---|---|---|---|
处理模式 | 流为核心,批处理是流的特例 | 批为核心,流处理通过微批实现 | 原生流处理 |
事件时间支持 | 原生支持 | 需借助第三方库(Structured Streaming) | 不支持 |
状态管理 | 原生支持 | 基本支持(需要扩展) | 依赖外部存储 |
延迟 | 毫秒级 | 毫秒至秒级 | 毫秒级 |
容错机制 | 支持 Checkpoint 和状态恢复 | 支持 | 需手动实现 |
六、Flink应用
1、应用实例
本实例基于 Spring Boot 集成 Flink、RabbitMQ 和 ClickHouse,实现了一个实时超速分析功能。该功能从 RabbitMQ 接收车辆定位数据,通过 Flink 进行实时分析,判断是否发生超速报警,并将分析结果写入 ClickHouse 数据库。
2、项目结构
src/main/java└── com.cnstar.gps.flink├── config│ ├── FlinkConfig.java // Flink 配置类│ ├── RabbitMQConfig.java // RabbitMQ 配置类├── entity│ ├── LocationData.java // 定位数据实体类│ ├── OverspeedResult.java // 超速结果实体类├── mapper│ └── OverspeedResultMapper.java // MyBatis-Plus Mapper 接口├── job│ └── OverspeedProcessJob.java // Flink 超速分析任务└── Application.java // Spring Boot 启动类