理解 Spark 写入 API 的数据处理能力( 二 )


三、Spark 架构概述

  • 驱动程序和执行器: Spark 采用主从架构 。驱动节点运行应用程序的 main() 函数并维护有关 Spark 应用程序的信息 。执行器节点执行数据处理和写入操作 。
  • DAG 调度器: 当触发写入操作时,Spark 的 DAG(有向无环图)调度器将高级转换转换为一系列可以在集群中并行执行的阶段 。
  • 任务调度器: 任务调度器在每个阶段内启动任务 。这些任务分布在执行器之间 。
  • 执行计划和物理计划: Spark 使用 Catalyst 优化器创建高效的执行计划 。这包括将逻辑计划(要做什么)转换为物理计划(如何做) , 考虑到分区、数据本地性和其他因素 。
四、在 Spark 内部写入数据(1) 数据分布: Spark 中的数据分布在分区中 。当启动写入操作时 , Spark 首先确定这些分区中的数据布局 。
(2) 写入任务执行: 每个分区的数据由一个任务处理 。这些任务在不同的执行器之间并行执行 。
写入模式和一致性:
  • 对于 overwrite 和 append 模式,Spark 确保一致性,通过管理数据文件的替换或添加来实现 。
  • 对于基于文件的数据源,Spark 以分阶段的方式写入数据,先写入临时位置再提交到最终位置,有助于确保一致性和处理故障 。
(3) 格式处理和序列化: 根据指定的格式(例如,Parquet、CSV) , Spark 使用相应的序列化器将数据转换为所需的格式 。执行器处理此过程 。
(4) 分区和文件管理:
  • 如果指定了分区,则Spark在写入之前根据这些分区对数据进行排序和组织 。这通常涉及在执行器之间移动数据 。
  • Spark 试图最小化每个分区创建的文件数量,以优化大文件大小 , 在分布式文件系统中更有效 。
(5) 错误处理和容错: 在写入操作期间,如果任务失败,Spark 可以重试任务,确保容错 。但并非所有写入操作都是完全原子的,特定情况可能需要手动干预以确保数据完整性 。
(6) 优化技术:
  • Catalyst 优化器: 为效率优化写入计划,例如最小化数据移动 。
  • Tungsten: Spark 的 Tungsten 引擎优化数据序列化和反序列化过程中的内存和 CPU 使用 。
(7) 写入提交协议: Spark 使用写入提交协议来协调特定数据源的任务提交和中止过程,确保对写入数据的一致视图 。
Spark 的写入 API 旨在实现高效和可靠的数据写入,它以复杂的方式编排任务分发、数据序列化和文件管理 。它利用 Spark 的核心组件 , 如 DAG 调度器、任务调度器和 Catalyst 优化器,有效地执行写入操作 。




推荐阅读