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 可类比操作。
- 下载 JDK 8:从 Oracle 或 Adoptium 获取
jdk-8u202-linux-x64.tar.gz。 - 解压至指定目录:
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_202 /usr/local/java
- 配置环境变量:编辑
/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
- 生效并验证:
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),必须配置国内镜像加速。
- 下载 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
- 配置环境变量:
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
- 配置阿里云镜像:编辑
$MAVEN_HOME/conf/settings.xml,在<mirrors>内添加:
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
- 验证:
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 开发环境架构总览
下图展示了本地开发环境各组件之间的协作关系: