3.Spark的执行和数据分区
3.1 spark执行流程
1. 应用程序启动
Spark应用程序从驱动器程序开始执行,创建SparkContext对象。
2. 任务划分
将应用程序操作划分为一系列任务,并分发给执行器。
3. 任务调度
集群管理器将任务分配给可用的执行器。
4. 任务执行
执行器启动任务执行线程,处理任务所需的数据。
5. 数据处理
执行任务的线程对数据进行转换和操作。
6. 数据传输与处理
数据在内存中共享和复用,根据需要在磁盘和内存之间交换。
7. 结果返回
任务执行完成后,结果返回给驱动器程序。
8. 应用程序结束
所有任务执行完成,驱动器程序处理结果并关闭SparkContext对象。
3.2 Spark的作业调度
Spark作业调度的过程如下:
1. 当应用程序提交给Spark集群时,驱动器程序创建一个调度器(Scheduler)。
2. 调度器根据应用程序的需求和集群的可用资源,将作业划分为一系列任务(Tasks)。
3. 任务被分配给可用的执行器(Executors),并在集群中的工作节点上执行。
4. 调度器会根据任务的依赖关系和数据分区,决定任务的执行顺序。
5. 如果任务之间存在依赖关系,调度器会确保依赖任务在前置任务完成后才能执行。
6. 调度器还会考虑数据本地性,尽可能将任务分配给存储有相关数据的工作节点,以减少数据传输的开销。
7. 调度器会监控任务的执行状态,并处理失败的任务,例如重新分配或重新执行失败的任务。
8. 一旦所有任务执行完成,调度器会将结果返回给驱动器程序,应用程序可以继续处理结果或进行下一步操作。
总的来说,Spark作业调度器负责将应用程序划分为可执行的任务,并将这些任务分配给可用的执行器进行并行执行。调度器考虑任务之间的依赖关系、数据本地性和资源利用等因素,以最大化作业的执行效率。
3.3 spark的数据分区
1.Hash分区
通过对数据的键进行哈希计算,将相同哈希值的数据分配到同一个分区。这种方式通常适用于需要均匀分布数据的情况。
2.Range分区
根据数据的键的范围将数据划分为不同的分区。每个分区负责一定范围的键。这种方式通常适用于有序的数据集。
3.Round-robin分区
将数据按照轮询的方式均匀分配到不同的分区。这种方式适用于需要均匀分布数据且不依赖键的情况。
4.自定义分区
Spark还提供了自定义分区的功能,允许用户根据自己的需求实现特定的分区逻辑。