Spark Executor解析_Quinto0的博客-程序员宅基地_spark executor

技术标签: spark内核  Executor  spark  大数据  

目录

 

1、Spark Executor如何工作

2、Spark Executor工作源码


1、Spark Executor如何工作

当Driver发送过来Task的时候,其实是发送给CoarseGrainedExecutorBackend这个RPCEndpoint,而不是直接发送给Executor(Executor由于不是消息循环体永远也无法接收远程发过来的信息)。

Driver向ExecutorBackend发送LaunchTask,这里实际上是把内容交给线程池中的线程去执行。首先判断Executor是否为空,反序列化TaskDescription,然后调用Executor.launchTask ,launchTask 里面是将Task封装在TaskRunner(是一个runnable对象)里面然后交给线程池中的线程处理。在TaskRunner的run方法里面会导致runTask的执行。

2、Spark Executor工作源码

(1)Worker接收到Master发送过来启动Executor的指令,通过ExecutorRunner启动另外一个进程来运行Executor。在这个基础上会启动一个CoarseGrainedExecutorBackend(粗粒度),ExecutorBackend启动的时候这个时候要向Driver注册,通过RegisterExecutor。Driver(CoarseGrainedSchedulerBackend的内部成员DriverEndpoint接收注册)在接收到RegisterExecutor信息后会返回一个信息RegisteredExecutor给CoarseGrainedExecutorBackend。

CoarseGrainedExecutorBackend:是Executor运行所在的进程的名称,他本身不会完成具体任务的计算,这个进程里面有个Executor对象和CoarseGrainedExecutorBackend是一一对应的。

Executor:完成具体的计算,真正处理Task的对象,内部通过线程池的方式完成Task的计算。

(2)Driver的CoarseGrainedSchedulerBackend内部的成员DriverEndpoint收到RegisterExecutor后,首先判断ExecutorDataMap中是否有这个ExecutorId。ExecutorDataMap是个内存数据结构(他是CoarseGrainedSchedulerBackend的成员,所以最终是注册给CoarseGrainedSchedulerBackend),他是一个HashMap。

如果ExecutorDataMap中不存在,就进行注册,注册的时候先看看address存在不存在,如果存在直接获取,如果不存在就获取senderAddress。这从实现的角度看adress就是senderAddress。然后相关数据结构添加数据

CoarseGrainedSchedulerBackend.this.synchronized这里加上synchronized是因为集群中有很多ExecutorBackend向Driver注册,担心注册的时候写冲突,所以加上一个同步代码块

最后把消息发还给CoarseGrainedExecutorBackend

(3)CoarseGrainedExecutorBackend收到RegisterExecutor后就new了一个Executor这个Executor对象是事实上负责Task计算的

(4)在Executor默认构造器中有一个非常关键的内容,有个成员threadPool(线程池)

创建线程池,线程池里面要有线程,线程怎么产生的呢?不会平白无故的产生,所以就搞了一个线程工厂,就是按照某种你需要的格式去产生线程,背后还是new出一个线程

setDamon(True)设置每个线程是后台运行的方式

(5)线程池也准备好后就是等待Driver端发任务过来,是发给CoarseGrainedExecutorBackend不是Executor,因为Executor不可能接收到消息的他本身就不是一个消息循环体。CoarseGrainedExecutorBackend收到LaunchTask后,这里实际上是把内容交给线程池中的线程去执行。判断Executor是否为空,反序列化TaskDescription,然后调用Executor.launchTask

(6)launchTask 里面是将Task封装在TaskRunner(是一个runnable对象)里面然后交给线程池中的线程处理。并把这个任务加入ConcurrentHashMap类型的名称为runningTasks的数据结构中管理。

(7)在TaskRunner的run方法里面会导致runTask的执行

补充:为什么要在worker接收到master发送过来的指令后为什么要启动另外一个进程,也就是说为什么开辟另外一个进程,在另外一个进程中注册给Driver,然后启动Executor。必须启动另外一个进程的原因:①Worker本身是管理当前机器上的资源的,当前机器上的资源变动的时候要汇报给Master,Worker不是用来做计算的不能在Worker里面计算;②Spark集群中可能有很多应用程序就可能有很多的Executor,如果不是为每个Executor启动一个进程而是所有Executor在Worker里面,那么一个程序奔溃了会导致其他程序奔溃。

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43786255/article/details/105337242

智能推荐

Kafka监控工具汇总_weixin_30416497的博客-程序员宅基地

对于大数据集群来说,监控功能是非常必要的,通过日志判断故障低效,我们需要完整的指标来帮我们管理Kafka集群。本文讨论Kafka的监控以及一些常用的第三方监控工具。一、Kafka Monitoring首先介绍kafka的监控原理,第三方工具也是通过这些来进行监控的,我们也可以自己去是实现监控,官网关于监控的文档地址如下:http://kafka.apache.org/docume...

lvs实现mysql主从切换_Lvs+keepalived+mysql主从热备_weixin_39649736的博客-程序员宅基地

