Standalone模式下有四个重要组成部分,分别为:
Driver:用户编写的Spark应用程序就运行在Driver上,由Driver进程执行
Master:主要负责资源的调度和分配,并进行集群的监控等职责
Worker:Worker运行在集群中的一台服务器上,负责管理该节点上的资源,负责启动节点上的Executor
Executor:一个Worker上可以运行多个Executor,Executor通过启动多个线程(task)对RDD分区进行并行计算
SparkContext中的三大组件:
DAGScheduler:负责将DAG划分成若干个Stage
TaskScheduler:将DAGScheduler提交的Stage进行优先级排序,再将task发送到Executor
SchedulerBackend:定义了许多与Executor事件相关的处理,包括:新的executor注册进来的时候记录executor的信息,增加全局的资源量(核数)。
executor更新状态,若任务完成的话,回收core。其他停止executor、remove executor等事件
Standalone模式下作业提交步骤:
启动应用程序,完成SparkContext的初始化
Driver向Master注册,申请资源
Master检查集群资源状况,若集群资源满足,通知Worker启动Executor
Executor启动后向Driver注册(称为反向注册)
Driver完成DAG的解析,得到Tasks,然后向Executor发送Task
Executor向Driver汇总任务的执行情况
应用程序执行完毕,回收资源
如图所示
Shuffle原理
Shuffle的本意是洗牌,目的是为了把牌弄乱。而Spark、Hadoop中的shuffle不是为了把数据弄乱,而是为了将随机排列的数据转换成具有一定规则的数据。
Shuffle是MapReduce计算框架的一个特殊的阶段,介于Map和Reduce之间,当Map的输出结果要被Reduce使用时,输出结果需要按照key排列,并且分发到Reduce上去,这个过程就是shuffle。
shuffle涉及到了本地磁盘(非HDFS)的读写和网络的传输,大多数Spark作业的性能主要是就是消耗在了shuffle环节,因此shuffle性能的高低直接影响到了这个呢个程序的运行效率。
大概的发展历史为:
Spark 1.1 以前是Hash Shuffle
Spark 1.1 引入了Sort Shuffle
Spark 1.6 将Tungsten-sort并入Sort Shuffle
Spark 2.0 Hash Shuffle退出历史舞台
Hash Base Shuffle V1
每个Shuffle Map Task需要为每个下游的Task创建一个单独的文件
Shuffle过程中会生成海量的小文件,同时打开过多文件、低效的随机IO
Hash Base Shuffle V2
Hash Base Shuffle V2核心思想:允许不同的task复用同一批磁盘文件,有效将多个task的磁盘文件进行一定程度上的合并,从而大幅度减少磁盘文件的数量,进而提升shuffle write的性能。一定程度上解决了Hash V1中的问题,但不彻底
Sort Base Shuffle
Sort Base Shuffle大大减少了shuffle过程中产生的文件数,提高Shuffle的效率,如图所示