SparkContext初始化过程

来源:互联网 发布:防止sql注入用什么工具 编辑:程序博客网 时间:2024/05/19 10:07

概要

SparkContext是程序执行的入口,一个SparkContext代表一个应用,深入理解spark运行时机制,首先要了解SparkContext初始化过程。

SparkContext初始化

SparkContext的定义


构造参数为SparkConf,其存储spark相关的配置信息,查看SparkConf定义

SparkConf内部用ConcurrentHashMap存储各种配置信息,初始化时会加载所有以spark.开头的环境变量。

SparkContext初始化

查看初始化对应代码

clone SparkConf变量,接着判断spark.master和spark.app.name是否存在,如果是YARN cluster模式则必须设置spark.yarn.app.id,然后是driver的host,port信息,最后是jars和files,接着查看

_eventLogDir是否记录运行时信息,由spark.eventLog.enabledspark.eventLog.dir控制,以及是否压缩该信息_eventLogCodec,spark.externalBlockStore.folderName设置运行时本地存储的目录名,为“spark-” + randomUUID.toString(),如果为yarn-client模式,设置SPARK_YARN_MODE=true,使用JobProgressListener跟踪运行时信息,用于UI展示,最后创建SparkEnv对象,创建SparkEnv的过程涉及到非常多spark-core中的核心类。

  • 查看createSparkEnv
    这里写图片描述
  • 继续查看SparkEnv.createDriverEnv

    获取host和port信息,调用create方法。
  • 继续查看create方法

    创建安全相关的SecurityManager,通过spark.authenticate配置

    创建基于akka的分布式消息系统,中间的创建过程略多,这里不再描述,最后看看SparkEnv初始化了哪些对象

    上图中列出的对象几乎涵盖了spark-core的核心类,后续会对其分别分析,至此,SparkEnv创建完毕。


接着上面SparkEnv.set(_env)(限于篇幅,关于UI方面的代码可能会被略掉),_metadataCleaner使用TimerTask定期清理persistentRdd,读取hadoop配置,将jar和file的路径添加到rpcEnv的fileServer,读取Executor相关变量,重要的参数为ExecutorMemory

接着,_heartbeatReceiver是默认基于netty实现的心跳机制,创建schedulerBackend用于提交任务,创建taskScheduler和dagScheduler,获取applicationId,启动度量系统,获取eventLogger

executorAllocationManager关于Executor动态资源分配,通过spark.dynamicAllocation.enabled设置,创建contextcleaner用于清理过期的RDD, shuffle和broadcast ,启动ListenerBus,并post环境信息和应用信息,最后添加确保context停止的hook,至此整个sparkcontext的初始化流程结束。

总结

通过对sparkcontext初始化过程的跟踪,主要涉及到的内容如下

  1. SparkConf读取配置和校验,log和UI相关的度量系统。
  2. 创建SparkEnv,涉及到众多重要对象,如rpcEnv, actorSystem, serializer, closureSerializer, cacheManager, mapOutputTracker, shuffleManager, broadcastManager, blockTransferService, blockManager, securityManager, sparkFilesDir, metricsSystem, memoryManager等。
  3. 心跳机制,taskScheduler和dagScheduler的创建。
1 0
原创粉丝点击