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

相关推荐
mazhafener12317 分钟前
智慧照明:集中控制器、单双灯控制器与智慧灯杆网关的高效协同
大数据
打码人的日常分享18 分钟前
物联网智慧医院建设方案(PPT)
大数据·物联网·架构·流程图·智慧城市·制造
咖啡啡不加糖43 分钟前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
大鸡腿同学1 小时前
纳瓦尔宝典
后端
Lansonli2 小时前
大数据Spark(六十一):Spark基于Standalone提交任务流程
大数据·分布式·spark
2302_809798323 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
zhojiew3 小时前
关于akka官方quickstart示例程序(scala)的记录
后端·scala
sclibingqing3 小时前
SpringBoot项目接口集中测试方法及实现
java·spring boot·后端
Rverdoser3 小时前
电脑硬盘分几个区好
大数据