spark核心原理之SparkContext原理(1)

Spark是最为流行的分布式计算框架,这篇文章简要介绍spark 1.X版本任务调度的基本部件及其原理,包括SparkContext,SparkEnv,Executor,TaskScheduler,DAGScheduler以及其他部件。本文参考自《深入理解Spark》(by耿嘉安)一书。

1  SparkContext

SparkDriver用于用户提交任务,SparkDriver初始化首先需要SparkContext初始化,SparkContext配置了整个任务需要的上下文信息,其中配置参数由SparkConf初始化,SparkConf维护了一个ConcurrentHashMap记录系统配置和用户配置。

SparkContext初始化过程主要包括:

1)创建Spark执行环境SparkEnv;

2)创建RDD清理器metadataCleaner;

3)创建并初始化Spark UI;

4)Hadoop相关配置及Executor环境变量的设置;

5)创建任务调度TaskScheduler;

6)创建和启动DAGScheduler;

7)TaskScheduler的启动;

8)初始化块管理器BlockManager

9)启动测量系统MetricsSystem;

10)创建和启动Executor分配管理器ExecutorAllocationManager;

11)ContextCleaner的创建与启动;

12)Spark环境更新;

13)创建DAGSchedulerSource和BlockManagerSource;

14)将SparkContext标记为激活。

SparkContext默认只有一个实例,用户可以自定义配置。

2 SparkEnv

SparkEnv用于保存Spark任务的执行环境,SparkEnv存在于Driver或者CoarseGrainedExecutorBackend进程中。此进程用于创建Executor。创建SparkEnv主要使用SparkEnv的createDriverEnv。其主要过程包括如下:

1)创建安全管理器SecurityManager;

SecurityManager主要对权限、账号进行设置,如果使用Hadoop YARN作为集群管理器,则需要使用证书生成secret key登录,最后给当前系统设置默认的口令认证实例,使用HTTP连接设置口令认证。

2)创建基于Akka的分布式消息系统ActorSystem;

ActorSystem是Akka的创建分布式消息系统的基础类,akka在spark2.0中被替换为netty。

actor是一个封装了状态和行为的对象,每个actor都通过message交流,从自己的mailbox中读取别的actor发送的消息。Actor system 可以看做多个actors 的协作整体。actors可以通过这个整体单元来共享一些通用组件。例如调度服务、配置、日志服务等等。配置不同的Actor system可以共存在同一个jvm中。ActorSystem是重量级的对象,会创建1...N个线程,所以一个application一个ActorSystem。

3)创建Map任务输出跟踪器mapOutputTracker;

mapOutputTracker用于记录Map阶段任务的输出状态,每一个map任务或reduce任务都用mapid或reduceid唯一标识,通过mapOutputTracker可以让reduce阶段的任务找到并拉取map阶段任务输出数据。MapOutputTrackerMaster通过mapStatuses维护记录map任务输出状态,其中Executor会通过akka机制向MapOutputTracker中的MasterActor发送消息维护更新map任务信息。所以Executor初始化MapOutputTrackerWorker,而Driver创建MapOutputTrackerMaster。

4)实例化ShuffleManager;

ShuffleManager通过反射生成的SortShuffleManager实例,管理本地或远程shuffer。spark.shuffle.manager属性可修改为使用HashShuffleManager。SortShuffleManager通过内聚IndexShuffleBlockManager调用BlockManager中的DiskBlockManager将map结果根据shuffleId、mapId写文件,对应map过程也可调用MapOutputTrackerMaster的mapStatuses从本地或者远程节点读取文件,对应包含shuffer的reduce过程。

5)创建ShuffleMemoryManager;

ShuffleMemoryManager通过维护thread-Memory这一hashMap来记录所有shuffer任务的占用内存字节数,shuffer所有线程的最大内存占用计算公式如下:Java运行时最大内存*Spark的shuffle最大内存占比*Spark的安全内存占比。

6)创建块传输服务BlockTransferService,默认为NettyBlockTransferService,用于文件块在节点之间的远程传输。

7)创建BlockManagerMaster;

负责管理Block相关操作,Driver端创建BlockManagerMasterActor,注册到Actor-System中。Executor则从ActorSystem中获取BlockManagerMasterActor。最终BlockManagerMaster获取到对BlockManagerMasterActor的引用,从而进行相关操作。

8)创建块管理器BlockManager,负责对Block进行管理。具体细节在存储系统中详细介绍。

9)创建广播管理器BroadcastManager;

此部件主要用于将配置信息和序列化后的RDD,job等信息本地存储,或广播到其他节点进行备份,是通过工厂模式,用反射的方式创建实例,用户可以可以配置属性spark.broadcast.factory指定。

10)创建缓存管理器CacheManager;

