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 在遇到 Transformations(转换操作,如
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 的结构化 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 :入口:
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 延迟 高(分钟级) 低(秒级) 复杂查询支持 有限 强(窗口函数等)
外部数据源架构
Dataset 类型安全 API (Dataset API)
Dataset API
- 编译时类型检查:由编程语言(Scala/Java)编译器在代码运行前检测类型错误。
- 面向对象操作 :可直接使用对象方法(如
user.name
),而非字符串表达式(如col("name")
)操作数据。 - 性能优化:结合 DataFrame 的 Catalyst 优化器与 RDD 的 Lambda 函数优势。
类型安全(Type-Safety)
错误阶段 | DataFrame(弱类型) | Dataset(强类型) |
---|---|---|
编译时检查 | ❌ 类型错误需运行时才能发现 | ✅ 编译时直接报错(如字段名拼写错误、类型不匹配) |
运行时检查 | ✅ 可运行,但可能因类型问题失败 | ✅ 错误在编译阶段已被排除 |
核心特性
-
编程接口更自然:可直接使用类成员和方法。
-
Lambda 函数支持:结合函数式编程处理数据。
-
与 Catalyst 优化器协作 :类型操作会被 Catalyst 解析为逻辑计划,不影响执行优化性能。
-
编译时类型安全聚合 (UDAF):自定义类型安全的聚合函数。