1. 课程导学与前置准备

各位同学,欢迎来到《Flink集成Kafka实时处理实战》的第一章。

做实时计算这些年,我见过太多人一上来就写代码,结果环境配三天,跑起来全是坑。所以这一章,咱们先把地基打牢。说白了,磨刀不误砍柴工。

1.1 为什么是Flink + Kafka?

实时处理领域,Kafka负责「搬数据」,Flink负责「算数据」。这对组合,已经是业界标准。

我2018年刚接触实时流计算时,用的还是Storm。后来项目数据量从每天几百万涨到几亿,Storm的延迟和状态管理让我头疼不已。换到Flink之后,嗯,世界清净了。

核心认知:Kafka是实时数据的「高速公路」,Flink是跑在这条路上的「智能引擎」。两者结合,能处理从日志采集到复杂事件推理的几乎所有实时场景。

你想想看,一个电商大促场景:用户点击、下单、支付,这些事件先落到Kafka,Flink实时读取、聚合、计算,然后输出到数据库或大屏。整个过程延迟在秒级甚至毫秒级。这就是实时处理的魅力。

1.2 课程目标与知识体系

这门课共30章,从零搭建一个完整的实时处理项目。我不会只讲API怎么用,我会告诉你:

  • 生产环境里哪些配置容易踩坑
  • 数据一致性怎么保证
  • 背压、Checkpoint、状态后端这些概念到底怎么落地

下面这张图,是整门课的知识结构。建议你保存下来,学完一章回来对照一下。

Flink集成Kafka实时处理实战 - 知识体系 第1章 课程导学 环境搭建 · 生态概览 第2-5章 基础篇 Flink核心API · Kafka集成 第6-10章 进阶篇 状态管理 · 时间语义 第11-15章 核心机制 Checkpoint · 容错 · 背压 第16-20章 实战项目 订单实时统计 · 风控 第21-25章 性能调优 资源调优 · 参数优化 第26-28章 高级特性 CEP · 维表关联 · 多流 第29章 监控与运维 Metrics · 日志 · 告警 第30章 总结与展望 最佳实践 · 学习路径 💡 学习建议 每章都配有可运行的代码示例,建议边学边练 遇到问题先看「避坑指南」部分,大部分坑我都踩过

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程序