1.什么是 Flink
Flink是一个分布式流处理框架,起源于柏林工业大学的一个研究性项目,2014年,该项目孵化出Flink,并将其捐赠给Apache,之后成为Apache的顶级项目。Flink的核心是流处理,但它也能支持批处理,将批处理视为流处理的一种特殊情况,即数据流具有明确的界限。
Flink的特性包括:
- 可以一定程度上处理乱序数据流
- 有状态并且容错,可以无缝地从失败中恢复,并可以保持exactly-once的一致性保证。
- 支持灵活的基于时间窗口、计数或会话数据驱动的窗口。
- 高吞吐量和低延迟。
- 提供版本控制机制,能够更新应用程序或再加工历史数据,而无需担心数据丢失。
Flink的架构采用分层的设计,包括API层、Runtime核心层以及物理部署层等。
Flink 将所有数据看做流式数据,流分为无界流和有界流,比如批处理就是有界流。流内的一条数据看做一条「事件」。
2.flink 在流式处理上面的优势
主要包括:
- 高吞吐量和低延迟:Flink的流处理引擎需要很少的配置就能实现高吞吐率和低延迟。Flink被设计为一个“原生”的流处理引擎,处理真实的事件流,而不是像其他系统那样将流处理作为一系列微批处理操作,这种设计使得Flink可以实现非常低的延迟和高吞吐量。
- 支持Event Time和乱序事件:Flink支持流处理和Event Time语义的窗口机制,使得计算乱序到达的事件或可能延迟到达的事件更加简单。
- 状态计算的exactly-once语义:流程序可以在计算过程中维护自定义状态,Flink的checkpointing机制保证了即使在故障发生下也能保障状态的exactly-once语义。
- 高度灵活的流式窗口:Flink支持在时间窗口、统计窗口、session窗口以及数据驱动的窗口(自定义窗口等),窗口可以通过灵活的触发条件来定制,以支持复杂的流计算模式。
- 带反压的连续流模型:数据流应用执行的是不间断的(常驻)operators,Flink streaming在运行时有着天然的流控,慢的数据sink节点会反压(backpressure)快的数据源(sources)。
- 容错性:Flink的容错机制是基于Chandy-Lamport distributed snapshots来实现的,这种机制非常轻量级,允许系统拥有高吞吐率的同时还能提供强一致性的保障。
- 支持批处理和流处理:Flink为流处理和批处理应用共用一个通用的引擎,批处理应用可以以一种特殊的流处理应用高效地运行。
- 内存管理:Flink在JVM中实现了自己的内存管理,应用可以超出主内存的大小限制,并且承受更少的垃圾收集的开销
- 管道化的执行:Flink使用管道化的数据流执行,数据在算子之间直接传输,而不需要等待整个数据批次处理完成,这减少了数据在算子之间的等待时间,从而降低了延迟。
3.与 spark 相比较
Flink 与 Spark 的应用和主要处理场景区别如下:
数据处理模型
- Flink:基于事件驱动的流式处理,支持精确事件时间处理和状态管理。底层使用自带的执行引擎处理数据流。
- Spark:基于批处理和微批处理模型,支持RDD(弹性分布式数据集)、DataFrame和Dataset。虽然Spark Structured Streaming也实现了流处理,但在事件时间处理和状态管理上相对Flink有所欠缺。
实时性与延迟
- Flink:以其低延迟和高吞吐量著称,是真正的流处理引擎,可以实现非常低的延迟。
- Spark:虽然支持流处理,但实时性稍逊于Flink,更适合处理批量数据和一些需要近实时处理的场景。
状态管理和容错性
- Flink:内置的状态管理机制支持流式任务的状态管理和容错性,保证数据的一致性。
- Spark:对状态管理相对较弱,依赖外部存储如HDFS,容错性有一定限制。
生态系统与集成
- Flink:与Hadoop兼容性很好,支持多种数据源和接收器,可以与不同的存储系统和消息队列无缝集成。
- Spark:提供了丰富的API和支持多种编程语言,如Scala、Java、Python等,但集成工具和插件相对较少。
4.适合场景
-
Flink:
- 精确的事件处理:如金融交易、实时监控等。
- 实时流式应用:如实时推荐、网络监控等。
- 迭代计算:如图计算、机器学习等需要迭代计算的场景(这方面也较弱)。
-
Spark:
- 大规模批处理:如数据清洗、ETL等。
- 交互式分析:支持交互式查询和数据探索,适用于数据科学家和分析师。
- 机器学习:Spark MLlib提供了丰富的机器学习库,用于大规模数据的机器学习应用。