Apache Spark详解

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: Apache Spark 是一个开源、分布式计算引擎,专为大规模数据处理设计。它以高速、易用和通用为核心目标。通过内存计算、DAG 执行引擎和惰性求值等特性,大幅提升数据处理效率。其核心组件包括 Spark Core、Spark SQL、Spark Streaming、MLlib 和 GraphX,支持批处理、实时流处理、机器学习和图计算。Spark 提供统一编程模型,支持多语言(Scala/Java/Python/R),并拥有强大的 Catalyst 优化器和类型安全的 Dataset API,广泛应用于大数据分析和处理场景。

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):自定义类型安全的聚合函数。

相关文章
|
SQL 分布式计算 调度
Spark入门(一篇就够了)(三)
Spark入门(一篇就够了)(三)
727 0
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
4月前
|
存储 分布式计算 Java
Spark RDD 及性能调优
RDD(弹性分布式数据集)是Spark的核心抽象,支持容错和并行计算。其架构包括分区、计算函数、依赖关系、分区器及优先位置等关键组件。操作分为转换(Transformations)与行动(Actions),提供丰富的API支持复杂数据处理。 执行模型涵盖用户代码到分布式执行的全流程,通过DAG调度优化任务划分与资源分配。内存管理机制动态调整存储与执行内存,提升资源利用率。 性能调优涉及资源配置、执行引擎优化及数据处理策略。Catalyst优化逻辑计划,Tungsten提高运行效率,而合理分区与缓解数据倾斜可显著改善性能。这些特性共同确保Spark在大规模数据处理中的高效表现。
|
存储 SQL 分布式计算
Apache Iceberg数据湖基础
Apache Iceberg 是新一代数据湖表格式,旨在解决传统数据湖(如 Hive)在事务性、并发控制和元数据管理上的不足。它支持 Spark、Flink、Trino 等多种计算引擎,提供 ACID 事务、模式演化、分区演化等核心特性,具备良好的云存储兼容性和高性能查询能力,适用于大规模结构化数据分析场景。
|
5月前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
|
4月前
|
前端开发 Java 微服务
2025 年全网超全 Java 从入门到精通学习路线指南
这是一份全面的Java学习路线图,涵盖从基础到进阶的知识体系。基础阶段包括环境搭建、语法学习与面向对象编程;进阶阶段深入数据结构、多线程、JVM原理及泛型集合;框架阶段掌握Spring、MyBatis等工具;数据库阶段学习SQL、MySQL及Redis;前端技术涉及HTML、CSS与Vue;分布式阶段探讨微服务架构、Docker与Kubernetes;最后通过企业级项目实战提升性能优化与代码重构能力。资源地址:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
1069 7
|
6月前
|
存储 缓存 分布式计算
ClickHouse核心架构设计
本文深入解析了列式存储、数据压缩、向量化执行引擎、分布式计算模型及MergeTree引擎的底层原理。首先对比列式与行式存储,阐述列式存储在减少I/O、高效压缩及向量化处理方面的优势;接着分析常用压缩算法(如LZ4、ZSTD)及其优化策略。随后探讨向量化执行引擎的工作机制,包括数据块结构、SIMD指令加速及零拷贝技术,显著提升OLAP查询性能。分布式计算部分详解分片与副本机制,确保高可用与扩展性。最后聚焦MergeTree引擎,涵盖数据写入、合并、主键索引、跳数索引及分区管理等核心功能,并提供最佳实践建议。
|
9月前
|
SQL 存储 大数据
Flink 基础详解:大数据处理的强大引擎
Apache Flink 是一个分布式流批一体化的开源平台,专为大规模数据处理设计。它支持实时流处理和批处理,具有高吞吐量、低延迟特性。Flink 提供统一的编程抽象,简化大数据应用开发,并在流处理方面表现卓越,广泛应用于实时监控、金融交易分析等场景。其架构包括 JobManager、TaskManager 和 Client,支持并行度、水位线、时间语义等基础属性。Flink 还提供了丰富的算子、状态管理和容错机制,如检查点和 Savepoint,确保作业的可靠性和一致性。此外,Flink 支持 SQL 查询和 CDC 功能,实现实时数据捕获与同步,广泛应用于数据仓库和实时数据分析领域。
5143 32
|
9月前
|
消息中间件 存储 缓存
一文带你秒懂 Kafka工作原理!
Apache Kafka 是一个高吞吐量、低延迟的分布式消息系统,广泛应用于实时数据处理、日志收集和消息队列等领域。它最初由LinkedIn开发,2011年成为Apache项目。Kafka支持消息的发布与订阅,具备高效的消息持久化能力,适用于TB级数据的处理。
|
分布式计算 资源调度 监控
什么是 Spark DAG?
【8月更文挑战第14天】
1123 5