2. Flink 开发环境搭建:JDK、Maven、Flink 集群安装与配置、本地开发环境初始化

实时风控特征工程对环境的稳定性与版本一致性要求极高。本章将指导你从零搭建一套可用于生产级 Flink 开发的完整环境,涵盖 JDK、Maven、Flink 集群及 IDE 初始化。所有步骤均经过风控场景验证,避免因环境差异导致的特征计算偏差。

2.1 环境版本选型与兼容性矩阵

在风控场景中,Flink 通常与 Kafka、HBase、Redis 等组件深度集成。下表列出了经测试的稳定版本组合,建议严格遵循以避免序列化或状态后端兼容问题。

组件 推荐版本 说明
JDK 1.8.0_202 (Oracle) / 11.0.18 (OpenJDK) Flink 1.13-1.16 官方推荐 JDK 8/11;风控场景建议使用 JDK 8
Maven 3.6.3 或 3.8.6 3.6.3 最稳定;3.8.6 兼容新版插件
Flink 1.14.6 或 1.16.2 1.14 为风控项目主流;1.16 支持动态表
Scala (Flink 依赖) 2.12 Flink 1.14+ 默认 Scala 2.12
IDE IntelliJ IDEA 2022.3+ 社区版即可;需安装 Flink 插件
版本选择建议: 若团队首次搭建,推荐 JDK 8 + Flink 1.14.6 + Maven 3.6.3。该组合在风控特征 join、窗口聚合场景下 bug 最少,社区资料最丰富。

2.2 JDK 安装与配置

Flink 依赖 JAVA_HOME 环境变量。以下步骤以 Linux (CentOS 7) 为例,Windows/Mac 可类比操作。

  1. 下载 JDK 8:从 Oracle 或 Adoptium 获取 jdk-8u202-linux-x64.tar.gz。
  2. 解压至指定目录:
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_202 /usr/local/java
  1. 配置环境变量:编辑 /etc/profile,追加:
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  1. 生效并验证:
source /etc/profile
java -version
# 输出应包含:java version "1.8.0_202"
避坑提醒: 风控场景中,部分老旧的第三方 jar(如某些加密组件)不兼容 JDK 11 的模块化系统。若后续集成出现 IllegalAccessError,请优先检查 JDK 版本。

2.3 Maven 安装与国内镜像配置

Maven 用于管理 Flink 项目依赖。风控特征工程通常涉及大量第三方依赖(如 Alink、Flink-ML、自定义 UDF),必须配置国内镜像加速。

  1. 下载 Maven:
wget https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/
mv /usr/local/apache-maven-3.6.3 /usr/local/maven
  1. 配置环境变量:
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
  1. 配置阿里云镜像:编辑 $MAVEN_HOME/conf/settings.xml,在 <mirrors> 内添加:
<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>central</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>
  1. 验证:
mvn -version
# 输出应包含:Apache Maven 3.6.3

2.4 Flink 集群安装与配置

Flink 支持 Standalone、YARN、Kubernetes 三种部署模式。在风控特征工程开发阶段,Standalone 模式 最适合本地调试与快速验证。下面以 Flink 1.14.6 为例。

2.4.1 下载与解压

wget https://archive.apache.org/dist/flink/flink-1.14.6/flink-1.14.6-bin-scala_2.12.tgz
tar -zxvf flink-1.14.6-bin-scala_2.12.tgz -C /usr/local/
mv /usr/local/flink-1.14.6 /usr/local/flink

2.4.2 核心配置项

编辑 /usr/local/flink/conf/flink-conf.yaml,针对风控场景做以下调整:

配置项 推荐值 风控场景说明
jobmanager.memory.process.size 2048m 风控作业通常有多个 source/sink,需保证 JM 堆内存
taskmanager.memory.process.size 4096m 特征计算涉及大量 state,TM 内存不足会导致频繁 GC
taskmanager.numberOfTaskSlots 4 单节点并行度;风控特征 pipeline 通常 4-8 个算子
parallelism.default 2 本地开发时建议 2,生产环境按数据量调整
state.backend rocksdb 风控特征 state 较大,RocksDB 可避免 OOM
rest.port 8081 Web UI 端口,用于监控特征计算延迟

2.4.3 启动集群

# 启动 Standalone 集群
/usr/local/flink/bin/start-cluster.sh

# 验证进程
jps
# 应看到:StandaloneSessionClusterEntrypoint (JobManager)
#         TaskManagerRunner (TaskManager)