Lvs+keepalived+mysql主从热备实验拓扑图:一、安装LVS+keepalived(Master+Backup都需安装)需要软件ipvsadm-1.26.tar.gzkeepalived-1.2.13.tar.gz裸机需要安装如下插件popt-static-1.13-7.el6.x86_64.rpmyum -y installlibnl* popt* kernel* openssl*...

php将数组赋值给变量赋值,数组赋值 PHP list 将数组中的值赋给变量的简单实例..._吴多益的博客-程序员宅基地

list()PHP list() 用一步操作把数组中的值赋给一些变量。同 array() 一样,list() 不是真正的函数,而是语言结构。语法:void list( mixed var, mixed ... )注意: list() 仅能用于数字索引的数组并假定数字索引从 0 开始。例子1:例子2,数据表查询:$result = mysql_query("SELECT id, username, ...

使用C++对小文本文件进行整体读写的两个函数_郝伟博士的博客-程序员宅基地_c++ readall

#include <iostream>#include <fstream>#include <string>#include <chrono>#include <thread>using namespace std;using namespace std::chrono;static void writeAllText(const string &content, const string &filename)

java判断一个字符串是否为数字型(整数、小数、负数)_伏加特遇上西柚的博客-程序员宅基地_java 判断字符串是否为数字

1、采用正则表达式的方式来判断一个字符串是否为数字,这种方式判断面比较全面,可以判断正负、整数小数 String str1="12354哈哈"; String str2="12354"; String str3="12354.6"; String str4="-12354.6"; Boolean strResult1 = str1.matches("-?[0-9]+.?[0-9]*"); //false Boolean strResult2 = str2.matches("-?[0-9

vue input file onchange_vue常用指令汇总_weixin_39713805的博客-程序员宅基地

在我们对比vue与react的时候,会发现一个很明显的特点,react的写法很自由,用js来搞定一切,而vue的模版语法提供了一套相对固定的模式来书写页面,vue的优势在于这些特性帮助我们简化了代码,但同时带来的问题是需要去记住这些vue的语法,这篇文章主要提供是vue常用指令汇总,方便以后查找。1. v-bind 功能:绑定变量,可缩写成:<div :id="text">...

随便推点

「Git问题」 cannot lock ref 'refs/remotes/origin/XXX'_阿航_的博客-程序员宅基地

周末放假回来, 发现idea所有文件都变红了! 之后git pull之后出现了如下问题:cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken之后照着网上的各种方法试了一遍, 又出现了新的问题:ambiguous ...

navicat premium 链接postgresql 无法加载表_PostgreSQL “千万” 不能做 五大 foolish 操作..._weixin_39592789的博客-程序员宅基地

工作时间长了,可能就会总结出来一些东西,千万不能做,做了会让你后悔莫及。先说一些我们的前提1 拥有数据库的所有权限2 不能通过故意的方式来毁掉一个数据库 例如 rm -rf那我们就开始列一列那些操作会让你追悔莫及1 删除pg_class对系统表不敬,大部分数据库都有自己的系统表,而这些表中存储着非常重要的信息,postgresql 中的 pg_catalog 中的pg_class 算是一...

1000php是,1000php/wooyun-2015-0144444.html at master · Xyntax/1000php · GitHub_一尾金叶渡世人的博客-程序员宅基地

var _LANGJS = {"COMMENT_LIKE_SELF":"\u4e0d\u80fd\u81ea\u5df1\u8d5e\u81ea\u5df1\u7684\u8bc4\u8bba","COMMENT_LIKED":"\u5df2\u8d5e\u6b64\u8bc4\u8bba","COMMENT_NOT":"\u6b64\u8bc4\u8bba\u4e0d\u5b58\u5728",...

VTK8.2.0+ITK4.13.2+VS2015配置_熬一条味道鲜美的鱼的博客-程序员宅基地

VTK8.2.0+ITK5.0.1+VS2015配置VTK8.2.0+ITK5.0.1 Cmake下载VTK8.2.0编译VTK8.2.0+ITK5.0.1 Cmake下载vtk及itk作为每个入医学图像处理坑的小伙伴们而言,我认为是非常需要掌握的两个比较好的工具。废话不多说了,开始!首先我们可以去vtk(https://vtk.org/)及itk(https://itk.org/)官网进行...

COVIDClassification_FlyAI第三名参赛方案_点PY的博客-程序员宅基地

COVIDClassification_FlyAI文章目录COVIDClassification_FlyAI1 数据增强1.1 基于albumentations的数据增强:1.2 数据增强之FMIX:2 模型结构与设计3 超参数设置4 模型集成与TTA4.1 模型集成4.2 TTA答辩视频1 数据增强1.1 基于albumentations的数据增强:这个数据增强库在各大机器学习平台上极受欢迎,其增强效率、方法之多远甚于其他数据增强库。 主要采用了以下数据增强方法: (1)重新调整图像大

云计算、大数据和 AI_Python大视觉的博客-程序员宅基地_云计算和ai

<div class="rich_media_content"> <p style="white-...

推荐文章

热门文章

相关标签