用于缓存RDD计算的中间结果,为了迭代计算的效率,spark将中间结果RDDcache下来,下一次就无需重新创建RDD。

11)创建HTTP文件服务器HttpFileServer,主要提供对jar及其他文件的http访问,服务器用jetty内嵌实现。

12)创建测量系统MetricsSystem;

至此。sparkEnv初始完毕。

时间: 2024-10-29 19:12:04

spark核心原理之SparkContext原理(1)的相关文章

Spark(一): 基本架构及原理

Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架,最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一,与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势: Spark提供了一个全面.统一的框架用于管理各种有着不同性质(文本数据.图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求 官方资料介绍Spark可以将Hadoop集群中的应用在内存中的运行速度提升100倍

【原创】大数据基础之Spark(4)RDD原理及代码解析

一 简介 spark核心是RDD,官方文档地址:https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds官方描述如下:重点是可容错,可并行处理 Spark revolves around the concept of a resilient distributed dataset (RDD), which is a fault-tolerant colle

数据类型核心操作步骤和原理

数据类型核心操作步骤和原理 JS中的数据类型 基本数据类型(值类型) number string boolean null undefined 引用数据类型 对象 {}普通对象 []数组 /^$/正则 Math 对象数据类型的 ... 函数 function 普通函数 类 ... JS代码运行在浏览器中,是因为浏览器给我们提供了一个供js代码执行的环境 -> 全局作用域(window/global) var a=12; var b=a; b=13; console.log(a); var o={

Spark核心作业调度和任务调度之DAGScheduler源码

前言:本文是我学习Spark 源码与内部原理用,同时也希望能给新手一些帮助,入道不深,如有遗漏或错误的,请在原文评论或者发送至我的邮箱 [email protected] 摘要: 1.作业调度核心--DAGScheduler 2.DAGScheduler类说明 2.1DAGScheduler 2.2ActiveJob 2.3Stage 2.4Task 3.工作流程 3.1划分Stage 3.2生成Job,提交Stage 3.3任务集的提交 3.4任务作业完成状态的监控 3.5任务结果的获取 内容

Spark核心—RDD初探

本文目的 ? 最近在使用Spark进行数据清理的相关工作,初次使用Spark时,遇到了一些挑(da)战(ken).感觉需要记录点什么,才对得起自己.下面的内容主要是关于Spark核心-RDD的相关的使用经验和原理介绍,作为个人备忘,也希望对读者有用. ? 为什么选择Spark ? 原因如下 代码复用:使用Scala高级语言操作Spark,灵活方便,面向对象,函数编程的语言特性可以全部拿来.Scala基本上可以无缝集成java及其相关库.最重要的是,可以封装组件,沉淀工作,提高工作效率.之前用hi

bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理

bootloader功能介绍 初始化开发板上主要硬件(时钟,内存,硬盘), 把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统. boot阶段 1.关闭影响CPU正常执行的外设 -关闭看门狗(watch dog)   WTCON 0xE2700000 -关闭中断 CPSR I和F位设置为1,关闭,不响应任何中断. 2.初始化时钟 -倍频到1Ghz,为外设分频 *串口驱动 3.初始化内存控制器,DDRAM -验证内存,往里面写一个值,然后再读出来 4.初始化硬盘,nand Flash

spark源码解读-SparkContext初始化过程

sparkcontext是spark应用程序的入口,每个spark应用都会创建sparkcontext,用于连接spark集群来执行计算任务.在sparkcontext初始化过程中会创建SparkEnv,SparkUI,TaskSchedule,DAGSchedule等多个核心类,我们会逐个分析他们. 下面我们看一下sparkcontext的初始化过程,首先判断一些参数, try { _conf = config.clone() _conf.validateSettings() if (!_co

(1)spark核心RDD的概念解析、创建、以及相关操作

spark核心之RDD 什么是RDD RDD指的是弹性分布式数据集(Resilient Distributed Dataset),它是spark计算的核心.尽管后面我们会使用DataFrame.Dataset进行编程,但是它们的底层依旧是依赖于RDD的.我们来解释一下RDD(Resilient Distributed Dataset)的这几个单词含义. 弹性:在计算上具有容错性,spark是一个计算框架,如果某一个节点挂了,可以自动进行计算之间血缘关系的跟踪 分布式:很好理解,hdfs上数据是跨

(3)spark核心概念以及运行架构

spark核心概念 我们之前介绍了spark的核心RDD,它是spark操作的基本单元.但是对于spark集群来说你还需要它的其它概念,比如我们操作RDD的时候,资源由谁来管理.任务由谁来执行等等. application:就是我们基于spark开发的应用程序,比如我们写的py文件,一个py文件就可以看成是一个基于spark的应用程序,它是由一个driver进程和多个executor组成.driver和executor是什么先不用管,总之记住一个基于spark的应用程序=1个driver+多个e