深入探究Spark -- Cluster Manger部署(最常用为YARN实现Task Scheduler)

部署方式有:Standalone(Spark的Deploy模块)、Mesos、YARN、EC2、Local
 
SparkContext创建时,通过传入的Master URL不同,创建不同的SchedulerBackend和TaskScheduler,在spark.SparkContext#createTaskSchuster实现
 
Master URL:
 
local:以一个工作线程运行计算任务,不重新计算失败的计算任务
 
local[N]/[*]:N个线程,或是启动与CPU core相等数量的线程,也是不会重新计算失败
 
local[threads, maxFailures]:设置线程数与最大的失败重试数
 
local-cluster[numSlaves, coresPerSlave, memoryPerSlave]:本机运行Master和Worker,三个参数分别设置worker的数量、core数、内存
 
前三种方式,SchedulerBackend的实现是scheduler.local.LocalBackend,TaskScheduler的实现是scheduler.TaskSchedulerImpl,它也有LocalActor,通过这个与Executor
第四种为伪分布式,和Standalone类似,只不过都运行在同一个机器。SB的实现是scheduler.cluster.SparkDeploy-SchedulerBackend,TS的实现是scheduler.Task-SchedulerImpl
Worker接到Master的LaunchExecutor信息后,创建实例ExecutorRunner,启动一个新的进程,它的实现是spark.executor.Coarse-GrainedExecutorBackend。它不在Worker进程内
Local-cluster可以启动多个Worker
 
Mesos:采用Master/Slave架构,主要由Master、Slave、Framework、Executor组成,通过ZooKeeper实现Master高可用
 
Mesos资源调度分为粗粒度与细粒度调度
 
粗粒度就是每个Executor获得资源就长期持有,直到应用程序退出才释放。优点是减少资源调度的开销,缺点就是资源被长期占有,会造成资源浪费
细粒度就是根据任务实际动态申请,避免了资源浪费,但同时调度的时间开销更大
通过spark.mesos.coarse来设置是粗还是细
 
 
YARN:重点关注一下
 
YARN包括ResourceManager负责全局管理所有应用的计算资源分配,每一台机器的NodeManager管理应用在这台机器上的进程并组织计算
 
ApplicationMaster负责调度和协调,结合从RM获得的资源和NM协同工作,每一个应用对应的AM的职责有向调度器索取、运行任务、跟踪与监控状态和进程、处理任务失败
 
RM不对应用进行监控和跟踪,是基于应用程序的纯粹调度器,把资源分给多个队列和应用
 
NM是每台机器框架的代理,是执行应用程序的容器,监控应用程序的资源使用并向调度器汇报
 
过程:Client提交Job后,AM向RM请求资源,获得后AM在NM上启动Container,运行计算任务,并监控任务(一个应用对应一个AM,而一个AM对应管理多个NM)
 
YARN的Cluster模式:
 
通过YARN调度Spark Application所需资源。Application通过YARN Client提交到RM,RM在一个工作节点启动AM(注册为YARN ApplicationMaster),开始应用的提交(spark.deploy.yarn.ApplicationMaster)
 
TaskScheduler的实现是spark.scheduler.cluster.YarnClusterScheduler,它完成了AM的初始化。AM通过RM和NM的接口启动若干个容器作为spark.executor.CoarseGrainedExecutorBackend,最终启动Executor
 
 
YARN的Client模式:
 
与Cluster模式区别在于提交Application的SparkContext在本地,适合Application需要与本地交互的场景;Cluster模式是计算的全部节点都在YARN节点上进行。
 
 
SparkContext创建spark.scheduler.cluster.YarnClient-ClusterScheduler和spark.scheduler.cluster.YarnClientSchedulerBackend,分别是两个模块的实现。其中SchedulerBackend可以和ExecutorBackend通过AKKA通信,并向RM提交Application,AM负责在多个节点上启动Executor
 
 
Standalone:
 
Master/Slave架构,Master负责整个集群的资源调度和Application管理,Slave(Worker)接收Master资源调度命令后启动Executor,并最终完成计算任务。
 
Client负责Application的创建和向Master注册,并接收Executor的状态更新和计算结果。
 
 
Master、Worker、Client都是通过AKKA通信,Master和Worker都是一个Actor
 
Master:接收Worker注册并管理所有Worker,接收Client提交Application,并提交给Worker
Worker:向Master注册自己,根据Master发送的Application配置进程环境,并启动StandaloneExecutorBackend
Client:向Master注册并监控Application。创建SparkContext时生成SparkDeploySchedulerBackend,就会向Master发送请求了
 
Standalone模式是通过Spark的Deploy模块就能实现,部署简单,有利于推广Spark
 
得到计算资源Executor,Task就到达了真正计算的步骤。
原文地址:https://www.cnblogs.com/kinghey-java-ljx/p/8522573.html