4、Flink入门:Flink发展史、Flink核心特性、Flink应用场景

好,咱们开始聊Flink。这一章算是整个课程的基石。

说实话,在流式计算这个领域,Flink现在几乎是绕不开的存在。我最早接触流式计算的时候,用的还是Storm,后来Spark Streaming火了一阵子。但真正让我觉得「嗯,这东西靠谱」的,还是Flink。为什么?因为它把「流」这件事想得特别透彻。

4.1 Flink发展史:从学术到工业的蜕变

Flink的故事,得从2010年说起。

那时候,柏林工业大学的一个研究团队,搞了个项目叫「Stratosphere」。这名字听着挺科幻,其实就是Flink的前身。他们的目标很纯粹:做一个能同时处理批处理和流处理的统一计算引擎。

2014年,Stratosphere项目中的流处理核心被分离出来,捐赠给了Apache软件基金会,正式更名为Flink。Flink这个名字,德语里是「敏捷、灵巧」的意思。嗯,确实很贴切。

我印象很深的是,2015年左右Flink开始在国内冒头。那时候阿里、美团这些大厂已经开始尝试用Flink替换掉老旧的Storm集群。我记得有个朋友跟我吐槽,说他们Storm的拓扑一挂,状态全丢,恢复起来要命。而Flink的「精确一次」语义和状态恢复机制,简直就是救星。

到了2019年,Flink已经成为Apache软件基金会的顶级项目。社区活跃度、版本迭代速度,都相当惊人。现在,Flink 1.20都出来了,生态也越来越完善。

核心时间线:
  • 2010年:柏林工业大学启动Stratosphere项目
  • 2014年:Flink正式进入Apache孵化器
  • 2015年:Flink 0.9发布,引入DataSet API
  • 2016年:Flink 1.0发布,标志着生产可用
  • 2019年:Flink成为Apache顶级项目
  • 2020年至今:Flink 1.11+,流批一体全面成熟

4.2 Flink核心特性:事件驱动与有状态计算

Flink最核心的两个特性,我理解就是「事件驱动」和「有状态计算」。这两个东西,说白了就是Flink的魂。

4.2.1 事件驱动

什么叫事件驱动?你想想看,传统的处理方式,是把数据一批一批拉过来,然后统一处理。而事件驱动,是来一条数据,就处理一条。每条数据都是一个独立的事件。

举个例子。你在淘宝上点了个「加入购物车」,这就是一个事件。Flink收到这个事件,立刻更新你的购物车状态,然后可能触发推荐、库存扣减等一系列动作。整个过程是实时的,不需要等凑够一批数据再处理。

我个人习惯把事件驱动理解为「随到随处理」。这种模式的好处很明显:延迟低、响应快。在推荐系统里,用户的行为是实时发生的,你不可能等用户刷了10条视频再给他推荐,对吧?

我的经验: 在实时推荐场景中,事件驱动模型天然适合。我曾经在一个广告点击率预估项目里,用Flink的事件驱动模式,把用户点击到模型更新的延迟从分钟级降到了秒级。效果立竿见影。

4.2.2 有状态计算

这个特性,我觉得是Flink最牛的地方。

很多流处理框架,处理完一条数据就忘了。但Flink不一样,它记得。它可以在内存或磁盘里维护一个「状态」,比如用户最近10次点击的商品ID、过去5分钟的滑动窗口平均值等等。

为什么会需要状态?你想想看,推荐系统里,你要判断「用户是否已经看过这个商品」,你得记住用户的历史行为吧?这就是状态。

Flink的状态管理做得特别细致。它支持多种状态后端(比如RocksDB、HashMap),还提供了精确一次的状态一致性保证。就算任务挂了,重启后状态也能恢复,不会丢数据,也不会重复计算。

// 一个简单的有状态计算示例
// 统计每个用户过去5分钟的点击次数
DataStream<ClickEvent> clicks = ...;

clicks
    .keyBy(event -> event.getUserId())
    .window(TumblingProcessingTimeWindows.of(Time.minutes(5)))
    .aggregate(new CountAggregate())
    .print();
避坑指南: 我曾经在一个项目里,状态设置得太大,导致RocksDB频繁读写,性能直线下降。后来我调整了状态TTL(Time-To-Live),把过期的状态清理掉,问题才解决。记住,状态不是越大越好,要合理设置过期策略。

4.3 Flink应用场景:不只是推荐系统

Flink的应用场景其实非常广。我简单列几个常见的:

场景 具体例子 为什么用Flink
实时推荐 用户行为实时触发推荐更新 低延迟、有状态、事件驱动
实时风控 检测异常交易、刷单行为 复杂事件处理(CEP)、精确一次语义
实时数仓 ETL、数据清洗、实时报表 流批一体、SQL支持
实时监控 服务器指标监控、告警 低延迟、高吞吐
物联网 传感器数据实时处理 海量数据接入、状态管理

当然,咱们这门课主要聚焦在推荐系统。但你要知道,Flink的能力远不止于此。我见过有人用Flink做实时数仓,每天处理几百亿条数据,稳得很。

4.4 小结

这一章,咱们聊了Flink的来龙去脉,也聊了它最核心的两个特性:事件驱动和有状态计算。说白了,Flink就是为「实时」而生的。它让你能像处理批数据一样,优雅地处理流数据。

下一章,咱们会动手搭建Flink开发环境,写第一个Flink程序。到时候你就知道,这东西用起来有多顺手了。