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 项目。以下为手动创建的标准步骤:
- 在终端执行
mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.14.6。 - 按提示输入
groupId(如com.risk.antifraud)、artifactId(如flink-feature-service)、version(默认1.0-SNAPSHOT)。 - 项目生成后,检查
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));
}
}
}
}
}
运行步骤:
- 在终端启动 socket 数据源:
nc -lk 9999(Linux/macOS)或使用ncat -lk 9999(Windows)。 - 在 IDE 中直接运行
WordCount类的main方法。 - 在
nc终端输入单词,观察 IDE 控制台输出(word, count)结果。
本地运行注意事项:若使用
provided 作用域,IDE 运行时会报 ClassNotFoundException。解决方案:在 IDE 运行配置中,将 flink-java 和 flink-streaming-java 临时改为 compile 作用域,或使用 Maven 插件 mvn exec:java 运行。
2.6 开发环境架构总览
下图展示了从本地开发到 Flink 集群执行的整体数据流与组件关系:
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 核心算子,并开始构建团伙识别所需的特征提取管道。