3. Spark SQL 环境搭建:集群安装配置、Hive 集成与开发 IDE 准备
在金融图谱样本偏差校验场景中,Spark SQL 环境需要兼顾离线批处理(Hive 数仓)与实时交互分析(Spark Thrift Server)。本节从集群安装、Hive 集成、IDE 配置三个层面搭建生产级环境,确保后续章节的样本抽取、偏差计算、分布对比能够稳定运行。
3.1 集群硬件与软件版本选型
金融风控场景对数据一致性要求高,推荐使用 CDH 或 HDP 发行版,或基于 Apache 社区版自行编译。以下为经过校验场景验证的版本组合:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Apache Spark | 3.2.0 / 3.3.0 | 支持 ANSI SQL、动态分区裁剪、AQE |
| Apache Hive | 3.1.2 / 3.1.3 | Metastore 存储表结构,Spark 通过 HiveCatalog 访问 |
| Hadoop | 3.2.0 / 3.3.0 | HDFS 存储原始样本与校验中间表 |
| JDK | 1.8.0_202 / 11.0.11 | 推荐使用 JDK 8,Spark 3.2+ 支持 JDK 11 |
| Scala | 2.12.15 | Spark 3.x 默认 Scala 2.12 |
版本对齐提示:Spark 与 Hive 的版本必须匹配 Hive Metastore 的 thrift 协议版本。若使用 Spark 3.2 + Hive 3.1,需在 spark-env.sh 中设置
SPARK_DIST_CLASSPATH 包含 Hive lib 路径,否则启动时会报 MetaException 或 ClassNotFoundException。
3.2 Spark 集群安装与配置
以 3 节点集群为例(1 个 Master + 2 个 Worker),安装步骤如下:
- 解压 Spark 安装包 到
/opt/spark,配置SPARK_HOME环境变量。 - 修改
conf/spark-env.sh,设置 Java 路径、Master 地址、Worker 内存与核数。 - 修改
conf/workers,添加 Worker 节点主机名。 - 分发配置 到所有节点,启动 Master 与 Worker。
# spark-env.sh 核心配置示例
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export SPARK_MASTER_HOST=node01
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=4
export SPARK_WORKER_MEMORY=16g
export SPARK_DAEMON_MEMORY=2g
export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://node01:8020/spark-logs"
生产配置要点:
- Worker 内存建议为物理内存的 75%~80%,预留系统与 HDFS 缓存。
- 开启 History Server 便于回溯校验任务的执行计划与 Stage 耗时。
- 若使用 YARN 作为资源管理器,需配置
HADOOP_CONF_DIR并设置spark.master=yarn。
3.3 Spark SQL 与 Hive 集成
金融图谱的样本表通常存储在 Hive 中,Spark SQL 通过 HiveCatalog 直接读取 Hive 表结构,无需重复建表。集成配置分为两步:
3.3.1 拷贝 Hive 配置文件
将 Hive 的 hive-site.xml、core-site.xml、hdfs-site.xml 拷贝到 $SPARK_HOME/conf/ 目录下。关键配置项如下:
| 配置项 | 值示例 | 作用 |
|---|---|---|
javax.jdo.option.ConnectionURL | jdbc:mysql://node01:3306/hive_metastore | Metastore 数据库连接 |
hive.metastore.uris | thrift://node01:9083 | Metastore Thrift 服务地址 |
spark.sql.hive.metastore.version | 3.1.2 | 指定 Hive Metastore 版本 |
spark.sql.hive.metastore.jars | builtin 或 maven | Metastore JAR 包来源 |
3.3.2 启动 Spark Thrift Server(STS)
STS 提供 JDBC/ODBC 接口,支持 BI 工具与自定义客户端直接提交 SQL。启动命令:
$SPARK_HOME/sbin/start-thriftserver.sh \
--master yarn \
--deploy-mode client \
--driver-memory 4g \
--executor-memory 8g \
--executor-cores 4 \
--num-executors 10 \
--conf spark.sql.hive.thriftServer.singleSession=true
注意:在样本偏差校验场景中,建议开启
singleSession=true,避免多个 JDBC 连接使用不同的临时视图导致样本表不一致。同时设置 spark.sql.adaptive.enabled=true 以应对不同量级的样本表。
3.4 开发 IDE 准备
推荐使用 IntelliJ IDEA + Scala 插件进行 Spark SQL 开发。项目构建工具选择 Maven 或 sbt,以下为 Maven 的 pom.xml 核心依赖:
<dependencies>
<!-- Spark SQL 核心 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.2.0</version>
<scope>provided</scope>
</dependency>
<!-- Hive 集成 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.2.0</version>
<scope>provided</scope>
</dependency>
<!-- 测试框架 -->
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_2.12</artifactId>
<version>3.2.10</version>
<scope>test</scope>
</dependency>
</dependencies>
本地调试技巧:在 IDE 中运行 Spark SQL 任务时,设置
spark.master=local[*],并确保 hive-site.xml 在 classpath 中。若本地无法连接 Hive Metastore,可使用 spark.sql.catalogImplementation=in-memory 临时绕过,但正式校验必须使用 HiveCatalog。
3.5 环境验证:Spark SQL 读取 Hive 表
启动 spark-sql 命令行或通过 JDBC 连接 STS,执行以下 SQL 验证集成是否成功:
-- 查看 Hive 中的数据库
SHOW DATABASES;
-- 切换到金融样本库
USE financial_sample;
-- 查看样本表结构
DESCRIBE extended loan_apply_sample;
-- 执行简单聚合,验证 Spark SQL 引擎
SELECT
source_system,
COUNT(*) AS record_cnt,
AVG(loan_amount) AS avg_loan
FROM loan_apply_sample
GROUP BY source_system;
若返回正常结果,说明 Spark SQL 已成功集成 Hive Metastore,可以读取 Hive 表并利用 Spark 的分布式计算引擎进行样本偏差校验。
3.6 环境架构总览
下图展示了 Spark SQL 与 Hive 集成后的整体架构,以及开发 IDE 在其中的位置:
3.7 常见问题与避坑
| 问题现象 | 原因 | 解决方案 |
|---|---|---|
| Spark SQL 无法识别 Hive 表 | hive-site.xml 未在 classpath 中 | 将配置文件拷贝到 $SPARK_HOME/conf/ 并重启 Thrift Server |
| Metastore 连接超时 | Thrift 端口未开放或防火墙拦截 | 检查 hive.metastore.uris 地址与端口,确保网络互通 |
SQL 执行报 ParseException | Spark SQL 与 Hive SQL 语法差异 | 使用 spark.sql.hive.convertMetastoreParquet=false 回退到 Hive 执行 |
| Executor OOM | 样本表数据倾斜或分区过多 | 开启 AQE,设置 spark.sql.adaptive.coalescePartitions.enabled=true |
环境就绪检查清单:
- ✅ Spark Master 与 Worker 进程正常运行(
jps查看) - ✅ Hive Metastore 服务已启动(端口 9083 监听)
- ✅ Spark Thrift Server 已启动(端口 10000 监听)
- ✅ 可通过 Beeline 或 IDE 执行
SHOW DATABASES并返回金融样本库 - ✅ 样本表
loan_apply_sample可正常执行SELECT COUNT(*)