2. Flink 开发环境搭建:JDK 配置、Maven 项目创建、Flink 本地模式启动、第一个 WordCount 程序

在开始 Flink 特征服务与团伙识别实战之前,搭建一个稳定、可复现的开发环境是第一步。本章将引导你完成从 JDK 配置到本地运行第一个 Flink 程序的完整流程,确保后续所有实验都能在统一的环境中顺利执行。

2.1 环境依赖与版本选型

Flink 基于 JVM 运行,对 JDK 版本有明确要求。以下为推荐版本组合,兼顾稳定性与社区支持度:

组件 推荐版本 说明
JDK 1.8.0_202 或 11.0.x Flink 1.13+ 支持 JDK 11,生产环境建议 JDK 8
Maven 3.6.3+ 用于项目构建与依赖管理
Flink 1.14.6 或 1.15.4 LTS 版本,社区活跃,API 稳定
IDE IntelliJ IDEA 2022+ 推荐 Ultimate 版,支持 Scala 与 Flink 插件
版本对齐建议:本课程所有代码基于 Flink 1.14.6 + JDK 1.8 验证。若使用更高版本,请注意 API 兼容性变更,尤其是 DataStream API 与 Table API 的包路径调整。

2.2 JDK 配置与验证

JDK 安装完成后,需正确配置 JAVA_HOME 环境变量并将 bin 目录加入 PATH。以下为 Linux/macOS 与 Windows 的配置要点:

  • Linux/macOS:在 ~/.bashrc 或 ~/.zshrc 中添加 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64,然后执行 source ~/.bashrc。
  • Windows:系统变量中新建 JAVA_HOME,值为 JDK 安装路径(如 C:\Program Files\Java\jdk1.8.0_202),并在 Path 中添加 %JAVA_HOME%\bin。

验证配置是否生效:

# 终端执行
java -version
# 预期输出包含 "1.8.0_202" 或 "11.0.x"
javac -version
# 预期输出与 java 版本一致
常见踩坑:若终端显示 java 命令未找到,请检查环境变量是否指向正确的 JDK 路径,并确认已重新打开终端或执行 source 命令。不要使用 JRE 替代 JDK,否则 javac 不可用。

2.3 Maven 项目创建与依赖配置

推荐使用 Maven 作为项目构建工具。你可以通过命令行快速创建项目骨架,或直接在 IntelliJ IDEA 中新建 Maven 项目。以下为手动创建的标准步骤:

  1. 在终端执行 mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.14.6。
  2. 按提示输入 groupId(如 com.risk.antifraud)、artifactId(如 flink-feature-service)、version(默认 1.0-SNAPSHOT)。
  3. 项目生成后,检查 pom.xml 中的核心依赖是否完整。

以下为 pom.xml 中必须包含的 Flink 依赖片段:

<properties>
    <flink.version>1.14.6</flink.version>
    <java.version>1.8</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.12</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_2.12</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
依赖作用域说明:上述依赖均使用 provided 作用域,因为 Flink 集群运行时已包含这些 jar 包。若在本地 IDE 中直接运行,需临时改为 compile 或通过 flink run 提交打包后的 jar。

2.4 Flink 本地模式启动

Flink 本地模式(Local Mode)无需分布式集群,适合开发调试。下载 Flink 压缩包后,解压并启动:

# 下载 Flink 1.14.6
wget https://archive.apache.org/dist/flink/flink-1.14.6/flink-1.14.6-bin-scala_2.12.tgz
tar -xzf flink-1.14.6-bin-scala_2.12.tgz
cd flink-1.14.6

# 启动本地集群
./bin/start-cluster.sh

# 验证启动状态
jps
# 应看到 StandaloneSessionClusterEntrypoint 和 TaskManagerRunner 两个进程

启动成功后,访问 http://localhost:8081 即可进入 Flink Web UI,查看集群概览、任务列表与资源使用情况。

本地模式适用场景:单机调试、单元测试、小规模数据验证。在后续团伙识别特征工程中,本地模式足以支撑万级数据量的逻辑验证。

2.5 第一个 WordCount 程序

WordCount 是 Flink 的 "Hello World",它完整展示了 DataStream API 的核心算子链:Source → Transformation → Sink。以下为完整代码:

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 WordCount {
    public static void main(String[] args) throws Exception {
        // 1. 创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 2. 数据源:从 socket 读取文本流
        DataStream<String> text = env.socketTextStream("localhost", 9999);

        // 3. 转换:分词并计数
        DataStream<Tuple2<String, Integer>> counts = text
            .flatMap(new Tokenizer())
            .keyBy(value -> value.f0)
            .sum(1);

        // 4. 输出:打印到控制台
        counts.print();

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

    public static class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> {
        @Override
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
            String[] words = value.toLowerCase().split("\\W+");
            for (String word : words) {
                if (word.length() > 0) {
                    out.collect(new Tuple2<>(word, 1));
                }
            }
        }
    }
}

运行步骤:

  1. 在终端启动 socket 数据源:nc -lk 9999(Linux/macOS)或使用 ncat -lk 9999(Windows)。
  2. 在 IDE 中直接运行 WordCount 类的 main 方法。
  3. 在 nc 终端输入单词,观察 IDE 控制台输出 (word, count) 结果。
本地运行注意事项:若使用 provided 作用域,IDE 运行时会报 ClassNotFoundException。解决方案:在 IDE 运行配置中,将 flink-java 和 flink-streaming-java 临时改为 compile 作用域,或使用 Maven 插件 mvn exec:java 运行。

2.6 开发环境架构总览

下图展示了从本地开发到 Flink 集群执行的整体数据流与组件关系:

Flink 本地开发环境架构 开发环境 IDE (IntelliJ IDEA) Maven 项目 pom.xml 依赖 Java/Scala 源码 本地数据源 (socket/file) Flink 本地集群 JobManager TaskManager Web UI :8081 Slot 资源池 任务调度 输出与监控 控制台打印 日志文件 Web UI 指标 Checkpoint mvn package flink run 结果流 指标推送 本地模式无需分布式部署,适合快速验证 WordCount 及后续特征处理逻辑

2.7 环境验证清单

完成上述步骤后,建议逐项核对以下清单,确保环境就绪:

检查项 验证方法 预期结果
JDK 版本 java -version 1.8.0_202 或 11.0.x
Maven 版本 mvn -version 3.6.3+
Flink 本地集群 jps 查看进程 StandaloneSessionClusterEntrypoint + TaskManagerRunner
Web UI 可访问 浏览器打开 localhost:8081 Flink Dashboard 正常显示
WordCount 运行 IDE 运行 + nc 输入 控制台输出单词计数
下一步衔接:环境搭建完成后,第 3 章将基于此环境,引入 Flink DataStream 核心算子,并开始构建团伙识别所需的特征提取管道。