1. Flink基础入门:发展历史、核心特性、应用场景与Spark Streaming对比

各位同学好,我是老张。做实时计算这些年,从Storm到Spark Streaming再到Flink,算是亲眼看着这个领域一步步成熟起来的。今天咱们先聊聊Flink的来龙去脉,以及它凭什么能在实时计算领域站稳脚跟。

1.1 Flink的发展历史

Flink的故事得从2010年说起。那时候柏林工业大学有个研究项目,叫"Stratosphere"——说白了就是做大数据分析的基础研究。我2014年刚接触它时,这玩意儿还叫Stratosphere,社区小得可怜。

2014年,Stratosphere的代码被捐给了Apache软件基金会,正式更名为Flink。嗯,这个名字挺有意思——德语里"Flink"是敏捷、灵巧的意思。同年12月,Flink成为Apache顶级项目。

真正让Flink火起来的,是2015年那场著名的"Flink Forward"大会。我记得当时阿里的人上台分享,说他们用Flink替换了Storm,性能提升了好几倍。从那以后,Flink在国内的势头就一发不可收拾。

2019年,阿里巴巴收购了Flink的母公司Data Artisans,随后开源了Blink——也就是阿里内部基于Flink改造的版本。Flink 1.9版本合并了Blink的大量特性,批流一体正式成为现实。

到现在,Flink已经发展到1.18版本,社区活跃度在Apache项目中排前三。我个人的感觉是,Flink已经从一个"实时计算引擎"进化成了"统一的数据处理平台"。

关键时间节点:

  • 2010年:柏林工业大学启动Stratosphere项目
  • 2014年:捐给Apache,更名Flink,成为顶级项目
  • 2015年:Flink Forward大会,阿里大规模使用
  • 2019年:阿里收购Data Artisans,合并Blink
  • 2023年:Flink 1.18发布,批流一体成熟

1.2 核心特性

Flink凭什么能后来居上?我总结了几个核心特性,你品品。

1.2.1 真正的流式处理

Spark Streaming其实是个"微批"——把流切成小批次,每个批次当成离线任务跑。Flink不一样,它是真正的逐条处理。每条数据来了,立即处理,延迟在毫秒级。

为什么会这样?因为Flink的设计哲学就是"流是本质,批是特例"。它把批处理看作"有界流",用同一套引擎跑。我在项目中遇到过很多场景,用Spark Streaming做秒级延迟的监控,总是差那么点意思,换成Flink后问题迎刃而解。

1.2.2 精确一次语义

做实时计算最怕什么?数据丢或者重复。Flink通过分布式快照(Checkpoint)机制,保证了精确一次语义。说白了,就是每条数据恰好被处理一次,不多不少。

我曾经帮一个金融客户做风控系统,数据重复意味着重复扣款,那问题就大了。Flink的Checkpoint机制配合Kafka的幂等写入,完美解决了这个问题。

1.2.3 事件时间处理

这个特性太重要了。很多场景下,数据到达时间和事件发生时间不是一回事。比如用户凌晨1点下单,但因为网络延迟,3点才到系统。如果按处理时间算,这笔订单就算到3点了,明显不对。

Flink支持事件时间语义,配合Watermark机制,能正确处理乱序数据。我建议你在做时间相关的统计时,优先用事件时间。

1.2.4 状态管理与容错

Flink把状态管理做到了极致。它提供了多种状态后端——内存、RocksDB、文件系统。状态可以自动保存和恢复,节点挂了也不怕。

我记得有一次线上集群一台机器宕机,Flink自动把任务迁移到其他节点,状态从Checkpoint恢复,整个过程不到30秒,业务几乎无感知。

避坑指南:状态大小要控制好。我曾经见过有人把全量用户画像存到状态里,结果RocksDB撑爆了磁盘。建议定期清理过期状态,或者用TTL自动过期。

1.3 应用场景

Flink能干什么?我列几个典型的场景,你看看是不是你正在做的。

场景 典型应用 为什么选Flink
实时数仓 实时ETL、实时报表 批流一体,SQL友好
实时风控 反欺诈、异常检测 毫秒级延迟,精确一次
实时推荐 用户画像、实时特征 状态管理强大,事件时间支持
实时监控 业务监控、APM 低延迟,高吞吐
CDC同步 数据库变更捕获 Flink CDC连接器丰富

我最近做的一个项目,就是用Flink CDC实时同步MySQL数据到ClickHouse。以前用Canal+Kafka+Spark Streaming,链路长、维护成本高。换成Flink CDC一条链路搞定,代码量减少了一半。

1.4 Flink与Spark Streaming对比

这个问题面试必问,也是选型时必须想清楚的。我直接上对比表。

维度 Flink Spark Streaming
处理模型 真正的流式,逐条处理 微批处理,批次间隔
延迟 毫秒级 秒级(取决于批次间隔)
事件时间 原生支持,Watermark机制 支持,但实现复杂
状态管理 内置状态后端,自动容错 依赖外部存储(如Redis)
SQL支持 动态表,持续查询 结构化流,微批SQL
批流一体 原生设计 两套API
社区活跃度 极高,阿里主导 高,Databricks主导

说说我的个人经验。如果你的场景对延迟要求不高(秒级可以接受),而且团队Spark技术栈很成熟,用Spark Streaming完全没问题。但如果你要做毫秒级风控、实时数仓、CDC同步这些场景,Flink是更好的选择。

注意:不要盲目追新。我见过有人为了用Flink而用Flink,结果团队没人会调优,线上频繁OOM。选型要考虑团队能力、运维成本和业务需求。

1.5 Flink架构概览

最后,咱们用一张图看看Flink的整体架构。这张图我画了很多遍,每次给新人培训都用它。

Flink运行时架构 数据源 Kafka / Pulsar / Socket 数据源 MySQL CDC / Files 数据源 自定义Source Flink运行时集群 JobManager TaskManager TaskManager 状态后端:RocksDB / FsStateBackend / Memory 数据输出 Kafka / Elasticsearch 数据输出 MySQL / ClickHouse 数据输出 自定义Sink JobManager负责调度和协调,TaskManager负责执行任务,状态后端保证容错

这张图展示了Flink的核心架构。数据从各种Source流入,经过Flink集群处理,最终输出到各种Sink。JobManager是大脑,TaskManager是工人,状态后端是记忆。三者配合,实现了高吞吐、低延迟、强一致性的实时计算。

好了,第一章就到这里。Flink的基础概念先有个印象,后面我们会一步步深入,从环境搭建到实战项目,把每个知识点都吃透。