(AI总结版)从零搭建 Flink 开发环境:WSL2 + IDEA + Maven 完全指南

总结我们的对话,我要输出一篇博客,记录我的学习进度和备忘关键点。可以给别人参考,自己也可以复习。


好的,我来帮你整理一篇完整的技术博客,记录从环境搭建到运行第一个 Flink 程序的完整过程,既有学习进度记录,也有关键操作备忘。


适合已有 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 开发完全够用。

安装选项建议:全部勾选(桌面快捷方式、右键菜单、文件关联)。

项目配置要点
配置项 填写内容 说明
左侧选项 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 面板的刷新按钮即可下载依赖。


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.javaRun '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
  1. New Project → 左侧选 Java → Build system 选 Maven

  2. Location 填 \\wsl$\Ubuntu\home\用户名\workspace\项目名

  3. JDK 选 WSL 中的 Java 11

  4. 替换 pom.xml → 刷新 Maven

  5. 编写 Flink 程序 → 右键运行


八、总结

本次环境搭建的核心收获:

  1. 先检测再动手:用脚本摸清现有环境,避免盲目安装导致版本冲突

  2. 理解工具定位:IDEA 只是编辑器,真正的编译运行环境在 WSL2 中

  3. 多版本 Java 可共存:Hadoop 用 Java 8,Flink 用 Java 11,各取所需

  4. 代码必须放 WSL\\wsl$ 路径是 IDEA 访问 WSL 文件系统的正确方式

  5. Maven 是 Java 世界的 npmpom.xml 管理依赖,和 package.json 异曲同工

第一个 WordCount 程序跑通后,Flink 的学习之路就正式开始了。接下来可以顺着 DataStream API、Kafka 集成、Flink SQL、Hive 集成等方向深入。