Spark Runtime解密

来源:互联网 发布:软件错误代码c0000005 编辑:程序博客网 时间:2024/06/04 23:32

一 再论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阻塞,不能够最大化并行计算资源的使用率,master不用等程序运行完再返回给driver,而让driver等好长时间)。

需要补充说明的是,spark在默认情况下由于集群中一般都只有一个application在运行,所以master分配资源策略的弊端就没有那么明显了。

二 job提交过程源码解码

1.一个非常重要的技巧通过在spark-shell中运行一个job来了解job提交过程,然后在用源码验证这个过程;

sc.textFile("/data/putfile.txt").flatMap(_.split(" ")).map(word=> (word,1)).reduceByKey(_+_).savaAsTextFile("/root/result.txt")

2.在spark中所有的action都会触发一个或至少一个job,在上述代码中是通过saveAsTextFile来触发job的。

3.Sparkcontext在实例化的时候会构造SparkDeploySchedulerBackend,DAGScheduler,TaskSchedulerImpl,MapOutputTrackerMaster等对象,其中SparkDeploySchedulerBackend负责集群计算资源的管理和调度,DAGScheduler负责高层调度(例如job中stage的划分,数据本地性等内容),TaskSchedulerImpl负责具体stage内部的底层调度(例如具体每个task的调度,task的容错等),MapOutputTrackerMaster负责shuffle中数据输出和读取的管理;

4.taskSchedulerImpl内部调度

这里写图片描述

三 task的运行解密

1.task是运行在executor中,而executor又是位于CoarGrainedExecutorBackend中的,且CoarGrainedExecutorBackend(是进程)和executor是一一对应的。

当CoarGrainedExecutorBackend接收到TaskSetManager发过来的LaunchTask消息后反序列化TaskDescription,然后使用CoarseGrainedExecutorBackend中唯一的Executor(executor.launTask)来执行任务。

case LaunchTask(data) =>  if (executor == null) {    logError("Received LaunchTask command but executor was null")    System.exit(1)  } else {    val taskDesc = ser.deserialize[TaskDescription](data.value)    logInfo("Got assigned task " + taskDesc.taskId)    executor.launchTask(this, taskId = taskDesc.taskId, attemptNumber = taskDesc.attemptNumber,      taskDesc.name, taskDesc.serializedTask)  }

补充说明:LaunchTask是case class

// Driver to executorscase class LaunchTask(data: SerializableBuffer) extends CoarseGrainedClusterMessage
原创粉丝点击