3. 开发环境搭建:JDK、Maven、Flink集群(Standalone模式)、IDE配置、第一个Flink WordCount程序

开发环境是实时计算实践的起点。本章将引导你从零搭建一套完整的 Flink 开发环境,涵盖 JDK、Maven、Flink Standalone 集群、IDE 配置,并运行第一个 WordCount 程序。完成本章后,你将拥有一个可随时启动的本地 Flink 实验环境。

3.1 环境依赖与版本选型

Flink 运行依赖 Java 环境,同时推荐使用 Maven 进行项目构建与依赖管理。以下为本次课程推荐的版本组合,已在生产级稳定性与功能完整性之间取得平衡。

组件 推荐版本 说明
JDK 1.8.0_202 或 11.0.x Flink 1.14+ 支持 Java 11,推荐使用 Java 8 以获得最广泛的兼容性
Maven 3.6.3+ 用于项目构建、依赖管理和打包
Flink 1.14.6 稳定版本,支持流批一体,社区活跃
IDE IntelliJ IDEA 2022.2+ 社区版或 Ultimate 版均可,需安装 Scala 插件(可选)
版本兼容性提示: 若使用 Flink 1.15+,建议搭配 JDK 11;若使用 Flink 1.13 及以下,请使用 JDK 8。本课程所有示例均基于 Flink 1.14.6 + JDK 8 验证。

3.2 JDK 安装与配置

JDK 是 Flink 运行的基础。请确保已正确安装并配置 JAVA_HOME 环境变量。

  1. 下载 JDK: 从 Oracle 或 Adoptium 下载 JDK 8(推荐 jdk-8u202-linux-x64.tar.gz 或 .msi 安装包)。
  2. 解压安装: 将压缩包解压至 /usr/local/java/(Linux/Mac)或 C:\Java\(Windows)。
  3. 配置环境变量:
    # Linux / Mac ( ~/.bashrc 或 ~/.zshrc )
    export JAVA_HOME=/usr/local/java/jdk1.8.0_202
    export PATH=$JAVA_HOME/bin:$PATH
    
    # Windows ( 系统环境变量 )
    JAVA_HOME = C:\Java\jdk1.8.0_202
    PATH 追加 %JAVA_HOME%\bin
  4. 验证安装:
    java -version
    # 输出示例:
    # 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)

3.3 Maven 安装与配置

Maven 用于管理 Flink 项目的依赖和构建生命周期。推荐使用阿里云镜像加速国内下载。

  1. 下载 Maven: 从 Apache 官网下载 apache-maven-3.6.3-bin.tar.gz。
  2. 解压安装: 解压至 /usr/local/maven/ 或 C:\Maven\。
  3. 配置环境变量:
    export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.3
    export PATH=$MAVEN_HOME/bin:$PATH
  4. 配置阿里云镜像(可选但推荐): 编辑 ~/.m2/settings.xml,添加以下内容:
    <mirrors>
      <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>central</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
      </mirror>
    </mirrors>
  5. 验证安装:
    mvn -version
    # 输出应包含 Maven 版本、Java 版本及操作系统信息

3.4 Flink Standalone 集群搭建

Standalone 模式是 Flink 最简单的部署方式,适合本地开发和测试。本课程采用单节点集群(1 JobManager + 1 TaskManager)。

  1. 下载 Flink: 从 Flink 官网 下载 flink-1.14.6-bin-scala_2.12.tar.gz。
  2. 解压:
    tar -xzf flink-1.14.6-bin-scala_2.12.tar.gz -C /usr/local/
    cd /usr/local/flink-1.14.6
  3. 配置 Flink: 编辑 conf/flink-conf.yaml,修改以下关键参数:
    # JobManager 地址(本机)
    jobmanager.rpc.address: localhost
    # JobManager 端口
    jobmanager.rpc.port: 6123
    # TaskManager 堆内存(根据机器配置调整)
    taskmanager.memory.process.size: 2048m
    # 每个 TaskManager 的 Task Slot 数
    taskmanager.numberOfTaskSlots: 4
    # 并行度(默认)
    parallelism.default: 2
  4. 启动集群:
    # 启动 JobManager
    ./bin/start-cluster.sh
    
    # 验证进程
    jps
    # 应看到 StandaloneSessionClusterEntrypoint (JobManager) 和 TaskManagerRunner (TaskManager)
  5. 访问 Web UI: 打开浏览器访问 http://localhost:8081,确认集群状态为 Running。
