4. 开发环境搭建:JDK、Scala、Spark集群、Maven/Gradle配置、IDE设置

贷后预警系统对实时性和稳定性要求极高,开发环境的版本一致性是避免“本地能跑、集群报错”的第一道防线。本节将按依赖顺序,逐一搭建 JDK、Scala、Spark 集群、构建工具及 IDE,并给出经过生产验证的版本组合。

4.1 版本选型与兼容性矩阵

Spark Streaming 与 Scala、JDK 存在严格的二进制兼容关系。下表列出 Spark 3.x 主流版本的推荐配套,请根据实际集群版本选择其中一行。

Spark 版本 推荐 JDK 推荐 Scala 构建工具最低版本 备注
3.2.x JDK 8u201+ / JDK 11 2.12.15+ Maven 3.6.3 / Gradle 7.3 稳定,贷后项目常用
3.3.x JDK 8u301+ / JDK 11 / JDK 17 2.12.17+ / 2.13.8+ Maven 3.8.4 / Gradle 7.5 支持 Scala 2.13,性能优化
3.4.x JDK 11 / JDK 17 2.12.18+ / 2.13.11+ Maven 3.9.0 / Gradle 8.0 最新特性,建议新项目使用
版本陷阱:Spark 3.2 之前使用 Scala 2.11,但 2.11 已停止维护且存在安全漏洞。贷后预警涉及客户资金数据,务必使用 Scala 2.12 以上版本。JDK 8 请确保更新到 201 以上,否则 Kryo 序列化可能触发 JVM 崩溃。

4.2 JDK 安装与配置

以 JDK 11(LTS)为例,所有节点需保持相同大版本。

  1. 下载与解压:从 Oracle 或 Adoptium 获取 jdk-11.0.20_linux-x64_bin.tar.gz,解压至 /usr/local/jdk-11.0.20。
  2. 配置环境变量:编辑 /etc/profile 或 ~/.bashrc,添加:
export JAVA_HOME=/usr/local/jdk-11.0.20
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  1. 验证:执行 java -version,输出应包含 OpenJDK 64-Bit Server VM (build 11.0.20+8, mixed mode)。
生产建议:贷后集群建议统一使用 alternatives 管理 JDK 版本,避免多版本冲突。在 /etc/alternatives/java 中设置软链接,确保所有服务用户都能找到正确的 JDK。

4.3 Scala 安装

Spark 自身已捆绑 Scala 运行时库,但开发机仍需安装 Scala 编译器用于本地编译和测试。

  1. 下载:从 Scala 官网获取 scala-2.12.18.tgz,解压至 /opt/scala-2.12.18。
  2. 环境变量:
export SCALA_HOME=/opt/scala-2.12.18
export PATH=$SCALA_HOME/bin:$PATH
  1. 验证:scala -version 应显示 Scala code runner version 2.12.18。
关键点:Spark 3.3+ 支持 Scala 2.13,但贷后预警中常用的 Kafka 客户端和 HBase 连接器在 2.13 下可能缺少预编译包。除非团队有编译能力,否则建议生产环境统一使用 Scala 2.12。

4.4 Spark 集群搭建(Standalone 模式)

贷后预警开发阶段推荐使用 Standalone 模式,部署简单且能模拟资源调度。以下为 3 节点集群(1 Master + 2 Worker)的搭建步骤。

  1. 下载 Spark:spark-3.3.2-bin-hadoop3.tgz,解压至 /opt/spark。
  2. 配置 spark-env.sh:
export JAVA_HOME=/usr/local/jdk-11.0.20
export SPARK_MASTER_HOST=192.168.1.10
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=4
export SPARK_WORKER_MEMORY=8g
export SPARK_DAEMON_MEMORY=2g
export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=/tmp/spark-events"
  1. 配置 workers:在 conf/workers 中列出 Worker 节点 IP:
192.168.1.11
192.168.1.12
  1. 启动集群:
cd /opt/spark/sbin
./start-master.sh
./start-workers.sh
  1. 验证:浏览器访问 http://192.168.1.10:8080,应看到 1 个 Master 和 2 个 Worker 状态为 ALIVE。
Spark Standalone 集群架构(贷后预警开发环境) Master 192.168.1.10:7077 Worker 1 4 Core / 8G Mem 192.168.1.11 Worker 2 4 Core / 8G Mem 192.168.1.12 Spark Streaming 贷后预警应用 提交命令: spark-submit --master spark://192.168.1.10:7077 开发阶段使用 Standalone 模式,生产环境建议切换至 YARN 或 Kubernetes 模式

4.5 Maven / Gradle 配置

贷后预警项目通常为多模块工程,包含 spark-streaming、risk-engine、alert-dispatch 等子模块。以下分别给出 Maven 和 Gradle 的核心配置。

4.5.1 Maven pom.xml 核心依赖

<properties>
    <spark.version>3.3.2</spark.version>
    <scala.version>2.12.18</scala.version>
    <scala.binary.version>2.12</scala.binary.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-10_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>
</dependencies>
provided 作用域:Spark 和 Scala 库在集群中已存在,打包时标记为 provided 可避免 jar 冲突和包体积过大。Kafka 连接器则需打包进 fat-jar。

4.5.2 Gradle build.gradle 核心配置

plugins {
    id 'scala'
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.apache.spark:spark-streaming_2.12:3.3.2"
    implementation "org.apache.spark:spark-sql_2.12:3.3.2"
    implementation "org.apache.spark:spark-streaming-kafka-0-10_2.12:3.3.2"
}

shadowJar {
    zip64 true
    mergeServiceFiles()
    exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
}

4.6 IDE 设置(IntelliJ IDEA)

IntelliJ IDEA 是 Scala/Spark 开发的事实标准 IDE。以下为关键配置步骤。

步骤 操作 说明
1 安装 Scala 插件 File → Settings → Plugins → 搜索 Scala → 安装
2 配置 JDK File → Project Structure → SDK → 添加 JDK 11
3 配置 Scala SDK File → Project Structure → Global Libraries → 添加 Scala 2.12.18
4 设置编码 File → Settings → File Encodings → 全部设为 UTF-8
5 安装 Save Actions 插件 自动格式化代码,避免提交时出现格式冲突
6 配置 VM 参数 Help → Edit Custom VM Options → 增加 -Xmx2048m
IDE 开发环境组件关系 IntelliJ IDEA Scala 插件 + Save Actions JDK 11 JAVA_HOME 配置 Scala 2.12.18 Global Libraries Maven / Gradle 依赖管理 + 打包 Spark 集群 远程提交 / 本地调试

4.7 环境验证清单

完成上述配置后,执行以下命令确认环境就绪:

# 1. JDK 版本
java -version

# 2. Scala 版本
scala -version

# 3. Spark 集群状态
curl http://192.168.1.10:8080

# 4. 提交测试任务(本地模式)
spark-submit --master local[2] --class org.apache.spark.examples.SparkPi \
  /opt/spark/examples/jars/spark-examples_2.12-3.3.2.jar 10

# 5. 提交测试任务(集群模式)
spark-submit --master spark://192.168.1.10:7077 \
  --class org.apache.spark.examples.SparkPi \
  /opt/spark/examples/jars/spark-examples_2.12-3.3.2.jar 10
贷后预警开发环境检查点:
- 所有节点 JDK 版本一致(避免序列化异常)
- Spark 日志目录 /tmp/spark-events 已创建(用于 History Server)
- 开发机与集群节点网络互通(telnet 192.168.1.10 7077 确认)
- IDE 中 Scala SDK 与集群 Scala 版本完全一致