# 访问 Web UI
# http://localhost:8081
验证方法: 提交一个内置示例作业:/usr/local/flink/bin/flink run /usr/local/flink/examples/streaming/SocketWindowWordCount.jar --hostname localhost --port 9999。在 Web UI 的 "Running Jobs" 页面看到作业状态为 RUNNING 即表示集群正常。

2.5 本地开发环境初始化

使用 IntelliJ IDEA 创建 Flink 风控项目骨架,并配置 Maven 依赖。

2.5.1 创建 Maven 项目

在 IDEA 中选择 File → New → Project → Maven,不勾选 "Create from archetype"。项目结构如下:

flink-credit-risk/
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/risk/feature/
│   │   │       ├── source/          # 风控数据源(Kafka、Socket)
│   │   │       ├── function/        # 特征函数(UDF、聚合)
│   │   │       ├── model/           # 特征实体
│   │   │       └── job/             # 作业入口
│   │   └── resources/
│   │       └── application.properties
│   └── test/
│       └── java/

2.5.2 pom.xml 核心依赖

以下为风控特征工程最简依赖配置:

<properties>
    <flink.version>1.14.6</flink.version>
    <scala.binary.version>2.12</scala.binary.version>
</properties>

<dependencies>
    <!-- Flink Streaming Java -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>

    <!-- Flink 客户端 (用于本地执行) -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>

    <!-- Flink Table API (用于特征 SQL) -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
    </dependency>

    <!-- RocksDB 状态后端 -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-statebackend-rocksdb_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>

    <!-- 日志 (风控场景必须控制日志级别) -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.11</version>
    </dependency>
</dependencies>
依赖作用域说明: 使用 provided 作用域的依赖(如 flink-streaming-java)在本地 IDE 运行时需手动添加 "provided" 范围。方法:在 IDEA 右侧 Maven 面板中,勾选 Include dependencies with "Provided" scope。

2.5.3 第一个风控特征作业骨架

创建 com.risk.feature.job.RiskFeatureJob:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;

public class RiskFeatureJob {
    public static void main(String[] args) throws Exception {
        // 1. 创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 2. 设置并行度(风控场景建议与 Task Slot 数一致)
        env.setParallelism(2);

        // 3. 启用 RocksDB 状态后端
        env.setStateBackend(new EmbeddedRocksDBStateBackend());

        // 4. 设置 Checkpoint (风控特征必须开启)
        env.enableCheckpointing(60000); // 60秒一次

        // 5. 数据源与特征逻辑(后续章节实现)
        // DataStream<TransactionEvent> source = ...

        // 6. 执行
        env.execute("Flink Credit Risk Feature Pipeline");
    }
}

2.6 环境验证与常见问题

完成上述步骤后,执行以下验证清单:

  • JDK 验证:java -version 输出 1.8.0_202
  • Maven 验证:mvn -version 输出 3.6.3
  • Flink 集群验证:访问 http://localhost:8081 看到 Web UI
  • 项目编译验证:在项目根目录执行 mvn clean package -DskipTests,输出 BUILD SUCCESS
  • 本地运行验证:IDEA 中右键运行 RiskFeatureJob,控制台无异常,Web UI 出现作业
常见错误:
  • ClassNotFoundException: org.apache.flink.streaming.api.environment.StreamExecutionEnvironment → 检查 pom.xml 中 flink-streaming-java 依赖是否添加,且 IDEA 是否勾选了 "provided" 范围。
  • java.io.IOException: No space left on device → RocksDB 状态后端默认写入 /tmp,风控场景 state 增长快,需配置 state.backend.rocksdb.localdir 指向大磁盘目录。
  • Web UI 无法访问 → 检查防火墙是否开放 8081 端口,或 Flink 是否绑定到 0.0.0.0(修改 rest.bind-address: 0.0.0.0)。

2.7 开发环境架构总览

下图展示了本地开发环境各组件之间的协作关系:

Flink 实时风控开发环境架构 开发机 (IDEA) RiskFeatureJob.java pom.xml (Maven) application.properties logback.xml JDK 8 + Maven 3.6 Flink Standalone 集群 JobManager Web UI :8081 TaskManager (Slot x4) RocksDB State Backend 特征算子链 Source → Process → Sink Checkpoint (60s) 状态一致性保障 外部数据系统 Kafka (事件源) 交易/行为流 HBase (特征存储) 用户画像/历史特征 Redis (实时计数) 窗口聚合/限流 MySQL (规则配置) 风控策略/阈值 说明:开发机通过 Maven 编译打包后,将作业提交至 Flink 集群;集群从外部系统读取数据并计算特征。