Spark RunTime内幕解密

来源:互联网 发布:路旁的叶修写真集淘宝 编辑:程序博客网 时间:2024/05/17 23:34

第26课:SparkRuntime内幕解密

本期内容:

1 再论Spark集群部署

2Job提交解密

3Job的生成和接受

4Task的运行

5 再论Shuffle

一、再论Spark集群部署

1、从Spark Runtime的角度来讲由五大核心对象:Master、Worker、Executor、Driver、CoarseGrainedExecutorBackend;

2、Spark在做分布式集群系统设计的时候,最大化功能独立,模块化封装具体独立的对象、强内聚弱耦合;


3、当Driver中的SparkContext初始化的时候会提交程序给Master,Master如果接受该程序在Spark中运行的话,就会为当前程序分配APPID,同时会分配具体的计算资源,需要特别注意的是:Master是根据当前提交程序的配置信息来给集群中的Worker发指令分配具体的计算资源,但是,Master发出指令后并不关心具体的资源是否已经分配,也就是说Master是发指令后就记录了分配的资源,以后客户端再次提交其他的程序的话就不能使用该资源了,其弊端就是可能会导致其他要提交的程序无法分配到本来应该可以分配到的计算资源,最终的优势在Spark分布式系统功能弱耦合的基础上最快的运行系统(否则如果Master要等到资源最终分配成功后才通知Driver的话,就会造成Driver阻塞,不能够最大化的并行计算资源的使用率)。

注:Spark在默认情况下由于机器中一般都只有一个Application在运行,所有Master分配资源的策略的弊端就没有那么明显了。

二、Job提交提交的过程源码解密

运行作业Wordcount

1、一个非常重要的技巧是通过Spark shell中运行一个Job提交的过程, 然后在用源码辅助验证

2、在Spark中所有的action都会触发一个Job,在上述代码中是通过saveAsTextFile来触发Job的,DAGScheduler在实例化的过程中是ExecutorBackend,

3、SparkContext在实例化的时候会构造SparkDeploySchedulerBackend、DAGScheduler、TaskSchedulerLmpl等对象,其中SparkDeploySchedulerBackend负责集群计算资源的管理和调度,DAGScheduler辅助高层调度(例如Job中Stage的划分、数据本地性等内容),TaskSchedulerlmple负责Stage内部的底层调度(例如具体每个Task的调度、Task的容错等),MapOutputTrackerMaster负责Shuffle中数据

private[spark] sealed trait MapOutputTrackerMessageprivate[spark] case class GetMapOutputStatuses(shuffleId: Int)  extends MapOutputTrackerMessageprivate[spark] case object StopMapOutputTracker extends MapOutputTrackerMessage /** RpcEndpoint class for MapOutputTrackerMaster */private[spark] class MapOutputTrackerMasterEndpoint(    override val rpcEnv: RpcEnv, tracker: MapOutputTrackerMaster, conf: SparkConf)  extends RpcEndpoint with Logging {  val maxAkkaFrameSize = AkkaUtils.maxFrameSizeBytes(conf)

三、Task的运行解密:

    1、Task是运行在Executor中,而Executor又是位于CoarseGrainedExecutorBackend中的,且CoardeGrainedExecutorBackend和Executor是一一对应的。

    private def launchTasks(tasks: Seq[Seq[TaskDescription]]) {      for (task <- tasks.flatten) {        val serializedTask = ser.serialize(task)        if (serializedTask.limit >= akkaFrameSize - AkkaUtils.reservedSizeBytes) {          scheduler.taskIdToTaskSetManager.get(task.taskId).foreach { taskSetMgr =>            try {              var msg = "Serialized task %s:%d was %d bytes, which exceeds max allowed: " +                "spark.akka.frameSize (%d bytes) - reserved (%d bytes). Consider increasing " +                "spark.akka.frameSize or using broadcast variables for large values."              msg = msg.format(task.taskId, task.index, serializedTask.limit, akkaFrameSize,                AkkaUtils.reservedSizeBytes)              taskSetMgr.abort(msg)            } catch {              case e: Exception => logError("Exception in error callback", e)            }          }。

2、当CoardeGrainedExecutorBackend接收到TaskSetManager发过来的LaunchTasks消息。

补充说明:LaunchTask是一个cassclass。



王家林老师是大数据技术集大成者,中国Spark第一人:

DT大数据梦工厂

新浪微博:www.weibo.com/ilovepains/

微信公众号:DT_Spark

博客:http://.blog.sina.com.cn/ilovepains

TEL:18610086859

Email:18610086859@vip.126.com














0 0
原创粉丝点击