SparkContext解析

1、SparkContext概述

Spark的程序编写是基于SparkContext的,体现在2方面:①Spark编程的核心基础(RDD),第一个RDD是由SparkContext创建的;②Spark程序的调度优化也是基于SparkContext,RDD在一开始不会立即运行,会交给框架,主要是SparkContext。

Spark程序的注册是在SparkContext实例化时候生成的对象来完成的,也就是SchedulerBackend。

Spark程序运行的时候通过Cluster Manager获得具体的计算资源,也是通过SparkContext产生的对象SchedulerBackend来获取的。

SparkContext崩溃或者结束的时候整个Spark程序也结束了。

 

2、SparkContext中的三大核心对象

SparkContext创建的时候有4大核心:DAGScheduler,TaskScheduler,SchedulerBackend和MapOutputTrackerMaster。

DAGScheduler:面向Job的Stage的高层调度器;

TaskScheduler:是一个接口,根据具体的Cluster Manager的不同会有不同的实现;

SchedulerBackend:是一个接口根据具体的Cluster Manager的不同会有不同的实现,有三大核心功能:①负责与Master连接注册当前程序,②接收集群中为当前应用程序而分配的计算资源Executor的注册,并管理Executor。③负责发送Task到具体的Executor执行;

MapOutputTrackerMaster:负责Shuffle中数据输出和读取的管理。

3、 SparkContext源码

(1)SparkContext的默认构造器必须传入Sparkconf

(2)在SparkContext实例化的时候,默认构造器中所有不在方法中的内容都会被实例化,很多成员都会被赋值,其中有一个关键的代码createTaskScheduler,他调用的时候返回了SchedulerBackend和TaskScheduler具体的实例,然后基又构建了DAGScheduler。

(3)进入createTaskScheduler方法中,他这里面根据不同的模式local模式或者其他模式进行不同的处理。默认情况下local模式task失败不重试,其他模式下失败可以重试。

以Standlone模式进行解读,源码如下,根据传进的url,首先创建TaskSchedulerImpl(底层调度器的核心和灵魂),创建TaskSchedulerImpl的时候必须创建一个Schedulerbackend,在TaskSchedulerImpl.initialize的时候将Schedulerbackend他作为一个参数传入。StandaloneSchedulerBackend是被TaskSchedulerImpl来管理的。

然后进入到TaskSchedulerImpl的initialize方法中,这个主要是确定任务具体的调度方式,这里有两种方式FIFO(默认方式,先进先出的方式)和FAIR。在TaskSchedulerImpl实例调用initialize时首先构建一个调度池SchedulerPool。

(4)createTaskScheduler执行完后返回的TaskScheduler实例为TaskSchedulerImpl,Scheduler的实例为StandaloneSchedulerBackend。代码继续往下走执行_taskScheduler.start(),因为taskScheduler返回的实例是TaskSchedulerImpl,所以调用TaskSchedulerImpl的start方法。

start方法里面调用的是它管理的StandaloneSchedulerBackend的start方法。

(5)在StandaloneSchedulerBackend的start方法中有个Commond比较关键,我们的StandaloneSchedulerBackend向我们的集群进行注册的时候,会把commond传递给master,master会到worker让worker去启动具体进程资源的时候,具体进程的主类的名字,就叫CoarseGrainedExecutorBackend。

(6)CoarseGrainedExecutorBackend是有main方法的入口类,这个就是我们的executor所在进程的入口,我们修改指令就可以修改框架,用自己实现的ExecutorBackend。

在他的main方法中执行run方法的时候

在run方法中new出了CoarseGrainedExecutorBackend这个类的实例

注意:在启动CoarseGrainedExecutorBackend之后就会启动executor,executor启动之后转过来向driver注册,这个话是的。要先注册成功才会分配executor

(7)回到StandaloneSchedulerBackend中,从commond往下走,start的时候new了一个StandaloneAppClient。

进入到StandaloneAppClient这个类中,参数有RpcEnv,mater数组,应用程序的description,还有一个监听器,集群发送事件的时候会被回调

在里面有个重要的内部类ClientEndpoint,在start方法中new出它

在ClientEndpoint启动的时候会有registerWithMaster。这时候开始注册,在注册的时候变成tryRegisterAllMasters,AllMasters是因为有的时候会有多个master,实际上生产环境一定有多个master,做HA。

我们创建一个线程池,在tryRegisterAllMasters注册的时候,从registerMasterThreadPool拿一个线程去注册

在tryRegisterAllMasters是注册给master,所以这里有master的引用,然后就send一个消息过去。这边会发送一个RegisterApplication,他是case class,里面描述了我们应用程序的相关信息,包括名称,使用最大cpu个数,还有每个executor使用的memory的内容等,这里的command就是刚才的command,还有appUiUrl是web上面显示的url

(8)转过来就是交给我们的master去注册,master在收到RegisterApplication的消息之后,通过给worker发送指令启动executor,其实是executorbackend进程去启动executor的。这些所有的executor都要向SchedulerBackend去注册。

