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 在反欺诈团伙挖掘中价值显著,但学习曲线较陡。
Spark 生态架构图 Spark 生态架构 Spark Core Spark SQL Structured Streaming MLlib GraphX 风控实验 / 实时规则 / 离线模型 风控实验通常以 Spark SQL 和 MLlib 为主,实时场景叠加 Structured Streaming

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。
SparkSession 初始化流程 SparkSession 初始化流程 SparkSession.builder() .appName("...") .config("k","v") .enableHiveSupport() .getOrCreate() 关键配置:spark.sql.adaptive.enabled、spark.sql.shuffle.partitions、KryoSerializer 风控场景建议开启动态分区合并,减少小文件与 shuffle 开销

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() 验证元数据连接。