集群验证: 在 Web UI 的 "Task Managers" 页面应看到 1 个 TaskManager,且 Slot 数为 4。在 "Job Manager" 页面可查看配置参数和日志。

3.5 IDE 配置与项目创建

推荐使用 IntelliJ IDEA 进行 Flink 开发。以下为项目创建与配置步骤。

  1. 创建 Maven 项目: 在 IDEA 中选择 File → New → Project → Maven,填写 GroupId(如 com.flink.practice)和 ArtifactId(如 flink-wordcount)。
  2. 添加 Flink 依赖: 编辑 pom.xml,添加以下核心依赖:
    <properties>
      <flink.version>1.14.6</flink.version>
      <scala.binary.version>2.12</scala.binary.version>
    </properties>
    
    <dependencies>
      <!-- Flink Java 客户端 -->
      <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>${flink.version}</version>
      </dependency>
      <!-- Flink Streaming 客户端 -->
      <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
      </dependency>
      <!-- Flink CLI(本地运行) -->
      <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
      </dependency>
    </dependencies>
  3. 配置 Maven 编译插件: 在 pom.xml 的 <build> 中添加:
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  4. 导入依赖: 点击 IDEA 右侧 Maven 面板的 Reload All Projects,等待依赖下载完成。

3.6 第一个 Flink 程序:WordCount

WordCount 是 Flink 的 "Hello World",用于验证环境是否正常工作。以下为完整的 Java 实现。

package com.flink.practice;

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 读取文本流(需先启动 nc -lk 9999)
        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("Flink WordCount");
    }

    // 自定义 FlatMapFunction:将每行文本拆分为单词
    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/Mac)或使用 ncat -lk 9999(Windows)。然后在 IDEA 中运行 WordCount.main(),在 nc 终端输入单词,即可在 IDEA 控制台看到实时计数结果。

3.7 环境搭建与运行流程总览

以下 SVG 图展示了从环境搭建到程序运行的完整链路,帮助你理解各组件之间的协作关系。

Flink 开发环境搭建与运行流程 Flink 开发环境搭建与运行流程 JDK 1.8 Maven 3.6+ IntelliJ IDEA Flink Standalone 集群 JobManager + TaskManager (4 Slots) Maven 项目:flink-wordcount pom.xml 配置 Flink 依赖 → 编写 WordCount.java 运行 WordCount → nc 发送数据 → 控制台输出结果 验证环境搭建成功 环境准备 集群部署 项目开发 运行验证

3.8 常见问题与避坑指南

问题现象 可能原因 解决方案
java.lang.NoClassDefFoundError Flink 依赖未正确导入或版本冲突 检查 pom.xml 中 flink.version 和 scala.binary.version 是否匹配;执行 mvn clean install 重新下载依赖
Web UI 无法访问 localhost:8081 JobManager 未启动或端口被占用 执行 jps 确认进程存在;检查 flink-conf.yaml 中 jobmanager.rpc.port 配置;尝试 ./bin/stop-cluster.sh 后重新启动
WordCount 运行后无输出 nc 未启动或端口不一致 确认 nc -lk 9999 已运行;检查程序中的端口号是否与 nc 一致;在 nc 终端输入文本后按回车
TaskManager 启动失败 内存不足或配置错误 检查 taskmanager.memory.process.size 是否超过可用内存;查看 log/flink-*-taskmanager-*.log 获取详细错误

3.9 环境验证清单

完成以上步骤后,请逐项核对以下清单,确保环境就绪。

  • JDK: java -version 输出正确版本,JAVA_HOME 已设置。
  • Maven: mvn -version 输出正常,阿里云镜像生效(可选)。
  • Flink 集群: jps 显示 JobManager 和 TaskManager 进程;Web UI 可访问且状态为 Running。
  • IDE 项目: Maven 依赖无红色报错,WordCount.java 无编译错误。
  • 程序运行: 启动 nc 后运行 WordCount,输入单词可在控制台看到 (word,count) 格式的输出。
进阶提示: 若希望 WordCount 程序在 Flink 集群上提交运行(而非 IDE 内直接执行),可使用以下命令:
./bin/flink run -c com.flink.practice.WordCount /path/to/flink-wordcount-1.0-SNAPSHOT.jar
此时需确保 nc -lk 9999 已启动,且集群正常运行。