Spark原理与实践| 青训营笔记

65 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

RDD

RDD是一种抽象,是Spark对于分布式数据集的抽象,它用于所有内存中和磁盘中的分布式数据实体

调度系统

1.DAGScheduler以Shuffle为边界,将开发者设计的计算图DAG拆分为多个执行阶段Stages,然后为每个Stage创建任务集TaskSet。

2.SchedulerBackend通过与Executors中的ExecutorBackend的交互来实时地获取集群中可用的计算资源,并将这些信息记录到ExecutorDataMap数据结构。

3.与此同时,SchedulerBackend根据ExecutorDataMap中可用资源创建WorkerOffer,以WorkerOffer为粒度提供计算资源。

4.对于给定WorkerOffer,TaskScheduler结合TaskSet中任务的本地性倾向,按照PROCESS_LOCAL、NODE_LOCAL、RACK_LOCAL和ANY的顺序,依次对TaskSet中的任务进行遍历,优先调度本地性倾向要求苛刻的Task。

5.被选中的Task由TaskScheduler传递给SchedulerBackend,再由SchedulerBackend分发到Executors中的ExecutorBackend。Executors接收到Task之后,即调用本地线程池来执行分布式任务。

Shuffle

集群范围内跨节点、跨进程的数据分发

瓶颈:分布式数据集在集群内的分发,会引入大量的磁盘I/O网络I/O

Shuffle:Map阶段与Reduce阶段,通过生产与消费Shuffle中间文件的方式,来完成集群范围内的数据交换

Shuffle Write

1.对于数据分区中的数据记录,逐一计算其目标分区,然后填充内存数据结构;

2.当数据结构填满后,如果分区中还有未处理的数据记录,就对结构中的数据记录按(目标分区 ID,Key)排序,将所有数据溢出到临时文件,同时清空数据结构;

3.重复前 2 个步骤,直到分区中所有的数据记录都被处理为止;

4.对所有临时文件和内存数据结构中剩余的数据记录做归并排序,生成数据文件和索引文件。