认识spark
一、Spark的运行架构
Spark采用经典的主从(Master-Slave)架构。它的核心组件如下图所示,协同工作以分布式地处理大规模数据。 一个完整的Spark应用(Application)在集群上运行时,主要由以下组件构成:
-
集群管理器(Cluster Manager) 角色: 集群的资源管理和调度者,负责在底层物理机器上分配资源。 类型: Spark支持多种集群管理器,使其非常灵活。 Standalone: Spark自带的简单集群管理器。 Apache YARN: Hadoop生态系统中的资源调度器。 Mesos: 一个通用的集群管理器。 Kubernetes: 目前最流行的容器编排系统。
-
驱动器节点(Driver) 角色: Spark应用的“大脑”,是执行用户main方法的进程。 主要职责: 分解任务: 将用户程序转换为多个任务(Task)。 调度任务: 与Cluster Manager通信,为任务申请资源。 管理执行: 将任务分发给Executor执行,并跟踪它们的运行状态。 保存状态: 保存计算的元数据(如RDD的依赖关系链),并在任务失败时进行恢复。 收集结果: 收集各个Task的计算结果。
-
执行器节点(Executor) 角色: 在工作节点(Worker Node)上运行的工作进程,负责执行具体的计算任务。 主要职责: 执行任务: 运行Driver分配过来的Task。 数据缓存: 将计算出的RDD分区数据缓存(Cache/Persist)在内存或磁盘中。 结果返回: 将任务执行结果返回给Driver。 每个应用都有自己的一组Executor,它们在整个应用生命周期内保持运行,实现了多线程并行计算,避免了每个任务都启动新进程的开销。
-
任务(Task) 角色: 被发送到Executor上执行的最小工作单元。 一个Task负责计算一个RDD分区(Partition)的数据。 多个Task可以并行地在不同的Executor上运行。 运行流程简述: 用户启动一个Spark应用。 Driver程序启动,并向Cluster Manager注册并申请资源。 Cluster Manager在Worker Node上启动Executor进程。 Driver将用户代码(由一系列的RDD转换和动作构成)编译成有向无环图(DAG),然后进一步分解为任务集(TaskSet)。 Driver将Task分发给空闲的Executor。 Executor执行Task,并将中间结果或最终结果返回给Driver。 所有任务执行完毕后,Driver正常退出或返回最终结果,Cluster Manager会回收所有资源。
二、为什么RDD“自带”容错机制?
RDD的容错机制并非通过传统的数据复制(如HDFS的3副本)来实现的,而是通过其核心设计原理——血统(Lineage) 和不可变性(Immutability) 来优雅地实现的。
-
RDD的核心特性:血统(Lineage) 定义: 每个RDD不仅包含它代表的数据,还记录了它是如何从其他RDD转换(Transformation) 而来的。这个转换关系的依赖图就是血统。 转换并触发行动(Action) 这个过程中,RDD D的血统可以表示为:HDFS -> A -> B -> C -> D。Spark会精确地记录每个RDD的父RDD以及它们之间的转换函数(如map, filter)。
-
容错机制的原理:基于血统的重计算(Recomputation) 当某个RDD的分区数据因为节点故障而丢失时,Spark的容错机制会按以下步骤工作: 检测丢失: Driver在调度任务或接收结果时,发现某个Executor失败或通信超时,从而判定该节点上的数据和计算已丢失。 定位依赖: Driver根据RDD的血统关系图,找到丢失分区对应的那个RDD,并向上追溯其父RDD。 重新计算: Spark会检查父RDD的分区数据是否可用。如果父RDD的分区数据在内存中(被缓存)或在其他节点上可用,则直接使用;否则,继续向上追溯,直到找到一个稳定的起点(例如,HDFS上的数据源,或者一个被成功缓存了的RDD)。 执行重算: 从稳定的起点开始,重新执行一系列转换操作,最终重新计算出丢失的分区数据。 继续上面的例子: 假设rddC的一个分区在某个Executor节点上计算后,该节点突然宕机,导致这个分区的数据丢失。 Spark不会去备份这个rddC的分区,而是发现rddC是由rddB通过filter转换而来。 它接着检查rddB的对应分区。如果rddB也被缓存了且可用,就直接用它来重新filter;如果没有,就继续向上找rddA。 最终,Spark发现rddA是从HDFS文件读取的,这是一个稳定的数据源。于是,它会从HDFS重新读取对应的数据块,依次执行map -> filter,最终重新生成丢失的rddC分区。
-
为什么说这是“自带”的? 无需额外配置: 这种容错能力是RDD数据模型固有的属性。只要你使用RDD的转换操作,血统信息就会被自动记录下来,无需开发者手动干预。 逻辑与物理分离: RDD是一个不可变的、只读的数据集合。这意味着它的血统(逻辑计算计划)是确定的,与物理数据的存储位置无关。无论物理数据在哪里、是否丢失,只要血统在,就可以按图索骥地重新生成。 高效与灵活的权衡: 高效: 在无故障发生时,避免了数据复制带来的网络和存储开销。 灵活: 对于迭代式算法(如机器学习),中间结果通常不需要永久保存,重算的代价可能低于维护副本的代价。用户也可以通过persist()或cache()方法将重要的中间RDD缓存起来,避免长血统链带来的重算开销。
总结
Spark架构: 是一个由Driver(大脑)、Executor(工人) 和Cluster Manager(资源总管) 组成的分布式计算框架,通过将任务分发到多个Executor并行执行来高效处理数据。
RDD容错: 其核心在于血统(Lineage) 机制。RDD通过记录其“身世”(如何从稳定的数据源一步步计算而来),在数据丢失时能够通过重放计算过程来恢复数据,而不是依赖昂贵的数据副本。这种设计使得Spark在提供强大容错能力的同时,保持了计算的高效性。

浙公网安备 33010602011771号