4、流程图

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1630. 等差子数组

文章目录1. 题目2. 解题1. 题目 如果一个数列由至少两个元素组成,且每两个连续元素之间的差值都相同,那么这个序列就是 等差数列 。更正式地,数列 s 是等差数列,只需要满足:对于每个有效的 i , s[i1] - s[…

LeetCode 1631. 最小体力消耗路径(DFS + 二分查找)

文章目录1. 题目2. 解题1. 题目 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。 一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) &…

Spark资源调度分配

1、任务调度与资源调度 任务调度:是指通过DAGScheduler,TaskScheduler,SchedulerBackend等进行的作业调度。 资源调度:是指应用程序获取资源。 任务调度是在资源调度的基础上,没有资源调度,那么任务调度…

两个栈实现队列与两个队列实现栈

1. 两个栈实现队列 实现一 思路 s1是入栈的,s2是出栈的。 入队列,直接压到s1是就行了出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中 实现二 思路 s1是入栈的&#xff0c…

ACwing 5. 多重背包问题 II(二进制拆分+DP)

文章目录1. 题目2. 解题1. 题目 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 输入格式…

排序:冒泡排序与选择排序

冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该…

Spark Master的注册机制与状态管理

目录 1、Master接收注册的主要对象 2、Master接收Worker的注册 3、Master接收Driver的注册 4、Master处理Driver状态变化 5、Master接收Application的注册 6、Master处理Executor状态变化 1、Master接收注册的主要对象 Master主要接受注册的对象是:Applicatio…

排序:插入排序与希尔排序

插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从…

jieba分词提取小说人名

文章目录1. 读入文本2. 分词3. 计数4. 排序5. 添加用户字典以《神雕侠侣》为例: 使用 jieba.posseg获取词性,人名的词性为 nr 1. 读入文本 import jieba.posseg as psg with open(shendiaoxialv.txt,encodingutf-8) as f:text f.readlines()print(te…

Spark Worker源码

目录 1、概述 2、LaunchDriver 3、LaunchDriver 4、总结 1、概述 worker肯定是实现RPC通信的,否则别人没法给你发消息。他继承的是ThreadSafeRpcEndpoint,ThreadSafeRpcEndpoint是线程安全的,意味着处理一条消息完成后再处理下一个消息。换…

排序:快速排序与归并排序

快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都…

LeetCode 764. 最大加号标志(DP)

文章目录1. 题目2. 解题1. 题目 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1。网格中包含 1 的最大的轴对齐加号标志是多少阶?返回加号标志的阶数。如果未找到加号标志&#xff…

机器学习基础—Kaggle泰坦尼克预测(完整分析)

1.引言 我们先找个简单的实际例子,来看看,所谓的数据挖掘或者机器学习实际应用到底是怎么样一个过程。 2.背景 2.1 关于Kaggle Kaggle是一个数据分析建模的应用竞赛平台,有点类似KDD-CUP(国际知识发现和数据挖掘竞赛)&…

Spark Executor解析

目录 1、Spark Executor如何工作 2、Spark Executor工作源码 1、Spark Executor如何工作 当Driver发送过来Task的时候,其实是发送给CoarseGrainedExecutorBackend这个RPCEndpoint,而不是直接发送给Executor(Executor由于不是消息循环体永远…

LeetCode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复(vector + 哈希)

文章目录1. 题目2. 解题1. 题目 设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构。 注意: 允许出现重复元素。 insert(val):向集合中插入元素 val。remove(val):当 val 存在时,从集合中移除一个 val。getRando…

Stage划分和Task最佳位置

目录 1、Job Stage划分 2、Task最佳位置 3、总结 3.1 Stage划分总结: 3.2 Task最佳位置总结: 1、Job Stage划分 Spark Application中因为不同的Action触发众多的Job,也就是说一个Application中可以有很多的Job,每个Job是由是…

LeetCode 1636. 按照频率将数组升序排序(哈希+排序)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。 如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。 请你返回排序后的数组。 示例 1: 输入:nums [1,1,2,2,2,3] 输出…

TaskScheduler相关

目录 1、DAGScheduler与TaskScheduler 2、TaskScheduler与SchedulerBackend 3、任务调度过程总结 1、DAGScheduler与TaskScheduler DAGScheduler面向我们整个Job划分出了Stage,划分了Stage是从后往前划分的,执行的时候是从前往后,每个Stag…

LeetCode 1637. 两点之间不包含任何点的最宽垂直面积

文章目录1. 题目2. 解题1. 题目 给你 n 个二维平面上的点 points ,其中 points[i] [xi, yi] ,请你返回两点之间内部不包含任何点的 最宽垂直面积 的宽度。 垂直面积 的定义是固定宽度,而 y 轴上无限延伸的一块区域(也就是高度为…

Task执行流程

1、源码走读 (1)当Driver中的SchedulerBackend(Standalone模式为CoarseGrainedSchedulerBackend)给ExecutorBackend(Standalone模式为CoarseGrainedExecutorBackend)发送LaunchTask之后,Coarse…