转载请注明出处:http://www.cnblogs.com/BYRans/
shell
Spark应用程序相关的几个术语:安全
Spark应用程序有多种运行模式。SparkContext和Executor这两部分的核心代码实如今各类运行模式中都是公用的,在这两部分之上,根据运行部署模式(例如:Local[N]、Yarn cluster等)的不一样,有不一样的调度模块以及对应的适配代码。架构
具体来讲,以SparkContext为程序运行的总入口,在SparkContext的初始化过程当中,Spark会分别建立DAGScheduler做业和TaskScheduler任务调度两级调度模块。并发
其中做业调度模块是基于任务阶段的高层调度模块,它为每一个Spark做业计算具备依赖关系的多个调度阶段(一般根据shuffle来划分),而后为每一个阶段构建出一组具体的任务(一般会考虑数据的本地性等),而后以TaskSets(任务组)的形式提交给任务调度模块来具体执行。而任务调度模块则负责具体启动任务、监控和汇报任务运行状况。框架
详细的运行流程为:异步
做业调度模块和具体的部署运行模式无关,在各类运行模式下逻辑相同。不一样运行模式的区别主要体如今任务调度模块。不一样的部署和运行模式,根据底层资源调度方式的不一样,各自实现了本身特定的任务调度模块,用来将任务实际调度给对应的计算资源。接下来重点介绍下YARN cluster模式的实现原理和实现细节。函数
Spark有多种运行模式,在这里主要介绍下YARN cluster模式的内部实现原理。以下图是YARN cluster模式的原理框图,相对于其余模式,该模式比较特殊的是它须要由外部程序辅助启动APP。用户的应用程序经过辅助的YARN Client类启动。YARN cluster模式和YARN client模式的区别在于:YARN client模式的AM是运行在提交任务的节点,而YARN cluster模式的AM是由YARN在集群中选取一个节点运行,不必定是在提交任务的节点运行。例如spark-shell若是须要使用YARN模式运行,只能为yarn-client
模式,启动命令可使用spark-shell --master yarn-client
。oop
Client类经过YARN Client API提交请求,在Hadoop集群上启动一个Spark ApplicationMaster,Spark ApplicationMaster首先注册本身为一个YARN ApplicationMaster,以后启动用户程序,SparkContext在用户程序中初始化时,使用CoarseGrainedSchedulerBackend配合YARNClusterScheduler,YARNClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增长了对Executor的等待逻辑等。spa
根据Client类传递的参数,Spark ApplicationMaster经过YARN ResourceManager/NodeManager的接口在集群中启动若干个Container,用于运行CoarseGrainedExecutorBackend.CoarseGrainedExecutorBackend在启动过程当中会向CoarseGrainedSchedulerBackend注册。线程
CoarseGrainedSchedulerBackend是一个基于Akka Actor实现的粗粒度的资源调度类,在整个Spark做业运行期间,CoarseGrainedSchedulerBackend主要负责以下功能:
Spark的各类运行模式虽然在启动方式、运行为之、调度手段上有所不一样,但它们所要完成的任务基本是一致的,就是在合适的位置安全可靠的根据用户的配置和做业的须要管理和运行任务,在运行调度过程当中须要考虑的问题主要为:
Spark的运行参数有很大一部分是经过环境变量来设置的,例如Executor的内存设置、Library路径等。在Cluster模式下就涉及到环境变量在各个Worker节点的传递问题。不一样的运行模式有不一样的传递方式。须要指出的是,在Local模式下,不存在环境变量的传递问题。
在这里主要说明一下再YARN相关模式下的参数传递。在YARN相关模式中,这些环境变量首先要经过YARN client设置到Spark AM的运行环境中,以后Spark AM在启动Executor时再将环境变量设置到Executor中。
Spark程序的运行主要有两类依赖:
在Local模式下,不存在JAR包分发的问题。在这里主要介绍下YARN模式下的文件分发。
在YARN相关模式中,运行库和程序运行因此来的其余文件首先经过HDFS客户端API上传到做业的.sparkStaing目录下,而后将对应的文件和URL映射关系通知YARN,YARN的Node Manager在启动Container的时候会从指定URL处下载相关文件做为运行环境的一部分。
对于须要进一步分发到Executor运行环境的文件,Spark YARN客户端将须要分发的文件的相关属性(例:URL、时间戳、尺寸等)打包成字符串,经过特定的环境变量(SPARK_YARN_CACHE_XXXX)传递给Spark AM,Spark AM在建立Executor的Container时还原特定环境变中的各个文件,并经过调用setLocalResources函数初始化Container。
Spark任务的运行要解决的问题为:
Spark任务经过DAGScheduler调用TaskScheduler.submitTasks进行派发,该接口将相关的一组任务一块儿提交并进行调度。
任务的运行结果在Executor端被序列化并发送回SchedulerBackend,因为受到Akka帧尺寸的限制,若是运行结果数据过大,结果会存储到BlockManager中,这时候发送到SchedulerBackend的是对应数据的BlockID,TaskScheduler最终会调用TaskResultGetter在线程池中以异步的方式读取结果,TaskSetManager再根据运行结果更新任务状态(好比失败重试等)并汇报给DAGScheduler等。