Apache Spark详解

发布于:2025-06-09 ⋅ 阅读:(23) ⋅ 点赞:(0)

Apache Spark Introduction

Spark Introduction
  • 定义: Apache Spark 是一个开源的、分布式、统一的计算引擎,专为大规模数据处理而设计。
  • 核心目标: 提供高速(Lightning-Fast)易用通用的数据处理能力。
Spark 性能关键
  • 内存计算 (In-Memory Computing): Spark 尽可能将中间数据保留在集群内存中,避免了传统 MapReduce 需要反复读写磁盘的瓶颈,极大提升迭代算法和交互式查询速度。
  • 有向无环图 (DAG) 执行引擎:
    • Spark 将用户程序构建成一个 DAG(Directed Acyclic Graph),表示操作之间的依赖关系。
    • DAG Scheduler 负责将 DAG 分解成一系列 Stage(阶段)
    • Task Scheduler 将 Stage 内的任务 (Task) 分发到集群节点并行执行。
    • 这种机制允许进行全局优化(如流水线执行、任务合并),比 MapReduce 的固定 map-shuffle-reduce 模型更高效。
  • 惰性求值 (Lazy Evaluation):
    • Spark 在遇到 Transformations(转换操作,如 map, filter, join) 时,并不会立即计算,而是记录元数据,构建执行计划。
    • 只有当遇到 Actions(行动操作,如 count, collect, save) 时,才会触发整个 DAG 的优化和执行。
    • 允许 Spark 进行整体优化(Catalyst 优化器),减少不必要的数据移动和计算。
Spark Component
  • Spark SQL / DataFrame & Dataset API: 处理结构化/半结构化数据。支持 SQL 查询、ETL、读写各种数据源,最主流的 API。
  • Spark Streaming : 处理实时流数据。提供基于微批处理或持续处理模型的、高吞吐、可容错的流处理能力。
  • MLlib: 机器学习库。提供常见的机器学习算法(分类、回归、聚类、推荐等)和工具(特征工程、模型评估、流水线)。
  • GraphX: 图计算库。用于处理图结构数据(社交网络、推荐关系等),提供图算法和操作。
  • Spark Core: 提供最基础的分布式任务调度、内存管理、容错机制、RDD API,是整个 Spark 生态的基石。
Core Conception
  • RDD (Resilient Distributed Dataset): 弹性分布式数据集,是 Spark 最底层的、不可变的、分区的数据集合抽象。
  • DataFrame: 基于 RDD 以命名列 (Named Columns) 组织的分布式数据集合,具有 Schema 信息,Spark SQL 的核心抽象。
  • Dataset: 在 DataFrame 之上增强的 API。提供类型安全 (Type-Safe) 的编程接口(在 Scala 和 Java 中)。
Apache Spark
性能关键
核心组件
核心概念
内存计算
DAG执行引擎
惰性求值
Spark Core
Spark SQL
Spark Streaming
MLlib
GraphX
RDD
DataFrame
Dataset

Apache Spark 的结构化 API

核心特性解析
  • 统一编程模型

    • 批流一体:相同 API 处理静态数据与实时流。

    • 多语言支持:Scala/Java/Python/R 统一接口。

    • 多引擎整合:SQL/MLlib/GraphX 共享执行引擎。

  • 惰性执行与优化(Catalyst优化):分析逻辑计划 -> 逻辑优化(谓词下推/常量折叠) -> 物理计划生成 -> 代码生成。

  • 结构化数据操作

    操作类型 示例 特点
    转换(Transformation) select(), filter(), join() 惰性执行,返回新DataFrame
    行动(Action) show(), count(), write() 触发实际计算
    聚合 groupBy().agg() 支持窗口函数
    UDF spark.udf.register() 向量化优化执行

结构化 API 基础——DataFrame

数据源统一架构
数据源
DataFrameReader
格式指定
配置选项
加载数据
DataFrame
转换操作
DataFrameWriter
保存数据
  • 核心组件:

    • DataFrameReader:入口:spark.read;支持格式:csv, json, parquet, orc, jdbc 等。

    • DataFrameWriter:入口:df.write;输出模式:append, overwrite, ignore, errorIfExists

内置数据源
  • Parquet (默认格式):列式存储,高效压缩,支持谓词下推。

  • ORC:优化的行列式文件,行组内按列存储,适用于查全表的场景。

  • 数据源格式:CSV、JSON、JDBC 数据库连接。

  • 分区发现(Partition Discovery):当读取分区目录结构时自动识别分区。

  • 谓词下推(Predicate Pushdown):将过滤条件下推到数据源层,减少磁盘I/O。

  • 压缩算法

    格式 压缩算法 压缩率 速度
    Parquet SNAPPY ★★★☆ ★★★★
    ORC ZLIB ★★★★☆ ★★★
    CSV GZIP ★★★★ ★★

Spark SQL 与外部数据源

Spark SQL
  • Catalyst 优化器

    • 解析:SQL 语句 → 未绑定的逻辑计划。

    • 绑定:结合元数据→ 已绑定的逻辑计划。

    • 优化:应用规则(列裁剪、谓词下推等)→ 优化后的逻辑计划(Optimized Logical Plan)。

    • 物理计划生成:转换为可执行的 SparkPlan(RDD 操作)。

  • 执行引擎

    • 将物理计划转为 RDD 操作,利用 Spark Core 的分布式计算能力。
    • 支持 Code Generation(代码生成),动态编译优化逻辑为字节码,减少虚函数调用。
  • Hive On MapReduce & Spark SQL

    指标 Hive on MapReduce Spark SQL
    执行引擎 MapReduce(磁盘) RDD(内存)
    优化器 Hive Optimizer Catalyst
    延迟 高(分钟级) 低(秒级)
    复杂查询支持 有限 强(窗口函数等)
外部数据源架构
Parquet/ORC/JSON
JDBC
Kafka
Cassandra
Delta Lake
ETL
Spark SQL
统一连接接口
标准数据源
Inner Connector
文件系统
扩展数据源
Community Connector
RDBMS
Kafka
NoSQL
湖仓一体
原始数据
BI工具
ML模型

Dataset 类型安全 API (Dataset API)

Dataset API
  • 编译时类型检查:由编程语言(Scala/Java)编译器在代码运行前检测类型错误。
  • 面向对象操作:可直接使用对象方法(如 user.name),而非字符串表达式(如 col("name"))操作数据。
  • 性能优化:结合 DataFrame 的 Catalyst 优化器与 RDD 的 Lambda 函数优势。
类型安全(Type-Safety)
错误阶段 DataFrame(弱类型) Dataset(强类型)
编译时检查 ❌ 类型错误需运行时才能发现 ✅ 编译时直接报错(如字段名拼写错误、类型不匹配)
运行时检查 ✅ 可运行,但可能因类型问题失败 ✅ 错误在编译阶段已被排除
核心特性
  • 编程接口更自然:可直接使用类成员和方法。

  • Lambda 函数支持:结合函数式编程处理数据。

  • 与 Catalyst 优化器协作:类型操作会被 Catalyst 解析为逻辑计划,不影响执行优化性能

  • 编译时类型安全聚合 (UDAF):自定义类型安全的聚合函数。