spark源码二:sparkContext初始化之spark的执行环境SparkConf

SparkEnv是Spark的执行环境对象,其中包括众多与Executor执行相关的对象。由于在local模式下Driver会创建Executor,local-cluster部署模式或者Standalone部署模式下Worker另起的CoarseGrainedExecutorBackend进程中也会创建Executor,所以SparkEnv存在于Driver或者CoarseGrainedExecutorBackend进程中。创建SparkEnv主要使用SparkEnv的createDriverEnv,SparkEnv.createDriverEnv方法有三个参数:conf、isLocal和llistenerBus。

首先在sparkcontext里创建SparkEnv 的入口

private var _env: SparkEnv = _
_env = createSparkEnv(_conf, isLocal, listenerBus)
    SparkEnv.set(_env)

createSparkEnv

val isLocal = (master == "local" || master.startsWith("local["))
private[spark] def createSparkEnv(
      conf: SparkConf,
      isLocal: Boolean,
      listenerBus: LiveListenerBus): SparkEnv = {
    SparkEnv.createDriverEnv(conf, isLocal, listenerBus)
  }

上面代码中的conf是对SparkConf的复制,isLocal标识是否是单机模式,listenerBus采用监听器模式维护各类事件的处理

createDriverEnv

 private[spark] def createDriverEnv(
      conf: SparkConf,
      isLocal: Boolean,
      listenerBus: LiveListenerBus,
      mockOutputCommitCoordinator: Option[OutputCommitCoordinator] = None): SparkEnv = {
    assert(conf.contains("spark.driver.host"), "spark.driver.host is not set on the driver!")
    assert(conf.contains("spark.driver.port"), "spark.driver.port is not set on the driver!")
    val hostname = conf.get("spark.driver.host")
    val port = conf.get("spark.driver.port").toInt
    create(
      conf,
      SparkContext.DRIVER_IDENTIFIER,
      hostname,
      port,
      isDriver = true,
      isLocal = isLocal,
      listenerBus = listenerBus,
      mockOutputCommitCoordinator = mockOutputCommitCoordinator
    )
  }

SparkEnv的方法createDriverEnv最终调用create创建SparkEnv。SparkEnv的构造步骤如下:
1)创建安全管理器SecurityManager;
2)创建基于Akka的分布式消息系统ActorSystem;
3)创建Map任务输出跟踪器mapOutputTracker;
4)实例化ShuffleManager;
5)创建ShuffleMemoryManager;
6)创建块传输服务BlockTransferService;
7)创建BlockManagerMaster;
8)创建块管理器BlockManager;
9)创建广播管理器BroadcastManager;
10)创建缓存管理器CacheManager;
11)创建HTTP文件服务器HttpFileServer;
12)创建测量系统MetricsSystem
13)创建SparkEnv。

第一步:安全管理器SecurityManager
SecurityManager主要对权限、账号进行设置,如果使用Hadoop YARN作为集群管理器,则需要使用证书生成secret key登录,最后给当前系统设置默认的口令认证实例,此实例采用匿名内部类实现

private val secretKey = generateSecretKey()
// 使用HTTP连接设置口令认证
if (authOn) {
//设置默认口令
    Authenticator.setDefault(
        new Authenticator() {
            override def getPasswordAuthentication(): PasswordAuthentication = {
                var passAuth: PasswordAuthentication = null
            val userInfo = getRequestingURL().getUserInfo()
            if (userInfo != null) {
                val  parts = userInfo.split(":", 2)
                passAuth = new PasswordAuthentication(parts(0), parts(1).toCharArray())
                }
                return passAuth
            }
        }
    )
}

generateSecretKey()

// 密钥用于在Hadoop UGI中存储spark秘密
  private val sparkSecretLookupKey = "sparkCookie"
