文档章节

从零开始学习Spark--第5章 SparkContext类分析

brian_2017
 brian_2017
发布于 2017/01/17 09:38
字数 1072
阅读 6
收藏 0
1. SparkContext类是Spark的关键类,代码在这里:./core/src/main/scala/org/apache/spark/SparkContext.scala。SparkContext是Spark的入口,负责连接Spark集群,创建RDD,累积量和广播量等。从本质上来说,SparkContext是Spark的对外接口,负责向调用这提供Spark的各种功能。它的作用是一个容器。SparkContext类非常简洁,大多数函数体只有几行代码。


2. scala完全兼容java,可以直接使用java的代码,所以引入了很多java库和hadoop库。


3. SparkContext.scala实现了一个class SparkContext和一个object SparkContext。
    Scala语言不能定义静态成员,于是就出现了单例对象 singleton object,除了用object关键字代替了class之外,单例对象的定义跟class的定义完全一致。
    如果单例对象和某个类的名字是一样的,如SparkContext,那么,它就是这个类的伴生对象-companion object。类和它的伴生对象必须定义在一个源文件里。类,被成为是这个单例对象的伴生类-companion class。类和它的伴生对象可以互相访问其私有成员。
    单例对象有什么意义呢?
    单例对象没有类型,所以,如果只有object SparkContext,就不能创建class SparkContext对象,那么,在需要把SparkContext作为参数的函数调用就不用使用了。因此,object SparkContext的类型,是由它的伴生类 class SparkContext定义的。
    可以使用类型调用单例对象的方法,也可以用类的实例变量指代单例对象,并把它传递给需要类型参数的方法。
    单例对象不带参数。
    单例对象不是用new关键字实例化的,所以不能传递给它实例化参数。
    单例对象在第一次被访问的时候才会被实例化。
    如果单例对象没有伴生类,那么它就是独立对象-standalone object,可以作为相关功能方法的工具类,或者是scala应用的入口点。




4. class SparkContext的定义


class SparkContext(
    val master: String,
    val appName: String,
    val sparkHome: String = null,
    val jars: Seq[String] = Nil,
    val environment: Map[String, String] = Map(),
    val preferredNodeLocationData: scala.collection.Map[String, scala.collection.Set[SplitInfo]] = scala.collection.immutable.Map())
  extends Logging {
...
}


    对scala语言来说,如下这些:
    val master: String,
    val appName: String,
    val sparkHome: String = null,
    val jars: Seq[String] = Nil,
    val environment: Map[String, String] = Map(),
    val preferredNodeLocationData: scala.collection.Map[String, scala.collection.Set[SplitInfo]] = scala.collection.immutable.Map()
    是类SparkContext的参数,scala会根据这些类参数,创建带有这些类参数的主构造器。这些参数,也就成了类的字段。


    在SparkContext类的其他既不是函数定义,又不是字段的语句,如:
    initLogging()
    都编译到主构造器。


5. class SparkContext是extends了Logging。Logging定义在Logging.scal,是一个trait。
    trait,也就是特质。trait封装方法和字段。把trait混入到类中,就可以重用它们。一个类,可以混入任意多个特制。
    你可以近似将它视为Java的接口interface,特质,在行为上跟interface非常相似。唯一的差别在于,interface声明函数,但不实现它们,trait可以实现函数。
    trait跟class的差别在于,trait没有任何类参数,trait调用的方法是动态绑定的。


6. private[spark] val env 
    定义了一个私有的不可变量env,这里的[spark],是一种保护的作用域,这个意思是,env这个量在包spark是可见的,在包spark之外是不可见的。


7. import org.apache.spark.rdd._
    "_"的意识类似Java里的import java.io.*里的"*",引入所有。


8. @volatile
    @这种语法叫注解,跟Java一样。@volatile注解,通知编译器,被注解的变量将被多个线程使用。


9. implicit
    隐式操作。


10. SparkContext创建时候的master参数是为了创建taskSchedule。
10.1 如果master是"local",则创建LocalScheduler,它的源代码在此:
    ./src/main/scala/org/apache/spark/scheduler/local/LocalScheduler.scala
    LocalScheduler类继承了trait特质TaskScheduler。
10.2 如果master是"spark",则创建SparkDeploySchedulerBackend。在SparkDeploySchedulerBackend的start函数,会启动一个Client对象,连接到Spark集群。


10.3 textFile函数的运行
    textFile调用hadoopFile函数,返回一个RDD结构,然后把它做map,返回另外一个RDD结构。
    hadoopFile函数创建了HadoopRDD类。
    HadoopRDD类继承抽象类RDD。
    当HadoopRDD执行map的时候,返回的是MappedRDD,lazy运算。

© 著作权归作者所有

brian_2017
粉丝 3
博文 61
码字总数 145216
作品 0
私信 提问
大数据Spark:从入门到实战(理论和实战相结合,附送视频教程&项目源码)

本文是由菜鸟窝出品的12天大数据特训营课程摘录出来的,关于大数据spark的入门到实战视频可以戳此查看第三章:https://www.cniao5.com/course/10244 勾搭助教Bella的weixin(BT474849)还可以...

菜鸟窝
08/05
0
0
Spark2.1.0之剖析spark-shell

通过在spark-shell中执行word count的过程,让读者了解到可以使用spark-shell提交Spark作业。现在读者应该很想知道spark-shell究竟做了什么呢? 脚本分析 在Spark安装目录的bin文件夹下可以找...

beliefer
2018/04/20
0
0
SPARK 源码分析技术分享(带bilibili视频)

SPARK 源码分析技术分享 (带bilibili视频) 【本站点正在持续更新中…2018-12-05…】 SPARK 1.6.0-cdh5.15.0 Hadoop 2.6.0-cdh5.15.0 spark-scala-maven 微信(技术交流) : thinktothings SPA...

thinktothings
2018/12/02
0
0
扣丁学堂大数据培训Spark架构运行及优势详解

  今天扣丁学堂大数据培训给大家介绍一下关于大数据开发中Spark架构运行详解及其优势详解,首先spark是一种分布式的计算框架。类似于大数据开发中Hadoop生态圈的MapReduce,计算思想和MR非...

扣丁学堂
2018/08/14
0
0
大数据(Spark-核心原理及架构)

Spark RDD特性 RDD(Resilient Distributed Datasets),弹性分布式数据集,它是对分布式数据集的一种内存抽象,通过受限的共享内存方式来提供容错性,同时这种内存模型使得计算比传统的数据...

这很耳东先生
07/10
20
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
今天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
今天
27
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
今天
63
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
今天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
今天
59
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部