Apache Spark详解

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 中)。
flowchart LR A[Apache Spark] A ---> C[性能关键] A ----> D[核心组件] A --> E[核心概念] C --> C1["内存计算"] C --> C2["DAG执行引擎"] C --> C3["惰性求值"] D --> D1["Spark Core"] D --> D2["Spark SQL"] D --> D3["Spark Streaming"] D --> D4["MLlib"] D --> D5["GraphX"] E --> E1["RDD"] E --> E2["DataFrame"] E --> E3["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

数据源统一架构

graph LR A[数据源] --> B[DataFrameReader] B --> C[格式指定] C --> D[配置选项] D --> E[加载数据] E --> F[DataFrame] F --> G[转换操作] G --> H[DataFrameWriter] H --> I[保存数据]
  • 核心组件:

    • 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
    延迟 高(分钟级) 低(秒级)
    复杂查询支持 有限 强(窗口函数等)

外部数据源架构

graph TD A[Spark SQL] --> B[统一连接接口] B --> C[标准数据源] C --> D[Inner Connector] D -->|Parquet/ORC/JSON| E(文件系统) B --> F[扩展数据源] F --> G[Community Connector] G -->|JDBC| H(RDBMS) G -->|Kafka| I(消息队列) G -->|Cassandra| J(NoSQL) G -->|Delta Lake| K(湖仓一体) I[Kafka] --> K S3[原始数据] -->|ETL| K K --> BI[BI工具] K --> ML[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):自定义类型安全的聚合函数。

相关推荐
QX_hao1 天前
【Go】--map和struct数据类型
开发语言·后端·golang
MC丶科1 天前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
G探险者1 天前
为何一个系统上线要经过N轮测试?带你看懂企业级发布体系
后端
TDengine (老段)1 天前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)1 天前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
lang201509281 天前
Spring Boot 入门:5分钟搭建Hello World
java·spring boot·后端
字节数据平台1 天前
火山引擎Data Agent再拓新场景,重磅推出用户研究Agent
大数据·人工智能·火山引擎
间彧1 天前
Windows Server,如何使用WSFC+nginx实现集群故障转移
后端
间彧1 天前
Nginx + Keepalived 实现高可用集群(Linux下)
后端