//安全管理器是否开启了spark 通信协议
private val authOn = sparkConf.getBoolean(SecurityManager.SPARK_AUTH_CONF, false)
//检查是否启用了Spark通信协议的身份验证
//如果启用了身份验证,则返回true,否则为false
def isAuthenticationEnabled(): Boolean = authOn
private def generateSecretKey(): String = {
    //没开启通信协议 设置秘钥为null
    if (!isAuthenticationEnabled) return null
    //开启了通信协议,如果是yarn模式,秘钥从用户凭证(sparkCookie)获得
    val sCookie = if (SparkHadoopUtil.get.isYarnMode) {
      val secretKey = SparkHadoopUtil.get.getSecretKeyFromUserCredentials(sparkSecretLookupKey)
      if (secret
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第1关的任务是初始化SparkContextSparkContextSpark的核心组件之一,它是连接Spark集群和应用程序的桥梁。在初始化SparkContext时,需要指定一些参数,如应用程序名称、master节点地址等。通过初始化SparkContext,我们可以创建RDD、DataFrame等Spark数据结构,进行数据处理和分析。 ### 回答2: SparkContext初始化Spark框架用于启动应用程序的关键步骤之一。SparkContext(SPC)是一个对象,用于协调Spark应用程序并与集群进行交互。在创建SparkContext之前,需要先创建一个Spark配置,该配置包含了与集群通信所需的信息。 SparkContext初始化主要包含以下步骤: 1. 创建Spark配置:通过SparkConf对象创建Spark配置。SparkConf对象包含了Spark应用程序的配置信息,例如Executor数量、内存大小、日志配置和应用程序名称等。 2. 创建SparkContext对象:在创建SparkContext对象之前,需要先创建一个SparkConf对象,该对象将作为参数传递给SparkContext构造函数。在SparkContext创建期间,它将使用SparkConf来配置集群中的执行器。SparkContext对象是整个Spark应用程序的核心对象,它是连接驱动程序与各个执行器之间的纽带。 3. 初始化Spark插件:Spark插件是一组可选组件,用于操纵Spark核心代码的执行过程。例如,在调优Spark应用程序时,我们可以使用Spark插件提供的信息以及访问执行计划和RDD的信息。Spark插件的创建及初始化初始化SparkContext时会完成。 4. 初始化元数据:在开始执行任何Spark代码之前,需要对数据源进行元数据扫描。例如,如果我们使用Hive作为数据源,则需要对Hive元数据进行扫描以查找可用的表和列。Spark元数据初始化过程在初始化SparkContext时进行。 在进行SparkContext初始化后,我们可以使用SparkContext对象访问各种Spark功能,例如Spark SQL、Spark Streaming和MLlib等。SparkContext对于驱动程序而言是一个中央位置,它控制着整个应用程序的进程和资源。SparkContext的创建可能会花费一些时间,但这是一个必要的步骤,因为SparkContext初始化过程中会启动与集群的通信。因此,在Spark应用程序中选择适当的配置和优化SparkContext对象的创建非常重要。 ### 回答3: SparkContextSpark安装包中最重要的类,也是驱动程序与集群通信的入口。在Spark应用程序中,首先要创建一个SparkContext对象,才能进行后续的操作。 SparkContext对象的初始化通常包括以下几个步骤: 1.导入所需的Spark库 首先需要在代码的开头导入所需的Spark库,以便能够使用SparkContext类。一般来说,需要导入pyspark库或者Scala中的Spark库。 2.创建SparkConf对象 SparkConf是一个设置Spark应用程序参数的容器。在创建SparkContext对象时,需要先创建一个SparkConf对象,用来设置一些参数,如应用程序名称、Master URL、序列化类等。 3.创建SparkContext对象 在创建SparkContext对象时,需要指定上述设置好的SparkConf对象参数。同时,需要指定应用程序名字、Master URL等参数。创建SparkContext对象会向集群申请资源,并将应用程序打包并发送到集群中。 4.使用SparkContext对象进行操作 初始化完成后,可以使用SparkContext对象进行后续的操作,包括读取数据、进行数据处理等。 总之,SparkContext对象的初始化Spark应用程序的第一步,它是整个Spark应用的核心。只有在正确理解和使用SparkContext对象的前提下,才能开发出高效、稳定、可扩展的Spark应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值