3. Spark SQL 环境搭建:集群安装配置、Hive 集成与开发 IDE 准备

在金融图谱样本偏差校验场景中,Spark SQL 环境需要兼顾离线批处理(Hive 数仓)与实时交互分析(Spark Thrift Server)。本节从集群安装、Hive 集成、IDE 配置三个层面搭建生产级环境,确保后续章节的样本抽取、偏差计算、分布对比能够稳定运行。

3.1 集群硬件与软件版本选型

金融风控场景对数据一致性要求高,推荐使用 CDH 或 HDP 发行版,或基于 Apache 社区版自行编译。以下为经过校验场景验证的版本组合:

组件推荐版本说明
Apache Spark3.2.0 / 3.3.0支持 ANSI SQL、动态分区裁剪、AQE
Apache Hive3.1.2 / 3.1.3Metastore 存储表结构,Spark 通过 HiveCatalog 访问
Hadoop3.2.0 / 3.3.0HDFS 存储原始样本与校验中间表
JDK1.8.0_202 / 11.0.11推荐使用 JDK 8,Spark 3.2+ 支持 JDK 11
Scala2.12.15Spark 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),安装步骤如下:

  1. 解压 Spark 安装包 到 /opt/spark,配置 SPARK_HOME 环境变量。
  2. 修改 conf/spark-env.sh,设置 Java 路径、Master 地址、Worker 内存与核数。
  3. 修改 conf/workers,添加 Worker 节点主机名。
  4. 分发配置 到所有节点,启动 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.ConnectionURLjdbc:mysql://node01:3306/hive_metastoreMetastore 数据库连接
hive.metastore.uristhrift://node01:9083Metastore Thrift 服务地址
spark.sql.hive.metastore.version3.1.2指定 Hive Metastore 版本
spark.sql.hive.metastore.jarsbuiltin 或 mavenMetastore 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 在其中的位置:

Spark SQL 与 Hive 集成环境架构 IntelliJ IDEA / Beeline Spark Thrift Server (JDBC) Spark SQL 引擎 (Catalyst + Tungsten) 读取元数据 Hive Metastore HDFS (样本表 / 校验结果表) Worker 1 (Executor) Worker 2 (Executor) Worker 3 (Executor) 说明: IDE 通过 JDBC 连接 Thrift Server,Spark SQL 从 Hive Metastore 获取表结构,从 HDFS 读取数据,在 Worker 节点上分布式执行样本偏差校验。

3.7 常见问题与避坑

问题现象原因解决方案
Spark SQL 无法识别 Hive 表hive-site.xml 未在 classpath 中将配置文件拷贝到 $SPARK_HOME/conf/ 并重启 Thrift Server
Metastore 连接超时Thrift 端口未开放或防火墙拦截检查 hive.metastore.uris 地址与端口,确保网络互通
SQL 执行报 ParseExceptionSpark 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(*)