3、开发环境搭建:JDK、Maven、IDE配置、Flink本地集群启动、第一个WordCount程序运行验证

实时因子计算服务的开发环境是后续所有实验与生产代码的基础。本章将引导你完成从零搭建一套完整的 Flink 开发环境,包括 JDK、Maven、IDE 的安装与配置,Flink 本地集群的启动,并通过经典的 WordCount 程序验证环境是否正常工作。

3.1 环境依赖清单

在开始安装之前,请确认你的操作系统为 macOS / Linux / Windows (WSL2 推荐)。以下为本次课程使用的软件版本及其核心作用:

组件 推荐版本 核心作用
JDK 1.8.0_202 或 11 (LTS) Flink 运行与编译的基础运行时环境
Apache Maven 3.6.3+ 项目依赖管理与构建打包工具
IntelliJ IDEA 2023.x (Community/Ultimate) 主开发 IDE,提供 Flink 插件与调试支持
Apache Flink 1.17.x (课程统一版本) 实时计算引擎,本地 Standalone 集群模式
版本一致性提示: 请严格使用上述版本,避免因版本差异导致 API 不兼容或运行时异常。本课程所有代码均基于 Flink 1.17 与 JDK 8 验证。

3.2 JDK 安装与配置

JDK 是 Flink 运行的基石。推荐使用 Oracle JDK 8u202 或 OpenJDK 11。安装完成后,务必配置 JAVA_HOME 环境变量并将 $JAVA_HOME/bin 加入 PATH。

验证安装:

# 查看 Java 版本
java -version

# 预期输出示例(JDK 8)
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
常见踩坑: 如果系统存在多个 JDK 版本,请确保 JAVA_HOME 指向正确的路径。Flink 1.17 对 JDK 9+ 的支持有限,建议优先使用 JDK 8。

3.3 Maven 安装与配置

Maven 用于管理项目依赖与构建生命周期。安装后需配置 MAVEN_HOME 并修改 settings.xml 中的镜像源以加速依赖下载。

推荐在 ~/.m2/settings.xml 中添加阿里云镜像:

<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>central</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
</mirrors>

验证安装:

mvn -version

# 预期输出包含 Maven 版本与 Java 版本信息
Apache Maven 3.9.6
Maven home: /usr/local/apache-maven-3.9.6
Java version: 1.8.0_202, vendor: Oracle Corporation

3.4 IDE 配置与 Flink 插件

推荐使用 IntelliJ IDEA。安装完成后,需进行以下关键配置:

  • 编码设置: 统一使用 UTF-8 编码,避免中文乱码。
  • Maven 集成: 在 Settings → Build, Execution, Deployment → Build Tools → Maven 中指定本地 Maven 路径与 settings.xml。
  • Flink 插件: 安装 Flink 插件(可选),用于快速生成 Flink 项目模板与运行配置。
  • Lombok 插件: 如果项目中使用 Lombok 简化 POJO,请务必安装并启用 Annotation Processing。
IDE 调优建议: 在 idea64.exe.vmoptions 中适当增加 -Xms1024m -Xmx2048m,避免大型 Flink 项目编译时内存不足。

3.5 Flink 本地集群启动

Flink 提供 Standalone 模式用于本地开发与调试。下载 Flink 1.17 压缩包并解压后,执行以下命令启动集群:

# 进入 Flink 安装目录
cd flink-1.17.0

# 启动本地集群(默认使用 8081 端口)
./bin/start-cluster.sh

# 启动后检查进程
jps
# 应看到以下两个进程:
# 1) StandaloneSessionClusterEntrypoint (JobManager)
# 2) TaskManagerRunner (TaskManager)

启动成功后,打开浏览器访问 http://localhost:8081,你将看到 Flink Web Dashboard 界面,其中显示集群概览、可用 Task Slots 数量以及作业管理入口。

Flink 本地集群启动流程 Flink 本地集群启动流程 下载 & 解压 ./bin/start-cluster.sh JobManager 启动 TaskManager 启动 Web Dashboard (8081) 说明:启动后可通过 jps 命令验证进程,或访问 http://localhost:8081 查看集群状态

3.6 第一个 WordCount 程序运行验证

WordCount 是 Flink 的“Hello World”,用于验证开发环境与集群是否正常工作。我们将创建一个 Maven 项目,编写流式 WordCount 程序,并在本地集群上运行。

3.6.1 创建 Maven 项目

在 IDEA 中新建 Maven 项目,在 pom.xml 中添加 Flink 核心依赖:

<properties>
    <flink.version>1.17.0</flink.version>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
依赖作用域说明: 使用 provided 作用域,因为 Flink 集群自身已包含这些 jar 包,避免打包时重复引入导致冲突。

3.6.2 编写 WordCount 程序

创建一个 SocketWindowWordCount 类,从 socket 读取文本流,每 5 秒统计一次单词出现次数:

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.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

public class SocketWindowWordCount {

    public static void main(String[] args) throws Exception {

        // 1. 创建流执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 2. 从 socket 读取数据(本地端口 9999)
        DataStream<String> text = env.socketTextStream("localhost", 9999, "\n");

        // 3. 数据转换:切分单词,映射为 (word, 1)
        DataStream<Tuple2<String, Integer>> wordCounts = text
                .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
                    @Override
                    public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
                        for (String word : value.split("\\s")) {
                            if (word.length() > 0) {
                                out.collect(new Tuple2<>(word, 1));
                            }
                        }
                    }
                })
                .keyBy(value -> value.f0)
                .window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
                .sum(1);

        // 4. 打印结果
        wordCounts.print();

        // 5. 执行作业
        env.execute("Socket Window WordCount");
    }
}

3.6.3 运行验证步骤

  1. 启动 Flink 本地集群: 确保 start-cluster.sh 已执行,Web Dashboard 可访问。
  2. 启动 socket 数据源: 在终端执行 nc -lk 9999(Linux/macOS)或使用 ncat(Windows)。
  3. 在 IDEA 中运行程序: 直接运行 main 方法,Flink 会自动连接本地集群并提交作业。
  4. 输入数据: 在 nc 终端中输入单词,例如:flink flink hadoop spark。
  5. 查看输出: 在 IDEA 控制台或 Flink Web Dashboard 的 Task Manager 日志中查看统计结果。
WordCount 数据流处理流程 WordCount 数据流处理流程 Socket Source FlatMap 切分 KeyBy 分组 Window + Sum Sink (Print) 数据流:Socket → 切分单词 → 按单词分组 → 5秒滚动窗口求和 → 控制台打印

3.7 环境验证清单

完成上述步骤后,请对照下表逐项确认环境就绪:

检查项 验证方法 预期结果
JDK 安装 java -version 显示 1.8.0_202 或 11
Maven 安装 mvn -version 显示 3.6.3+ 且 Java 版本正确
Flink 集群启动 jps 或访问 localhost:8081 JobManager + TaskManager 进程存在,Dashboard 可访问
WordCount 运行 IDEA 运行程序,nc 输入数据 控制台每 5 秒输出单词统计结果
排错指南: 如果 WordCount 无法提交作业,请检查 IDEA 的 Run Configuration 中是否添加了 --hostname localhost --port 9999 参数(如果程序使用参数解析)。同时确认防火墙未阻断 9999 端口。