Spark学习(三) -- SparkContext初始化

标签(空格分隔): Spark


本篇博客以WordCount为例说明Spark Job的提交和运行,包括Spark Application初始化、DAG依赖性分析、任务的调度和派发、中间计算结果的存储和读取。

SparkContext的初始化综述

SparkContext是进行Spark应用开大的主要接口,是Spark上层应用与底层实现的中转站。

  • SparkEnv
  • DAGScheduler
  • TaskScheduler
  • SchedulerBackend
  • WebUI

SparkContext的构造函数中最重要的入参是SparkConf.

  1. 根据初始化入参生成SparkConf,再根据SparkConf来创建SparkEnv;

    //生成SparkEnv
    private[spark] val env = SparkEnv.create(conf, "", conf.get("spark.driver.host", conf.get("spark.driver.port").toInt, isDriver = true, isLocal = isLocal)
    SparkEnv.set(env)

  2. 创建TaskScheduler,根据Spark的运行模式来选择相应的SchedulerBackend,同时启动TaskScheduler;

    //生成TaskScheduler
    private[spark] var taskScheduler = SparkContext.createTaskScheduler(this, master, appName)
    taskScheduler.start()

  3. 为上面创建的TaskScheduler实例为入参创建DAGScheduler并启动运行。

    //生成DAGScheduler
    @volatile private[spark] var dagScheduler = new DAGScheduler(taskScheduler)
    dagScheduler.start()

Spark Repl综述

Scala已经拥有Repl,为什么在Spark中还要自己重写一套Repl呢?Scala原声的Repl,是使用Object来封装输入的代码,而在反序列化过程中,对象的构造函数会被再次调用,产生了副作用,我们希望生成Class而不是Object。(Scala中没有静态方法和静态字段,在Scala中可以用Object实现,对象的构造函数在第一次被使用的时候回调用,如果一个对象从未被使用,那么他的构造器也不会被执行,而且Object的构造函数必须是无参的)

1、scala没有静态方法或者静态字段
2、伴生对象充当于静态方法的类,所以伴生对象中全是静态的
3、Scala中的变量有两种var和val(val类似于Java中final,值不可改变)

Scala Repl执行过程

什么是Repl (Read-Eval-Print Loop)?

刚开始学编程的时候,是不是对搭建环境感觉非常棘手?比如从零开始搭建个 PHP Web 开发环境,要下载 Apache 服务器、PHP,然后安装、配置……经过这么一大堆的无关工作,你可能只是想验证一下教程上的 echo "Hello World"; 能不能工作。
这种时候,如果能有个网站可以在线执行代码:我们只要打开浏览器,进入网页,敲入要执行的代码,点击执行按钮就看到执行结果。那是一件多畅快的事情!
对于这种交互式的开发环境我们叫做 REPL(Read-Eval-Print Loop)

Scala是需要编译执行的,而Repl给我们的错觉是Scala解释执行的。在Repl中输入的语句是如何被真正执行的呢?

1)在Repl中输入的每一行语句,都会被封装成一个Object,这以工作主要由Interpreter完成;
2) 对该Object进行编译;
3) 由ClassLoader加载编译后的Java二进制文件;
4) 执行引擎负责真正执行加载入内存的二进制。

posted @ 2017-01-03 17:23  江湖小妞  阅读(2555)  评论(0编辑  收藏  举报