2. Spark 大数据环境搭建:Spark 集群安装、HDFS 配置、YARN 资源调度、SparkSession 初始化
在信用评分特征工程中,原始数据通常以百 GB 甚至 TB 级别存储在分布式文件系统中。本章将搭建一套完整的 Spark 大数据环境,涵盖集群安装、HDFS 配置、YARN 资源调度以及 SparkSession 初始化,为后续的特征处理提供稳定、高性能的计算底座。
2.1 环境规划与版本选型
生产环境推荐使用以下组件版本组合,兼顾稳定性与特性支持:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Apache Spark | 3.4.x | 支持 ANSI SQL、动态资源分配、自适应查询执行 |
| Hadoop | 3.3.x | 提供 HDFS 与 YARN 基础服务 |
| Java | 8 或 11 | Spark 3.4 推荐 Java 11 |
| Scala | 2.12 / 2.13 | 与 Spark 预编译版本匹配 |
| 操作系统 | CentOS 7.9 / Ubuntu 20.04 | 生产环境建议使用 Linux |
版本对齐提示: Spark 3.4 预编译的二进制包默认使用 Scala 2.12,若使用 Scala 2.13 需自行编译。信用评分项目中建议直接使用官方预编译包,减少编译风险。
2.2 集群节点规划
以 3 节点集群为例,角色分配如下:
- master1:NameNode + ResourceManager + Spark Master
- worker1:DataNode + NodeManager + Spark Worker
- worker2:DataNode + NodeManager + Spark Worker
所有节点之间配置 SSH 免密登录,并保持时钟同步(NTP)。
2.3 Spark 集群安装步骤
- 下载与解压:从 Apache 官网下载 spark-3.4.0-bin-hadoop3.tgz,解压至 /opt/spark。
- 配置环境变量:在 /etc/profile 或 ~/.bashrc 中添加 SPARK_HOME 并更新 PATH。
- 修改 spark-env.sh:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
export SPARK_MASTER_HOST=master1
export SPARK_WORKER_CORES=4
export SPARK_WORKER_MEMORY=8g
- 配置 workers 文件:在 $SPARK_HOME/conf/workers 中列出所有 Worker 节点主机名。
- 分发安装包:使用 scp 将 /opt/spark 同步到所有 Worker 节点。
- 启动集群:在 Master 节点执行 $SPARK_HOME/sbin/start-all.sh。
2.4 HDFS 配置要点
HDFS 为信用评分原始数据(如申请单、还款流水、外部征信报告)提供持久化存储。核心配置项如下:
| 配置文件 | 参数 | 推荐值 | 说明 |
|---|---|---|---|
| core-site.xml | fs.defaultFS | hdfs://master1:9000 | 默认文件系统 URI |
| hdfs-site.xml | dfs.replication | 2 | 副本数,3 节点集群建议 2 |
| hdfs-site.xml | dfs.blocksize | 256m | 块大小,适合大文件顺序读取 |
| hdfs-site.xml | dfs.namenode.name.dir | /data/hdfs/namenode | NameNode 元数据路径 |
| hdfs-site.xml | dfs.datanode.data.dir | /data/hdfs/datanode | DataNode 数据块路径 |
生产注意事项: NameNode 元数据目录建议使用 RAID 1 或 SSD 磁盘,避免单点故障导致整个集群不可用。DataNode 数据目录可配置多个磁盘挂载点以提升 I/O 吞吐。
2.5 YARN 资源调度配置
YARN 负责集群资源的统一管理与作业调度。信用评分特征工程中,多个特征组(如聚合特征、时序特征、衍生特征)可能并行提交,合理的 YARN 配置能避免资源争抢。
| 配置文件 | 参数 | 推荐值 | 说明 |
|---|---|---|---|
| yarn-site.xml | yarn.resourcemanager.hostname | master1 | ResourceManager 主机 |
| yarn-site.xml | yarn.nodemanager.resource.memory-mb | 16384 | 单节点可用物理内存(MB) |
| yarn-site.xml | yarn.nodemanager.resource.cpu-vcores | 8 | 单节点可用虚拟核数 |
| yarn-site.xml | yarn.scheduler.minimum-allocation-mb | 1024 | 单个容器最小内存 |
| yarn-site.xml | yarn.scheduler.maximum-allocation-mb | 8192 | 单个容器最大内存 |
调度策略选择: 信用评分 ETL 作业通常为 CPU 密集型,建议使用 Capacity Scheduler 或 Fair Scheduler,并设置独立队列隔离生产与实验作业。
2.6 SparkSession 初始化
SparkSession 是 Spark 2.0+ 的统一入口,整合了 SQL、Streaming、MLlib 等 API。在信用评分项目中,初始化时需指定 HDFS 路径、序列化方式及动态资源分配参数。
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("CreditScore_FeatureEngineering") \
.master("yarn") \
.config("spark.sql.adaptive.enabled", "true") \
.config("spark.sql.adaptive.coalescePartitions.enabled", "true") \
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \
.config("spark.dynamicAllocation.enabled", "true") \
.config("spark.dynamicAllocation.minExecutors", "2") \
.config("spark.dynamicAllocation.maxExecutors", "10") \
.config("spark.sql.shuffle.partitions", "200") \
.getOrCreate()
参数调优说明: Kryo 序列化比 Java 序列化性能提升 2~5 倍,适合信用评分中大量特征向量的序列化传输。动态资源分配可根据任务负载自动调整 Executor 数量,避免空闲资源浪费。
2.7 环境验证与架构总览
启动完成后,通过 Web UI 验证各组件状态:
- HDFS NameNode:http://master1:9870
- YARN ResourceManager:http://master1:8088
- Spark Master:http://master1:8080
以下 SVG 图展示了 Spark 集群、HDFS 与 YARN 的协作关系,以及 SparkSession 初始化后的数据流向:
2.8 常见问题与避坑指南
- 端口冲突:HDFS 9000 端口与 Spark Master 7077 端口需确保未被占用,可使用 netstat -tlnp 检查。
- 磁盘空间不足:信用评分原始数据量大,DataNode 数据目录需预留至少 500GB 空间,并配置磁盘使用率告警。
- 内存溢出:YARN 容器内存与 Spark Executor 内存需匹配,避免 spark.executor.memory 超过 yarn.nodemanager.resource.memory-mb。
- 时钟不同步:集群节点时间偏差超过 30 秒会导致 HDFS 或 YARN 心跳超时,务必配置 NTP 服务。
生产级建议: 在正式运行信用评分特征工程前,先使用小规模数据(如 1GB)跑通全流程,验证 HDFS 读写、YARN 资源分配、SparkSession 初始化均正常,再逐步扩大数据量。