6.创建和启动DAGScheduler DAGScheduler主要用于在任务正式交给TaskSchedulerImpl提交之前做一些准备工作,包括:创建Job,将DAG中的RDD划分到不同的Stage,提交Stage,等等.创建DAGScheduler的代码如下: DAGScheduler的数据结构主要维护jobId和stageId的关系.Stage.ActiveJob.以及缓存的RDD的partitions的位置信息,见代码: DAGSchedulerEventProcessLoop能处理的…
2. 创建执行环境SparkEnv SparkEnv是Spark的执行环境对象,其中包括众多与Executor执行相关的对象.由于在local模式下Driver会创建Executor,local-cluster部署模式或者Standalone部署模式下Worker另起的CoarseGrainedExecutorBackend进程中也会创建Executor,所以SparkEnv存在于Driver或者CoarseGrainedExecutorBackend进程中.创建SparkEnv主要使用Spar…
3. 创建并初始化Spark UI 任何系统都需要提供监控功能,用浏览器能访问具有样式及布局并提供丰富监控数据的页面无疑是一种简单.高效的方式.SparkUI就是这样的服务. 在大型分布式系统中,采用事件监听机制是最常见的.为什么要使用事件监听机制?假如SparkUI采用Scala的函数调用方式,那么随着整个集群规模的增加,对函数的调用会越来越多,最终会受到Driver所在JVM的线程数量限制而影响监控数据的更新,甚至出现监控数据无法及时显示给用户的情况.由于函数调用多数情况下是同步调用,这就导…
5. 创建任务调度器TaskScheduler TaskScheduler也是SparkContext的重要组成部分,负责任务的提交,并且请求集群管理器对任务调度.TaskScheduler也可以看作任务调度的客户端.创建TaskScheduler的代码如下: createTaskScheduler方法会根据master的配置匹配部署模式,创建TaskSchedulerImpl,并生成不同的SchedulerBackend.为了使读者更容易理解Spark的初始化流程,故以local模式为例,ma…
8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结果等数据存入内存,这极大地提升了系统的执行效率.正是因为这一关键决策,才让Spark能在大数据应用中表现出优秀的计算能力.BlockManager是在sparkEnv中被创建的,代码如下: 8.1 存储体系概述 8.1.1 块管理器BlockManager的实现 块管理器BlockManager是S…
9. 启动测量系统MetricsSystem MetricsSystem使用codahale提供的第三方测量仓库Metrics.MetricsSystem中有三个概念: Instance:指定了谁在使用测量系统: Source:指定了从哪里收集测量数据: Sink:指定了从哪里输出测量数据: Spark按照Instance的不同,区分为Master.Worker.Application.Driver和Executor. Spark目前提供的Sink有ConsoleSink.CsvSink.Jmx…
1. SparkContext概述 注意:SparkContext的初始化剖析是基于Spark2.1.0版本的 Spark Driver用于提交用户应用程序,实际可以看作Spark的客户端.了解Spark Driver的初始化,有助于读者理解用户应用程序在客户端的处理过程. Spark Driver的初始化始终围绕着SparkContext的初始化.SparkContext可以算得上是所有Spark应用程序的发动机引擎,轿车要想跑起来,发动机首先要启动.SparkContext初始化完毕,才能向…
12. Spark环境更新 在SparkContext的初始化过程中,可能对其环境造成影响,所以需要更新环境,代码如下: SparkContext初始化过程中,如果设置了spark.jars属性,spark.jars指定的jar包将由addJar方法加入httpFileServer的jarDir变量指定的路径下.spark.files指定的文件将由addFile方法加入httpFileServer的fileDir变量指定的路径下.见代码: postEnvironmentUpdate的实现见代码,…
7. TaskScheduler的启动 第五节介绍了TaskScheduler的创建,要想TaskScheduler发挥作用,必须要启动它,代码: TaskScheduler在启动的时候,实际调用了backend的start方法,即同时启动了backend.local模式下,这里的backend是localSchedulerBackend.在TaskScheduler初始化时传入localSchedulerBackend.以LocalSchedulerBackend为例,启动LocalSched…
4. Hadoop相关配置及Executor环境变量的设置 4.1 Hadoop相关配置信息 默认情况下,Spark使用HDFS作为分布式文件系统,所以需要获取Hadoop相关配置信息的代码如下: 获取的配置信息包括: 将Amazon S3文件系统的AccessKeyId和SecretAccessKey加载到Hadoop的Configuration: 将SparkConf中所有以spark.hadoop. 开头的属性都复制到Hadoop的Configuration: 将SparkConf的属性s…