总结我们的对话,我要输出一篇博客,记录我的学习进度和备忘关键点。可以给别人参考,自己也可以复习。
好的,我来帮你整理一篇完整的技术博客,记录从环境搭建到运行第一个 Flink 程序的完整过程,既有学习进度记录,也有关键操作备忘。
从零搭建 Flink 开发环境:WSL2 + IDEA + Maven 完全指南
适合已有 Hadoop 生态基础、首次接触 Flink 的开发者
一、背景与目标
我是一名大数据开发初学者,此前已有离线数仓和 Hadoop 生态链(HDFS、Hive、HBase 等)的基础,环境运行在 WSL2 + Docker 上。近期开始学习 Flink 实时计算,跟随视频教程学习时需要搭建一套新的开发环境。
本文记录了从环境检测、工具选型、安装配置到运行第一个 Flink 程序的完整过程,希望能为同样处境的同学提供参考。
涉及的关键组件版本
| 组件 | 版本 |
|---|---|
| 操作系统 | Windows 11 + WSL2 Ubuntu 24.04 |
| Java | OpenJDK 11(Flink 用)/ OpenJDK 8(Hadoop 用) |
| Maven | 3.8.7 |
| IDEA | IntelliJ IDEA 2026.1.3(统一版,免费核心功能) |
| Flink | 1.15.4 |
二、环境现状评估
在动手之前,先用脚本摸清家底,避免盲目操作导致环境冲突。
环境检测脚本
在 WSL2 终端执行以下脚本,一键检测 Java、Maven、Docker 的安装情况:
bash
#!/bin/bash
echo "========== WSL2 大数据环境体检报告 =========="
echo ""
# 1. 操作系统与内存
echo ">>> 系统信息:"
lsb_release -ds 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"'
echo "内存: $(free -h | grep Mem | awk '{print $2}')"
echo ""
# 2. Java 环境
echo ">>> Java 环境检测:"
if command -v java &> /dev/null; then
java -version 2>&1 | head -n 1
echo "默认 Java 路径: $(which java)"
else
echo "❌ 未检测到 java 命令"
fi
echo ""
echo "--- 系统中已安装的所有 JDK 目录 ---"
ls /usr/lib/jvm/ 2>/dev/null || echo "未找到 /usr/lib/jvm/ 目录"
echo ""
if [ ! -z "$JAVA_HOME" ]; then
echo "当前 JAVA_HOME 变量指向: $JAVA_HOME"
else
echo "⚠️ JAVA_HOME 环境变量未设置"
fi
echo ""
# 3. Maven 环境
echo ">>> Maven 环境检测:"
if command -v mvn &> /dev/null; then
mvn -v | head -n 1
echo "Maven 路径: $(which mvn)"
else
echo "❌ 未安装 Maven"
fi
echo ""
# 4. Docker 环境
echo ">>> Docker 环境检测:"
if command -v docker &> /dev/null; then
docker --version
if docker ps &> /dev/null; then
echo "✅ Docker 守护进程运行正常"
else
echo "⚠️ Docker 命令存在,但守护进程未运行"
fi
else
echo "❌ 未安装 Docker"
fi
我的检测结果
bash
>>> Java 环境检测:
openjdk version "1.8.0_492"
--- 系统中已安装的所有 JDK 目录 ---
java-1.11.0-openjdk-amd64
java-1.17.0-openjdk-amd64
java-1.8.0-openjdk-amd64
java-11-openjdk-amd64
java-17-openjdk-amd64
java-8-openjdk-amd64
当前 JAVA_HOME 变量指向: /usr/lib/jvm/java-11-openjdk-amd64
>>> Maven 环境检测:
❌ 未安装 Maven
关键发现:
-
系统已有多版本 JDK(8、11、17),
JAVA_HOME已指向 Java 11 -
Maven 未安装,这是当前唯一的缺口
-
Hadoop 使用 Java 8,Flink 需要 Java 11,两者共存不冲突
三、核心概念:IDEA + Maven 是什么?
对于从 Web 前端转来的开发者,这两个工具可以类比理解:
| Java 生态 | 前端生态 | 功能 |
|---|---|---|
| IntelliJ IDEA | VSCode / WebStorm | 集成开发环境(IDE) |
| Maven | npm | 依赖管理和构建工具 |
| pom.xml | package.json | 项目配置文件 |
关键理解 :IDEA 是 Windows 原生应用,Maven 和 JDK 装在 WSL2 里。IDEA 通过 \\wsl$ 路径访问 WSL2 中的代码和工具,两者分工明确,互不干扰。
四、环境搭建步骤
4.1 安装 Maven(在 WSL2 中)
bash
sudo apt update
sudo apt install maven -y
验证安装:
bash
mvn -v
# 预期输出:Apache Maven 3.8.7,Java version: 11.0.31
4.2 安装 IntelliJ IDEA(在 Windows 中)
从 JetBrains 官网 下载最新版。
注意:从 2025.3 版本起,社区版和旗舰版已合并为"统一版"。安装后可以免费试用 30 天高级功能,试用期结束后自动切换为免费核心功能,Java/Kotlin 开发完全够用。
安装选项建议:全部勾选(桌面快捷方式、右键菜单、文件关联)。
4.3 在 IDEA 中创建 Flink 项目
项目配置要点
| 配置项 | 填写内容 | 说明 |
|---|---|---|
| 左侧选项 | Java | 不要选 Maven Archetype |
| Build system | Maven | 选择 Maven 作为构建工具 |
| JDK | 选择 WSL 中的 Java 11 | 路径:/usr/lib/jvm/java-11-openjdk-amd64 |
| Location | \\wsl$\Ubuntu\home\用户名\workspace\项目名 |
必须放在 WSL 文件系统中 |
| GroupId | com.example |
组织标识 |
| ArtifactId | flink-demo |
项目名称 |
为什么代码必须放在 WSL 中?
Windows 路径(/mnt/c/)在 WSL 中 I/O 性能极差,且可能引发文件权限问题。使用 \\wsl$ 网络路径,IDEA 可以无缝读写 WSL 文件系统。
4.4 配置 pom.xml
替换项目根目录的 pom.xml 为以下内容:
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>flink-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<flink.version>1.15.4</flink.version>
<scala.binary.version>2.12</scala.binary.version>
</properties>
<dependencies>
<!-- Flink 核心依赖 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>${flink.version}</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
关键点:
-
flink.version设置为1.15.4,与视频教程保持一致 -
maven.compiler.source/target设置为11,匹配 Flink 1.15+ 的要求
保存后,IDEA 会自动提示加载 Maven 变更,点击刷新或右侧 Maven 面板的刷新按钮即可下载依赖。
五、第一个 Flink 程序:WordCount
在 src/main/java/com/example 下创建 WordCountDemo.java:
java
package com.example;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
public class WordCountDemo {
public static void main(String[] args) throws Exception {
// 1. 创建流执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 2. 从元素集合创建数据流(模拟实时数据)
DataStream<String> text = env.fromElements(
"Hello Flink",
"Hello World",
"Flink is powerful",
"Hello Flink again"
);
// 3. 单词拆分和计数
DataStream<Tuple2<String, Integer>> counts = text
.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
for (String word : value.toLowerCase().split(" ")) { // 注意:用空格分隔
out.collect(new Tuple2<>(word, 1));
}
}
})
.keyBy(value -> value.f0)
.sum(1);
// 4. 打印结果
counts.print();
// 5. 启动执行
env.execute("WordCount Demo");
}
}
常见踩坑点
java
// ❌ 错误写法:用下划线分割
split("_")
// ✅ 正确写法:用空格分割
split(" ")
运行方式
右键点击 WordCountDemo.java → Run 'WordCountDemo.main()'
预期输出
text
8> (is,1)
6> (again,1)
7> (flink,1)
7> (flink,2)
7> (flink,3)
5> (world,1)
5> (powerful,1)
3> (hello,1)
3> (hello,2)
3> (hello,3)
输出顺序可能乱序(并行处理导致),但统计结果正确:
-
hello: 3 次 -
flink: 3 次 -
world,is,powerful,again: 各 1 次
六、环境架构总览
理解各组件如何协作,是避免混乱的关键:
text
┌─────────────────────────────────────────────────────────┐
│ Windows 宿主机 │
│ ┌──────────────────────────────────────────────────┐ │
│ │ IntelliJ IDEA(编辑器) │ │
│ │ 通过 \\wls$\ 访问 WSL 文件系统 │ │
│ │ 调用 WSL 中的 java/mvn 命令 │ │
│ └──────────────────┬───────────────────────────────┘ │
│ │ \\wls$\Ubuntu\home\... │
│ ┌──────────────────┴───────────────────────────────┐ │
│ │ WSL2 Ubuntu 24.04 │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ 代码: /home/mumu/workspace/ │ │ │
│ │ │ Java 11: /usr/lib/jvm/java-11-... │ │ │
│ │ │ Maven: /usr/share/maven │ │ │
│ │ │ Docker: 引擎(可选,本教程未使用) │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
核心口诀:只有 WSL2 有真实环境,Windows 只装 IDEA 编辑器。
七、关键备忘清单
版本兼容性
| 组件 | 推荐版本 | 备注 |
|---|---|---|
| Java | 11 | Flink 1.15+ 已弃用 Java 8 |
| Maven | 3.6+ | Ubuntu 24.04 自带 3.8.7 |
| Flink | 1.15.x | 教程常用版本 |
多版本 Java 共存策略
-
系统默认
java命令 → Java 8(Hadoop 用) -
IDEA 项目 SDK → Java 11(Flink 用)
-
两者路径独立,互不冲突
常用命令速查
bash
# 查看 Java 版本
java -version
# 查看 Maven 版本
mvn -v
# 查看 WSL 中 JDK 目录
ls /usr/lib/jvm/
# 启动 Docker 守护进程(如有需要)
sudo service docker start
IDEA 中 Flink 项目创建步骤(精简版)
-
New Project → 左侧选 Java → Build system 选 Maven
-
Location 填
\\wsl$\Ubuntu\home\用户名\workspace\项目名 -
JDK 选 WSL 中的 Java 11
-
替换
pom.xml→ 刷新 Maven -
编写 Flink 程序 → 右键运行
八、总结
本次环境搭建的核心收获:
-
先检测再动手:用脚本摸清现有环境,避免盲目安装导致版本冲突
-
理解工具定位:IDEA 只是编辑器,真正的编译运行环境在 WSL2 中
-
多版本 Java 可共存:Hadoop 用 Java 8,Flink 用 Java 11,各取所需
-
代码必须放 WSL :
\\wsl$路径是 IDEA 访问 WSL 文件系统的正确方式 -
Maven 是 Java 世界的 npm :
pom.xml管理依赖,和package.json异曲同工
第一个 WordCount 程序跑通后,Flink 的学习之路就正式开始了。接下来可以顺着 DataStream API、Kafka 集成、Flink SQL、Hive 集成等方向深入。