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

相关文章

花椒直播市场表现优异,花房集团价值备受市场肯定

世界杯竞猜抽奖券规则详解:如何参与并赢取丰厚奖励

键盘快捷删除键是哪个