1. 课程导学与前置准备
各位同学,欢迎来到《Flink集成Kafka实时处理实战》的第一章。
做实时计算这些年,我见过太多人一上来就写代码,结果环境配三天,跑起来全是坑。所以这一章,咱们先把地基打牢。说白了,磨刀不误砍柴工。
1.1 为什么是Flink + Kafka?
实时处理领域,Kafka负责「搬数据」,Flink负责「算数据」。这对组合,已经是业界标准。
我2018年刚接触实时流计算时,用的还是Storm。后来项目数据量从每天几百万涨到几亿,Storm的延迟和状态管理让我头疼不已。换到Flink之后,嗯,世界清净了。
核心认知:Kafka是实时数据的「高速公路」,Flink是跑在这条路上的「智能引擎」。两者结合,能处理从日志采集到复杂事件推理的几乎所有实时场景。
你想想看,一个电商大促场景:用户点击、下单、支付,这些事件先落到Kafka,Flink实时读取、聚合、计算,然后输出到数据库或大屏。整个过程延迟在秒级甚至毫秒级。这就是实时处理的魅力。
1.2 课程目标与知识体系
这门课共30章,从零搭建一个完整的实时处理项目。我不会只讲API怎么用,我会告诉你:
- 生产环境里哪些配置容易踩坑
- 数据一致性怎么保证
- 背压、Checkpoint、状态后端这些概念到底怎么落地
下面这张图,是整门课的知识结构。建议你保存下来,学完一章回来对照一下。
1.3 环境要求一览
开始动手之前,先把工具备齐。我个人习惯用Mac做开发,但Windows和Linux也一样跑。下面这个表,你照着准备就行。
| 组件 | 版本要求 | 备注 |
|---|---|---|
| JDK | 8 或 11 | Flink 1.14+ 推荐 JDK 11,但 JDK 8 完全够用 |
| Maven | 3.6+ | 用于项目构建和依赖管理 |
| IDE | IntelliJ IDEA / Eclipse | 我个人推荐 IDEA,社区版免费 |
| Kafka | 2.8+ / 3.x | 课程使用 Kafka 3.2.0 |
| Flink | 1.14+ | 课程使用 Flink 1.15.2 |
| Git | 任意版本 | 用于代码版本管理 |
⚠️ 版本兼容性提醒:我曾经在一个项目里用了Flink 1.12配Kafka 3.0,结果连接器报了一堆序列化异常。后来发现是Kafka客户端版本不匹配。建议你严格按照课程指定的版本组合来,等熟悉了再自由升级。
1.4 本地开发环境搭建
好,咱们开始动手。下面几步,我建议你跟着做一遍,不要跳步。
1.4.1 安装JDK并配置环境变量
先确认你的JDK版本。打开终端,输入:
java -version
如果输出类似 openjdk version "11.0.16",说明已经装好了。如果没有,去Oracle官网或Adoptium下载安装。
配置环境变量(以Mac/Linux为例):
# 编辑 ~/.bash_profile 或 ~/.zshrc
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
# 使配置生效
source ~/.bash_profile
💡 小技巧:我习惯在 ~/.bash_profile 里加一行 alias jv='java -version',这样随时敲 jv 就能看版本,省事。
1.4.2 安装Maven
Maven是Java项目的构建工具。下载地址:https://maven.apache.org/download.cgi。下载后解压到某个目录,然后配置环境变量:
export MAVEN_HOME=/path/to/apache-maven-3.8.6
export PATH=$MAVEN_HOME/bin:$PATH
验证安装:
mvn -version
你应该能看到Maven版本和Java版本信息。
1.4.3 安装Kafka(本地模式)
Kafka依赖ZooKeeper,不过从Kafka 2.8开始,可以用KRaft模式去掉ZooKeeper。课程里我们用传统模式,因为生产环境还是ZooKeeper居多。
下载Kafka:
wget https://downloads.apache.org/kafka/3.2.0/kafka_2.13-3.2.0.tgz
tar -xzf kafka_2.13-3.2.0.tgz
cd kafka_2.13-3.2.0
启动ZooKeeper和Kafka:
# 启动ZooKeeper(窗口1)
bin/zookeeper-server-start.sh config/zookeeper.properties
# 启动Kafka(窗口2)
bin/kafka-server-start.sh config/server.properties
验证一下:
# 创建一个测试topic
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
# 列出所有topic
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
看到 test-topic 出现在列表里,说明Kafka跑起来了。
⚠️ 常见坑:启动Kafka时如果报 Address already in use,说明端口被占用了。检查一下是不是之前启动过没关掉。用 lsof -i :9092 查看进程,然后 kill -9 干掉它。
1.4.4 安装Flink(本地模式)
Flink的本地模式不需要额外配置,下载解压就能跑。
wget https://downloads.apache.org/flink/flink-1.15.2/flink-1.15.2-bin-scala_2.12.tgz
tar -xzf flink-1.15.2-bin-scala_2.12.tgz
cd flink-1.15.2
启动Flink集群:
./bin/start-cluster.sh
打开浏览器访问 http://localhost:8081,你应该能看到Flink的Web UI。看到那个界面,说明环境搭好了。
1.4.5 创建Maven项目骨架
最后一步,创建一个Flink项目。我习惯用Maven archetype生成:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.15.2 \
-DgroupId=com.realtime \
-DartifactId=flink-kafka-course \
-Dversion=1.0-SNAPSHOT \
-Dpackage=com.realtime \
-DinteractiveMode=false
生成后,用IDEA打开项目。等Maven下载完依赖,你会看到类似这样的结构:
flink-kafka-course/
├── pom.xml
└── src/
└── main/
├── java/
│ └── com/
│ └── realtime/
│ ├── BatchJob.java
│ └── StreamingJob.java
└── resources/
└── log4j.properties
💡 我的习惯:我会在pom.xml里提前加上Kafka连接器的依赖,省得后面再配。加这一段:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.12</artifactId>
<version>1.15.2</version>
</dependency>
1.5 验证环境:跑一个Hello World
环境都搭好了,咱们跑个最简单的程序验证一下。打开 StreamingJob.java,替换成下面的代码:
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class StreamingJob {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.fromElements("Hello", "Flink", "Kafka", "实战")
.map(word -> word + " ✅")
.print();
env.execute("Hello Flink");
}
}
右键运行,控制台输出:
Hello ✅
Flink ✅
Kafka ✅
实战 ✅
看到这个输出,恭喜你——环境全部就绪。
1.6 本章小结
这一章我们做了三件事:
- 理解了Flink + Kafka为什么是实时处理的标准组合
- 搭建了完整的本地开发环境(JDK、Maven、Kafka、Flink)
- 跑通了第一个Flink程序