2. Spark 基础回顾:生态、核心抽象与初始化
在风控实验数据处理中,Spark 是核心计算引擎。本章回顾 Spark 生态体系、三大核心抽象(RDD / DataFrame / Dataset)以及 SparkSession 的初始化方式,为后续风控数据清洗、特征加工与模型评估打下基础。
2.1 Spark 生态全景
Spark 是一个统一的分析引擎,覆盖批处理、流处理、SQL 分析、机器学习和图计算。风控场景中,最常使用的组件包括:
- Spark Core:任务调度、内存管理与容错机制,支撑所有上层组件。
- Spark SQL:结构化数据处理,支持 SQL 查询与 DataFrame/Dataset API,是风控特征加工的主要入口。
- Structured Streaming:微批或实时流处理,适用于实时风控规则引擎。
- MLlib:分布式机器学习库,提供逻辑回归、随机森林、评分卡等算法。
- GraphX:图计算引擎,可用于团伙欺诈识别与关联网络分析。
风控视角: 大部分离线风控实验使用 Spark SQL + MLlib;实时风控场景会引入 Structured Streaming。GraphX 在反欺诈团伙挖掘中价值显著,但学习曲线较陡。
2.2 三大核心抽象:RDD / DataFrame / Dataset
Spark 提供三种分布式数据集抽象,风控开发中需要根据场景选择合适 API。
| 特性 | RDD | DataFrame | Dataset |
|---|---|---|---|
| 引入版本 | 1.0 | 1.3 | 1.6 |
| 数据表示 | Java/Python 对象 | Row 对象 + Schema | 类型化 JVM 对象 |
| 类型安全 | 弱(运行时) | 弱(运行时) | 强(编译时) |
| 优化引擎 | 无(用户手动优化) | Catalyst + Tungsten | Catalyst + Tungsten |
| 适用场景 | 底层自定义操作 | SQL 分析、ETL | 类型安全的复杂转换 |
| 风控常用度 | 低(调试或特殊算子) | 高(特征加工、SQL) | 中(Scala 项目) |
实践建议: 风控实验数据处理优先使用 DataFrame API。它经过 Catalyst 优化器自动生成高效执行计划,且支持 SQL 直接查询,适合快速迭代特征工程。Dataset 在 Scala 项目中可提供编译时类型检查,但 Python 环境不支持 Dataset。
2.3 SparkSession 初始化
SparkSession 是 Spark 2.0+ 的统一入口,替代了旧的 SparkContext、SQLContext 和 HiveContext。风控实验中,初始化时需重点配置资源参数与 Hive 集成。
标准初始化模板(Scala):
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder()
.appName("RiskControl_FeatureEngineering")
.config("spark.sql.adaptive.enabled", "true")
.config("spark.sql.adaptive.coalescePartitions.enabled", "true")
.config("spark.sql.shuffle.partitions", "200")
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.enableHiveSupport()
.getOrCreate()
Python 版本:
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("RiskControl_FeatureEngineering") \
.config("spark.sql.adaptive.enabled", "true") \
.config("spark.sql.shuffle.partitions", "200") \
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \
.enableHiveSupport() \
.getOrCreate()
常见陷阱:
- 不要重复创建 SparkSession:使用
getOrCreate()而非new SparkSession()。 - 风控数据量大时,务必开启
spark.sql.adaptive.enabled动态调整分区,避免 OOM。 - 如果使用 Hive 表,必须调用
enableHiveSupport(),并将 hive-site.xml 放入 classpath。
2.4 风控实验中的初始化最佳实践
- 资源预估: 根据数据量设置 executor 内存(建议 4G~8G/core),避免频繁 GC。
- 动态分配: 开启
spark.dynamicAllocation.enabled,让集群根据负载自动调整 executor 数量。 - 序列化: 使用 Kryo 序列化替代 Java 序列化,减少网络传输开销。
- Hive 元数据: 如果风控特征表存储在 Hive,务必启用 Hive 支持并配置 metastore 地址。
- 日志级别: 开发阶段设置
spark.sparkContext.setLogLevel("WARN")避免 INFO 日志刷屏。
快速验证: 初始化后执行
spark.sql("SELECT 1").show() 确认 SparkSession 工作正常。如果使用 Hive,可尝试 spark.sql("SHOW DATABASES").show() 验证元数据连接。