2. Spark 基础回顾:Spark Core 核心概念与 Spark SQL/Streaming
在构建反欺诈实时评分管道之前,必须牢固掌握 Spark 的三大核心抽象:RDD(弹性分布式数据集)、DAG(有向无环图)调度引擎以及 Shuffle 机制。同时,Spark SQL 的结构化数据处理能力和 Spark Streaming 的微批处理模型是实时评分管道的两大技术支柱。本节将系统梳理这些基础概念,为后续管道设计打下坚实根基。
2.1 Spark Core 核心概念
2.1.1 RDD:弹性分布式数据集
RDD 是 Spark 中最基本的数据抽象,代表一个不可变、可分区、可并行计算的数据集合。RDD 的“弹性”体现在:当部分分区丢失时,可以通过血统(Lineage)信息重新计算恢复,无需额外备份。
| 特性 | 说明 | 反欺诈场景意义 |
|---|---|---|
| 不可变性 | RDD 一旦创建就不能修改,只能通过转换生成新 RDD | 保证数据在计算过程中不被意外篡改,审计友好 |
| 分区性 | 数据被切分成多个分区,分布在集群不同节点上 | 支持对海量交易事件并行处理,提升吞吐 |
| 血统 | 记录 RDD 的依赖关系,用于故障恢复 | 长时间运行的评分管道中,节点故障可快速恢复 |
| 惰性求值 | 转换操作(如 map、filter)只记录依赖,不立即计算 | 优化执行计划,减少不必要的中间结果落盘 |
2.1.2 DAG:有向无环图与作业调度
Spark 将用户的一系列 RDD 转换操作构建成一个 DAG(有向无环图)。DAG 描述了 RDD 之间的依赖关系,并作为 Spark 调度器生成物理执行计划的依据。DAG 被划分为多个 Stage,每个 Stage 包含一组可以流水线执行的窄依赖任务。
2.1.3 Shuffle:数据重分区与性能关键
Shuffle 是 Spark 中最昂贵的操作,发生在宽依赖(如 groupByKey、join、repartition)时。Shuffle 过程需要将数据在集群节点间重新分发,涉及磁盘 I/O、网络传输和序列化/反序列化。
groupByKey 按用户聚合时,如果用户 ID 分布不均匀,会导致数据倾斜,部分 Executor 负载过高,拖慢整体评分速度。建议优先使用 reduceByKey 或 aggregateByKey 等预聚合算子,减少 Shuffle 数据量。
2.2 Spark SQL 与 DataFrame
Spark SQL 是 Spark 处理结构化数据的核心模块,其核心抽象是 DataFrame。DataFrame 是组织成命名列的分布式数据集合,在 RDD 之上提供了更高级的声明式 API,并内置了 Catalyst 优化器 和 Tungsten 执行引擎。
| 特性 | RDD | DataFrame | 反欺诈场景推荐 |
|---|---|---|---|
| 数据表示 | Java/Python 对象 | Row 对象 + Schema | DataFrame 自带 Schema,便于定义交易字段类型 |
| API 风格 | 函数式(map/filter) | 声明式(select/where/groupBy) | SQL 风格更易编写复杂特征计算逻辑 |
| 性能优化 | 开发者手动优化 | Catalyst 自动优化执行计划 | 自动谓词下推、列剪枝,减少 I/O |
| 序列化 | Java/Kryo 序列化 | Tungsten 二进制格式(堆外内存) | 减少 GC 压力,适合高吞吐评分 |
// 使用 DataFrame API 进行反欺诈特征提取
Dataset<Row> transactions = spark.read()
.option("header", "true")
.csv("hdfs://logs/transactions/");
// Catalyst 自动优化:只读取 account_id, amount, timestamp 三列
Dataset<Row> highRiskTxns = transactions
.select("account_id", "amount", "timestamp", "merchant_id")
.where("amount > 10000")
.groupBy("account_id")
.agg(
count("transaction_id").as("txn_count_1h"),
sum("amount").as("total_amount_1h")
);
2.3 Spark Streaming 微批处理模型
Spark Streaming 将实时数据流切分成一系列微批次(Micro-batches),每个微批次被当作一个 RDD/DataFrame 处理。这种“批处理流”模型牺牲了亚秒级延迟,换来了高吞吐和 exactly-once 语义保障,非常适合金融反欺诈场景。
微批处理 vs 原生流处理
| 对比维度 | Spark Streaming(微批) | Flink(原生流) | 反欺诈场景选择依据 |
|---|---|---|---|
| 延迟 | 秒级(通常 1-10 秒) | 毫秒级 | 反欺诈通常接受秒级延迟,微批足够 |
| 吞吐 | 极高(批处理优化) | 高 | 微批在吞吐上更有优势,适合大流量 |
| Exactly-once | 原生支持(结合 WAL) | 原生支持 | 两者均满足金融级一致性要求 |
| 与批处理统一 | 同一引擎,代码复用 | 需额外配置 | Spark 可同时处理历史批数据和实时流 |
2.4 本章小结
- RDD 是 Spark 的底层抽象,提供不可变、分区、血统恢复等核心能力;DAG 调度引擎通过 Stage 划分优化作业执行;Shuffle 是性能关键,需谨慎设计。
- Spark SQL / DataFrame 提供了声明式 API 和 Catalyst 优化器,在反欺诈特征提取中可自动进行谓词下推和列剪枝,显著提升 I/O 效率。
- Spark Streaming 的微批处理模型以秒级延迟换取高吞吐和 exactly-once 语义,是构建实时评分管道的理想选择。