一、Flink是什么1.1 官方定义Apache Flink是一个分布式、高性能、高可用、精确的流处理框架支持实时流处理和批处理。Flink的核心是一个流式数据流引擎为数据流上的分布式计算提供数据分发、通信和容错功能。Flink官网https://flink.apache.org/1.2 核心定位Flink的定位非常明确以流处理为核心实现流批统一。在Flink的世界观中批处理只是流处理的一种特例——有界数据流Bounded Stream的处理。这种设计理念让Flink从根本上避免了批处理和流处理两套API的割裂问题。二、Flink的核心特点2.1 流批统一Stream-Batch UnificationFlink最显著的特点就是流批统一。从Flink 1.12开始官方推荐使用DataStream API统一处理流和批通过设置执行模式来切换# 流处理模式默认-Dexecution.runtime-modeSTREAMING# 批处理模式-Dexecution.runtime-modeBATCH# 自动模式根据数据源是否有界自动选择-Dexecution.runtime-modeAUTOMATIC这种统一带来的好处✅一套API无需维护两套代码降低开发和维护成本✅统一语义相同的业务逻辑流和批保证一致的结果✅灵活切换同一套代码通过参数即可切换执行模式2.2 精确的时间语义支持Flink支持三种时间语义时间语义定义适用场景特点事件时间Event Time数据本身携带的时间戳乱序数据、日志分析最准确需配合Watermark使用处理时间Processing Time数据被处理时的机器时间实时性要求极高、低延迟最简单但不精确摄入时间Ingestion Time数据进入Flink的时间介于两者之间无需Watermark有一定顺序保证事件时间是Flink最强大的特性之一。在实际生产环境中数据往往由于网络延迟、系统故障等原因产生乱序事件时间语义配合Watermark机制可以在保证一定延迟的前提下正确处理乱序数据。2.3 强大的窗口机制Flink提供了丰富的窗口类型2.4 精确一次的状态一致性Flink通过Checkpoint机制实现精确一次Exactly-Once的状态一致性周期性触发自动保存分布式快照Barrier对齐保证所有算子状态的一致性状态后端支持内存HashMap和磁盘RocksDB两种存储增量Checkpoint只保存状态变更提升效率2.5 高吞吐与低延迟Flink通过以下机制实现高吞吐和低延迟的平衡算子链Operator Chain将多个算子合并为一个Task减少线程切换和网络传输Slot共享不同Task的子任务可以共享Slot提高资源利用率异步Checkpoint快照保存不阻塞数据处理背压机制Backpressure自动调节数据流速防止下游过载三、Flink vs Spark Streaming全方位对比3.1 计算模型对比对比维度FlinkSpark Streaming计算模型真正的流计算Native Streaming微批处理Micro-Batch数据抽象DataStream流DStream微批延迟毫秒级Milliseconds秒级Seconds吞吐量高百万条/秒/节点较高依赖批处理优化核心差异图解3.2 时间语义对比特性FlinkSpark Streaming事件时间支持✅ 原生支持核心特性❌ 仅支持处理时间Watermark机制✅ 内置灵活配置❌ 无乱序数据处理✅ 通过Watermark完美支持❌ 不支持3.3 窗口机制对比特性FlinkSpark Streaming窗口类型丰富滚动/滑动/会话/计数简单基于批处理时间窗口灵活性高窗口大小任意指定低必须是批处理间隔的整数倍会话窗口✅ 原生支持❌ 不支持// Flink灵活的窗口定义stream.keyBy(data-data.userId).window(TumblingEventTimeWindows.of(Time.seconds(5)))// 5秒滚动窗口.aggregate(newMyAggregateFunction());// Spark Streaming窗口必须是批间隔的整数倍val windowedStreamstream.window(Seconds(10),Seconds(5))// 窗口大小和滑动步长3.4 状态管理对比特性FlinkSpark Streaming状态支持✅ 内置强大的状态管理❌ 无内置状态需借助外部存储状态类型ValueState/ListState/MapState等无容错机制Checkpoint自动保存状态需手动实现或借助外部系统3.5 流式SQL支持特性FlinkSpark Streaming流式SQL✅ 原生支持功能完善❌ 结构化流Structured Streaming支持有限Table API✅ 与SQL统一✅ Spark SQL批处理为主3.6 综合对比表对比项FlinkSpark Streaming计算模型流计算微批处理时间语义事件时间、处理时间处理时间窗口多、灵活少、不灵活窗口必须是批次的整数倍状态有内置强大状态管理没有流式SQL有原生支持没有延迟毫秒级秒级适用场景实时性要求高的场景准实时、批流统一场景四、Flink的应用场景4.1 实时数据处理4.2 实时数仓实时ETL4.3 事件驱动应用4.4 机器学习实时推理五、Flink分层API设计Flink提供了四层API从抽象到具体满足不同层次的开发需求5.1 SQL/Table API层-- 使用SQL实现WordCountSELECTword,COUNT(*)ascountFROMword_tableGROUPBYword;适用场景数据分析、报表统计、快速原型验证5.2 DataStream API层// 使用DataStream API实现WordCountDataStreamTuple2String,IntegerwordCountstext.flatMap(newTokenizer()).keyBy(value-value.f0).sum(1);适用场景实时ETL、流处理业务逻辑、大多数生产环境5.3 ProcessFunction层// 使用ProcessFunction实现复杂逻辑classMyProcessFunctionextendsKeyedProcessFunctionString,Event,Result{privateValueStateIntegerstate;Overridepublicvoidopen(Configurationparameters){stategetRuntimeContext().getState(newValueStateDescriptor(myState,Types.INT));}OverridepublicvoidprocessElement(Eventevent,Contextctx,CollectorResultout){// 访问时间戳longtimestampctx.timestamp();// 注册定时器ctx.timerService().registerEventTimeTimer(timestamp5000);// 访问和更新状态Integercurrentstate.value();state.update(currentnull?1:current1);// 输出到侧输出流ctx.output(outputTag,event);}OverridepublicvoidonTimer(longtimestamp,OnTimerContextctx,CollectorResultout){// 定时器触发时的逻辑}}适用场景复杂事件处理CEP、自定义窗口逻辑、状态机实现总结Flink的核心优势优势说明真正的流处理毫秒级延迟非微批模拟流批统一一套API两种模式降低开发和维护成本精确的时间语义事件时间Watermark正确处理乱序数据强大的状态管理内置多种状态类型自动容错恢复丰富的窗口机制满足各种时间窗口和计数窗口需求分层API设计从SQL到底层API满足不同开发需求如果本文对你有帮助欢迎点赞、收藏、关注有任何问题欢迎在评论区留言讨论。专栏持续更新中关注不迷路
Flink概述:是什么、特点与应用场景
发布时间:2026/6/12 3:44:11
一、Flink是什么1.1 官方定义Apache Flink是一个分布式、高性能、高可用、精确的流处理框架支持实时流处理和批处理。Flink的核心是一个流式数据流引擎为数据流上的分布式计算提供数据分发、通信和容错功能。Flink官网https://flink.apache.org/1.2 核心定位Flink的定位非常明确以流处理为核心实现流批统一。在Flink的世界观中批处理只是流处理的一种特例——有界数据流Bounded Stream的处理。这种设计理念让Flink从根本上避免了批处理和流处理两套API的割裂问题。二、Flink的核心特点2.1 流批统一Stream-Batch UnificationFlink最显著的特点就是流批统一。从Flink 1.12开始官方推荐使用DataStream API统一处理流和批通过设置执行模式来切换# 流处理模式默认-Dexecution.runtime-modeSTREAMING# 批处理模式-Dexecution.runtime-modeBATCH# 自动模式根据数据源是否有界自动选择-Dexecution.runtime-modeAUTOMATIC这种统一带来的好处✅一套API无需维护两套代码降低开发和维护成本✅统一语义相同的业务逻辑流和批保证一致的结果✅灵活切换同一套代码通过参数即可切换执行模式2.2 精确的时间语义支持Flink支持三种时间语义时间语义定义适用场景特点事件时间Event Time数据本身携带的时间戳乱序数据、日志分析最准确需配合Watermark使用处理时间Processing Time数据被处理时的机器时间实时性要求极高、低延迟最简单但不精确摄入时间Ingestion Time数据进入Flink的时间介于两者之间无需Watermark有一定顺序保证事件时间是Flink最强大的特性之一。在实际生产环境中数据往往由于网络延迟、系统故障等原因产生乱序事件时间语义配合Watermark机制可以在保证一定延迟的前提下正确处理乱序数据。2.3 强大的窗口机制Flink提供了丰富的窗口类型2.4 精确一次的状态一致性Flink通过Checkpoint机制实现精确一次Exactly-Once的状态一致性周期性触发自动保存分布式快照Barrier对齐保证所有算子状态的一致性状态后端支持内存HashMap和磁盘RocksDB两种存储增量Checkpoint只保存状态变更提升效率2.5 高吞吐与低延迟Flink通过以下机制实现高吞吐和低延迟的平衡算子链Operator Chain将多个算子合并为一个Task减少线程切换和网络传输Slot共享不同Task的子任务可以共享Slot提高资源利用率异步Checkpoint快照保存不阻塞数据处理背压机制Backpressure自动调节数据流速防止下游过载三、Flink vs Spark Streaming全方位对比3.1 计算模型对比对比维度FlinkSpark Streaming计算模型真正的流计算Native Streaming微批处理Micro-Batch数据抽象DataStream流DStream微批延迟毫秒级Milliseconds秒级Seconds吞吐量高百万条/秒/节点较高依赖批处理优化核心差异图解3.2 时间语义对比特性FlinkSpark Streaming事件时间支持✅ 原生支持核心特性❌ 仅支持处理时间Watermark机制✅ 内置灵活配置❌ 无乱序数据处理✅ 通过Watermark完美支持❌ 不支持3.3 窗口机制对比特性FlinkSpark Streaming窗口类型丰富滚动/滑动/会话/计数简单基于批处理时间窗口灵活性高窗口大小任意指定低必须是批处理间隔的整数倍会话窗口✅ 原生支持❌ 不支持// Flink灵活的窗口定义stream.keyBy(data-data.userId).window(TumblingEventTimeWindows.of(Time.seconds(5)))// 5秒滚动窗口.aggregate(newMyAggregateFunction());// Spark Streaming窗口必须是批间隔的整数倍val windowedStreamstream.window(Seconds(10),Seconds(5))// 窗口大小和滑动步长3.4 状态管理对比特性FlinkSpark Streaming状态支持✅ 内置强大的状态管理❌ 无内置状态需借助外部存储状态类型ValueState/ListState/MapState等无容错机制Checkpoint自动保存状态需手动实现或借助外部系统3.5 流式SQL支持特性FlinkSpark Streaming流式SQL✅ 原生支持功能完善❌ 结构化流Structured Streaming支持有限Table API✅ 与SQL统一✅ Spark SQL批处理为主3.6 综合对比表对比项FlinkSpark Streaming计算模型流计算微批处理时间语义事件时间、处理时间处理时间窗口多、灵活少、不灵活窗口必须是批次的整数倍状态有内置强大状态管理没有流式SQL有原生支持没有延迟毫秒级秒级适用场景实时性要求高的场景准实时、批流统一场景四、Flink的应用场景4.1 实时数据处理4.2 实时数仓实时ETL4.3 事件驱动应用4.4 机器学习实时推理五、Flink分层API设计Flink提供了四层API从抽象到具体满足不同层次的开发需求5.1 SQL/Table API层-- 使用SQL实现WordCountSELECTword,COUNT(*)ascountFROMword_tableGROUPBYword;适用场景数据分析、报表统计、快速原型验证5.2 DataStream API层// 使用DataStream API实现WordCountDataStreamTuple2String,IntegerwordCountstext.flatMap(newTokenizer()).keyBy(value-value.f0).sum(1);适用场景实时ETL、流处理业务逻辑、大多数生产环境5.3 ProcessFunction层// 使用ProcessFunction实现复杂逻辑classMyProcessFunctionextendsKeyedProcessFunctionString,Event,Result{privateValueStateIntegerstate;Overridepublicvoidopen(Configurationparameters){stategetRuntimeContext().getState(newValueStateDescriptor(myState,Types.INT));}OverridepublicvoidprocessElement(Eventevent,Contextctx,CollectorResultout){// 访问时间戳longtimestampctx.timestamp();// 注册定时器ctx.timerService().registerEventTimeTimer(timestamp5000);// 访问和更新状态Integercurrentstate.value();state.update(currentnull?1:current1);// 输出到侧输出流ctx.output(outputTag,event);}OverridepublicvoidonTimer(longtimestamp,OnTimerContextctx,CollectorResultout){// 定时器触发时的逻辑}}适用场景复杂事件处理CEP、自定义窗口逻辑、状态机实现总结Flink的核心优势优势说明真正的流处理毫秒级延迟非微批模拟流批统一一套API两种模式降低开发和维护成本精确的时间语义事件时间Watermark正确处理乱序数据强大的状态管理内置多种状态类型自动容错恢复丰富的窗口机制满足各种时间窗口和计数窗口需求分层API设计从SQL到底层API满足不同开发需求如果本文对你有帮助欢迎点赞、收藏、关注有任何问题欢迎在评论区留言讨论。专栏持续更新中关注不迷路