当前位置: 首页 > news >正文

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 中)。
Apache Spark
性能关键
核心组件
核心概念
内存计算
DAG执行引擎
惰性求值
Spark Core
Spark SQL
Spark Streaming
MLlib
GraphX
RDD
DataFrame
Dataset

Apache Spark 的结构化 API

核心特性解析
  • 统一编程模型

    • 批流一体:相同 API 处理静态数据与实时流。

    • 多语言支持:Scala/Java/Python/R 统一接口。

    • 多引擎整合:SQL/MLlib/GraphX 共享执行引擎。

  • 惰性执行与优化(Catalyst优化):分析逻辑计划 -> 逻辑优化(谓词下推/常量折叠) -> 物理计划生成 -> 代码生成。

  • 结构化数据操作

    操作类型示例特点
    转换(Transformation)select(), filter(), join()惰性执行,返回新DataFrame
    行动(Action)show(), count(), write()触发实际计算
    聚合groupBy().agg()支持窗口函数
    UDFspark.udf.register()向量化优化执行

结构化 API 基础——DataFrame

数据源统一架构
数据源
DataFrameReader
格式指定
配置选项
加载数据
DataFrame
转换操作
DataFrameWriter
保存数据
  • 核心组件:

    • 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。

  • 压缩算法

    格式压缩算法压缩率速度
    ParquetSNAPPY★★★☆★★★★
    ORCZLIB★★★★☆★★★
    CSVGZIP★★★★★★

Spark SQL 与外部数据源

Spark SQL
  • Catalyst 优化器

    • 解析:SQL 语句 → 未绑定的逻辑计划。

    • 绑定:结合元数据→ 已绑定的逻辑计划。

    • 优化:应用规则(列裁剪、谓词下推等)→ 优化后的逻辑计划(Optimized Logical Plan)。

    • 物理计划生成:转换为可执行的 SparkPlan(RDD 操作)。

  • 执行引擎

    • 将物理计划转为 RDD 操作,利用 Spark Core 的分布式计算能力。
    • 支持 Code Generation(代码生成),动态编译优化逻辑为字节码,减少虚函数调用。
  • Hive On MapReduce & Spark SQL

    指标Hive on MapReduceSpark SQL
    执行引擎MapReduce(磁盘)RDD(内存)
    优化器Hive OptimizerCatalyst
    延迟高(分钟级)低(秒级)
    复杂查询支持有限强(窗口函数等)
外部数据源架构
Parquet/ORC/JSON
JDBC
Kafka
Cassandra
Delta Lake
ETL
Spark SQL
统一连接接口
标准数据源
Inner Connector
文件系统
扩展数据源
Community Connector
RDBMS
Kafka
NoSQL
湖仓一体
原始数据
BI工具
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):自定义类型安全的聚合函数。

相关文章:

  • 三十五、面向对象底层逻辑-Spring MVC中AbstractXlsxStreamingView的设计
  • Java求职者面试:微服务技术与源码原理深度解析
  • Spring Cloud Alibaba Seata安装+微服务实战
  • SpringCloud——微服务
  • 微服务体系下将环境流量路由到开发本机
  • (五)Linux性能优化-CPU-性能优化
  • 正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-12.1 Linux内核启动流程简介
  • Webworker详解应用场景大片文件Hash计算
  • Web3 借贷与清算机制全解析:链上金融的运行逻辑
  • 用 Melos 解决 Flutter Monorepo 的依赖冲突:一个真实案例
  • 使用 Melos 高效管理 Flutter/Dart Monorepo 项目
  • 【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”
  • Electron通信流程
  • 如何优化React Native应用以适配HarmonyOS5?
  • CppCon 2015 学习:Memory and C++ debugging at Electronic Arts
  • 例说局部性原理给程序带来的提升
  • 【PyCharm必会基础】正确移除解释器及虚拟环境(以 Poetry 为例 )
  • 【每日一题 | 2025年6.2 ~ 6.8】第16届蓝桥杯部分偏简单题
  • 3.机器学习-分类模型-线性模型
  • Go语言多线程问题
  • 淄博营销型网站建设公司/专注网站建设服务机构
  • 做jsp网站用哪些软件下载/磁力天堂最新版地址
  • 网站建设易网宣/站长工具权重查询
  • 深圳市福田区香蜜湖街道/搜索优化指的是什么
  • 南京英文网站建设/巨量数据官网
  • vs2013 网站建设/名风seo软件