Spark天堂之门

来源:互联网 发布:centos安装switchdesk 编辑:程序博客网 时间:2024/06/02 10:20
Spark天堂之门解密
视频学习来源:DT-大数据梦工厂 IMF传奇行动视频

本期内容:

   1、Spark天堂之门

   2、SparkContext使用案例借鉴

   3、SparkContext内幕

   4、SparkContext源码解密

 一、Spark天堂之门

   1、Spark程序在执行的时候分为Driver和Executor两部分;

   2、Spark程序的编写核心基础是RDD,具体包含两部分:

       a)是由SparkContext来最初创建第一个RDD,一定是由SparkContext来创建的;

       b)Spark程序的调度优化也是基于SparkContext;

   3Spark程序的注册要通过SparkContext实例化时候产生的对象来完成(其实是由SchedulerBackend注册程序);

   4Spark程序运行的时候要通过ClusterManager获得具体的资源,计算资源的获取也是由SparkContext产生的对象来申请的(其实   
           SchedulerBackend来获取资源的);

   5、SparkContext崩溃或者结束的整个Spark程序也结束啦!

 总结:SparkContext开启天堂之门:Spark程序是通过SparkContext发布到Spark集群的;

           SparkContext导演天堂世界:SPark程序的运行都是在SparkContext为核心的调度器下指挥下进行的;

           SparkContext关闭天堂之门:SparkContext崩溃或者结束整个Spark程序结束了;

运行Wordcount程序

三、SparkContext内幕天堂揭秘

   1、SparkContext构建的顶级三大核心对象:DAGScheduler、TaskScheduler、SchedulerBackend,其中:

           a)SchedulerBackend是面向Stage的调度器;

           b)TaskScheduler是一个接口,更加具体的Cluster Manager的不同会有不同的实现,Standalone模式下具体的实现是       TaskSchedulerlmpl;

           c)SchedulerBackend是一个接口,更加具体的Cluster Manager的不同会有不同的实现,Standalone模式下具体的实现是  SparkDeploySchedulerBackend;

   2、从整个程序运行的角度来讲,SparkContext包含四大核心对象:DAGScheduler、TaskScheduler、SchedulerBackend、MapOutputTrackerMaster。

createTaskScheduler     case SIMR_REGEX(simrUrl) =>        val scheduler = new TaskSchedulerImpl(sc)        val backend = new SimrSchedulerBackend(scheduler, sc, simrUrl)        scheduler.initialize(backend)        (backend, scheduler)

SparkDeploySchedulerBackend有三大核心功能:

   负责与Master链接注册当前程序;

   接收集群中为当前应用程序而分配计算资源Executor的注册并管理Executor

   负责发送Task到具体的Executor执行;

补充说明的是:SparkDeploySchedulerBackend是被TaskSchedulerImpl来管理的。
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,在CoarseBrainedExecutorBackend中启动Executor(Executor先注册)

val executorConf = new SparkConf      val port = executorConf.getInt("spark.executor.port", 0)      val fetcher = RpcEnv.create(        "driverPropsFetcher",        hostname,        port,        executorConf,        new SecurityManager(executorConf),        clientMode = true)      val driver = fetcher.setupEndpointRefByURI(driverUrl)      val props = driver.askWithRetry[Seq[(String, String)]](RetrieveSparkProps) ++        Seq[(String, String)](("spark.app.id", appId))      fetcher.shutdown()
private def registerWithMaster(nthRetry: Int) {      registerMasterFutures.set(tryRegisterAllMasters())      registrationRetryTimer.set(registrationRetryThread.scheduleAtFixedRate(new Runnable {        override def run(): Unit = {          Utils.tryOrExit {            if (registered.get) {              registerMasterFutures.get.foreach(_.cancel(true))              registerMasterThreadPool.shutdownNow()            } else if (nthRetry >= REGISTRATION_RETRIES) {              markDead("All masters are unresponsive! Giving up.")            } else {              registerMasterFutures.get.foreach(_.cancel(true))              registerWithMaster(nthRetry + 1)            }          }        }      }, REGISTRATION_TIMEOUT_SECONDS, REGISTRATION_TIMEOUT_SECONDS, TimeUnit.SECONDS))    }


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

DT大数据梦工厂

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

微信公众号:DT_Spark

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

TEL:18610086859

Email:18610086859@vip.126.com






















2 0
原创粉丝点击