大数据IMF传奇行动绝密课程第28课:Spark天堂之门
来源:互联网 发布:关闭windows错误恢复 编辑:程序博客网 时间:2024/05/16 01:28
Spark天堂之门
1、Spark天堂之门
2、SparkContext使用案例鉴赏
3、SparkContext内幕
4、SparkContext源码解密
1、Spark天堂之门
1)Spark程序在运行的时候分为Driver和Executors两部分;
2)Spark的程序编写是基于SparkContext的,具体来说包含两方面:
a)Spark编程的核心基础RDD,是由SparkContext来最初创建(第一个RDD一定是由SparkContext来创建的)
b)Spark程序的调度优化也是基于SparkContext
3)Spark程序的注册是通过SparkContext实例化时候生成的对象来完成的(其实是SchedulerBackend来获取计算资源的)
4)Spark程序运行的时候要通过Cluster Manager获得具体的计算资源,计算资源的获取也是通过SparkContext产生的对象来申请的(其实是SchedulerBackend来获取计算资源的)
5)SparkContext崩溃或者结束的时候整个Spark程序也结束了!
总结:SparkContext开启了天堂之门:Spark程序是通过SparkContext发布到Spark集群的;
SparkContext导演了天堂世界:Spark程序的运行都是在SparkContext为核心的调度器的指挥下进行的;
SparkContext关闭天堂之门:SparkContext崩溃或者结束的时候整个Spark程序也结束了!
2、SparkContext使用案例鉴赏
3、SparkContext天堂内幕
1)SparkContext构建的顶级三大核心对象:DAGScheduler、TaskScheduler、SchedulerBackend,其中
a)DAGScheduler是面向Job的Stage的高层调度器
b)TaskScheduler是一个抽象接口,根据具体的Cluster Manager的不同会有不同的实现,Standalone模式下具体的实现是TaskSchedulerImpl;
c)SchedulerBackend是一个接口,根据具体的Cluster Manager的不同会有不同的实现,Standalone模式下具体的实现是SparkDeploySchedulerBackend
2)从整个程序运行的角度来讲,SparkContext包含四大核心对象:DAGScheduler、TaskScheduler、SchedulerBackend、MapOutputTrackerMaster
// Create and start the scheduler val (sched, ts) = SparkContext.createTaskScheduler(this, master) _schedulerBackend = sched _taskScheduler = ts _dagScheduler = new DAGScheduler(this) _heartbeatReceiver.ask[Boolean](TaskSchedulerIsSet) // start TaskScheduler after taskScheduler sets DAGScheduler reference in DAGScheduler's // constructor _taskScheduler.start()
createTaskScheduler:
case SPARK_REGEX(sparkUrl) => val scheduler = new TaskSchedulerImpl(sc) val masterUrls = sparkUrl.split(",").map("spark://" + _) val backend = new SparkDeploySchedulerBackend(scheduler, sc, masterUrls) scheduler.initialize(backend) (backend, scheduler)
在Scheduler.initialize调用的时候会创建SchedulerPool
def initialize(backend: SchedulerBackend) { this.backend = backend // temporarily set rootPool name to empty rootPool = new Pool("", schedulingMode, 0, 0) schedulableBuilder = { schedulingMode match { case SchedulingMode.FIFO => new FIFOSchedulableBuilder(rootPool) case SchedulingMode.FAIR => new FairSchedulableBuilder(rootPool, conf) } } schedulableBuilder.buildPools() }
SparkDeploySchedulerBackend有三大核心功能:
负责与Master链接注册当前程序
接收集群中为当前应用程序而分配的计算资源Executor的注册并管理Executors;
负责发送Task到具体的Executor执行
补充说明的是:SparkDeploySchedulerBackend是被TaskSchedulerImpl来管理的
// start TaskScheduler after taskScheduler sets DAGScheduler reference in DAGScheduler's// constructor _taskScheduler.start() val command = Command("org.apache.spark.executor.CoarseGrainedExecutorBackend", args, sc.executorEnvs, classPathEntries ++ testingClassPath, libraryPathEntries, javaOpts)
当通过SparkDeploySchedulerBackend注册程序给Master的时候会把上述command提交给Master,Master发指令给Worker去启动Executor所在的进程的时候加载的main方法所在的入口类就是command中的CoarseGrainedExecutorBackend,当然你可以实现自己的ExecutorBackend,在CoarseGrainedExecutorBackend中启动Executor(Executor是先注册再实例化),Executor通过线程池并发执行Task
private[spark] case class ApplicationDescription( name: String, maxCores: Option[Int], memoryPerExecutorMB: Int, command: Command, appUiUrl: String, eventLogDir: Option[URI] = None, // short name of compression codec used when writing event logs, if any (e.g. lzf) eventLogCodec: Option[String] = None, coresPerExecutor: Option[Int] = None, user: String = System.getProperty("user.name", "<unknown>")) { override def toString: String = "ApplicationDescription(" + name + ")"}
- 大数据IMF传奇行动绝密课程第28课:Spark天堂之门
- 大数据IMF传奇行动绝密课程第74课:Hive on Spark大揭秘
- 大数据IMF传奇行动绝密课程第48课:Spark性能优化第四季
- 大数据IMF传奇行动绝密课程第54课:Spark性能优化第十季之Spark统一内存管理
- 大数据IMF传奇行动绝密课程第21课:从Spark架构中透视Job
- 大数据IMF传奇行动绝密课程第24课:Spark Shuffle内幕彻底揭秘
- 大数据IMF传奇行动绝密课程第26课:Spark Runtime内幕揭秘
- 大数据IMF传奇行动绝密课程第27课:Spark on Yarn彻底解密
- 大数据IMF传奇行动绝密课程第13课:Spark内核架构解密
- 大数据IMF传奇行动绝密课程第14课:Spark RDD解密
- 大数据IMF传奇行动绝密课程第19课:Spark高级排序彻底解密
- 大数据IMF传奇行动绝密课程第21课:从Spark架构中透视Job
- 大数据IMF传奇行动绝密课程第24课:Spark Shuffle内幕彻底揭秘
- 大数据IMF传奇行动绝密课程第26课:Spark Runtime内幕揭秘
- 大数据IMF传奇行动绝密课程第33课:Spark Executor内幕彻底解密
- 大数据IMF传奇行动绝密课程第43课:Spark 1.6 Rpc内幕解密
- 大数据IMF传奇行动绝密课程第44课:真正的Spark功力:性能优化!
- 大数据IMF传奇行动绝密课程第45课:Spark性能优化第一季
- LeetCode 20. Valid Parentheses
- HDU 5818 Joint Stacks(左偏树)
- 【暑期第二次训练赛】小火山的跳子游戏
- 小火山的计算能力
- HDU 5691(状态压缩dp)详解
- 大数据IMF传奇行动绝密课程第28课:Spark天堂之门
- asp.net与三层架构(BLL DAL Model)
- [noip2015] 跳石头
- 镜像字的学习
- mybatis 3.4.2 DefaultSqlSession的配置
- Filter、Servlet和Interceptor的执行顺序
- 小火山的跳子游戏 (GCD)
- Char转为int时高位符号扩展的问题
- 最长公共子序列求解:递归与动态规划方法