一、内核概述

内核:核心组件的运行机制、任务调度、内存管理、运行原理

1、核心组件

(1)Driver驱动器节点:执行main方法,将程序转化为作业job,在executor中调度任务task,跟踪并执行任务运行情况

(2)Executor:运行具体任务task,使用块管理器对RDD提供内存式存储

2、运行流程

提交任务、启动Driver进程、注册程序、分配Executor、执行main函数、懒执行到action算子时按照宽依赖对stage进行划分

一个stage对应一个taskset,将task分发到指定的Executor执行

二、Spark部署模式

三种集群管理器(Cluster Manager):Standalone(独立)、Mesos(分布式资源管理框架)、Yarn(统一的资源管理方式)

取决于传递给 SparkContext 的 MASTER 环境变量的值

–master MASTER_URL :决定了 Spark 任务提交给哪种集群处理(local本地运行、spark://HOST:PORT、mesos://HOST:PORT、yarn-client)

–deploy-mode DEPLOY_MODE:决定了 Driver 的运行方式,可选值为 Client 或者 Cluster。

1、Standalone模式运行机制

组成:Driver、Master(RM)、Work(NM)【存储RDD+启动Executor,执行计算】、Executor

Standalone Clint模式:Driver 在任务提交的本地机器上运行

Standalone Cluster模式:Master 会找到一个 Worker 启动 Driver

2、Yarn模式运行机制

Clint模式:Driver在任务提交的本地机器上运行,向ResourceManager申请资源,通知NodeManager分配Executor

Cluster模式:任务提交后会和ResourceManager通讯申请启动ApplicationMaster,RM分配容器,ApplicationMaster就是Driver

三、Spark通讯架构

1、概述

spark 基于netty的rpc框架基于Actor模型

独立实体之间通过消息来进行通信

Endpoint端点(Client/Master/Worker)有1个InBox和N个OutBox

(N>=1,N 取 决于当前 Endpoint 与多少其他的 Endpoint 进行通信,一个与其通讯的其他 Endpoint对应一个 OutBox)

Endpoint 接收到的消息被写入 InBox发送出去的消息写入 OutBox 并被发送到其他 Endpoint 的 InBox 中。

2、解析

通信框架高层视图

四、Spark任务调度机制

默认集群的部署方式为YARN-Cluster模式

1、任务提交流程

Driver线程(1)初始化SparkContext对象,准备运行所需的上下文,(2)保持与ApplicationMaster的RPC连接,通过ApplicationMaster申请资源,(3)根据用户业务逻辑开始调度任务,将任务下发到已有的空闲Executor上。

2、任务调度概述

Driver会根据用户程序逻辑准备任务,并根据Executor资源情况逐步分发任务

一个Spark应用程序包括Job、Stage以及Task三个概念

Job 是以 Action 方法为界,遇到一个 Action 方法则触发一个 Job

Stage 是 Job 的子集,以 RDD 宽依赖(即 Shuffle)为界

Task是Stage的子集,以并行度(分区数)来衡量,分区数是多少,则有多少个task。

Spark的任务调度分为Stage级的调度,以及Task级的调度

Spark RDD通过其Transactions操作,形成了RDD血缘关系图,即DAG

DAGScheduler负责Stage级的调度,TaskScheduler负责Task级的调度

调度过程中SchedulerBackend负责提供可用资源,其中SchedulerBackend有多种实现,分别对接不同的资源管理系统

ApplicationMaster、Driver以及Executor内部模块的交互过程:

Driver初始化SparkContext过程中,会分别初始化DAGScheduler、TaskScheduler、SchedulerBackend以及HeartbeatReceiver,并启动SchedulerBackend以及HeartbeatReceiver

3、Spark Stage 级调度

从DAG切割开始,主要是由DAGScheduler来完成。当遇到一个Action操作后就会触发一个Job的计算,并交给DAGScheduler来提交

4、Task级调度

(1)调度方式

Spark Task的调度是由TaskScheduler来完成

TaskSetManager 负责监控管理同一个 Stage 中的 Tasks

(2)调度策略

TaskScheduler 支持两种调度策略,一种是 FIFO(TaskSetManager),也是默认的调度策略,另一 种是 FAIR。

FAIR 模式中有一个 rootPool 和多个子 Pool,各个子 Pool 中存储着所有待分配 的 TaskSetMagager,公平的排序算法

通过 minShare 和 weight 这两个参数控制比较过程,可以做到 让 minShare 使用率和权重使用率少(实际运行 task 比例较少)的先运行。

(3)本地化调度

根据task位置,确定locality本地化存放级别(task和数据分别在什么位置):进程、节点、机架等【task优先位置与其对应的partition对应的优先位置一致】

(4)失败重试与黑名单机制

TaskSetManager知道Task的失败与成功状态,未超过最大重试次数,放回待调度的Task池子

黑名单:记录task失败时的Executor Id 和 Host

五、Spark Shuffle机制

1、核心要点

(1)ShuffleMapStage (结束对应写磁盘)与 ResultStage(结束对应job结束)

执行到 Shuffle 操作时,map 端的 task 个数和 partition 个数一致,即 map task 为 N 个

(2)Shuffle 中的任务个数:取 spark.default.parallelism 这个配置项的值作为分区数;

如果不配置,分区数就决定了reduce端的task的个数

(3)reduce 端数据的读取:map task 位于 ShuffleMapStage,reduce task 位于 ResultStage

map时,本进程中的 MapOutputTrackerWorker 向 Driver 进程中的 MapoutPutTrakcerMaster 请求磁盘小文件的位置信息

Map task执行完毕后,MapOutPutTrackerMaster会告诉MapOutPutTrackerWorker磁盘小文件的位置信息

2、HashShuffle 解析

未经优化时:先将数据写入内存缓冲中,当内存缓冲填满之后,才会溢写到磁盘文件中去。

spark.shuffle. consolidateFiles开启优化设置

优化后:

每 个 shuffleFileGroup 会对应一批磁盘文件,磁盘文件的数量与下游 stage 的 task 数量是 相同的。

新task复用复用之前已有的 shuffleFileGroup,将多个task的磁盘文件合并

3、SortShuffle 解析

(1)普通运行机制:根据key排序后merge临时文件,最后依次写入磁盘

每写一条数据进入内存数据结构之后,就会判断一下,是否达到了某个临界阈值

到达阈值后会先根据key对内存数据结构中已有的数据进行排序,然后再溢写到磁盘

(2)bypass运行机制:

spark.shuffle.sort. bypassMergeThreshold 参数的值时(默认为 200)且不是聚合类的 shuffle 算子

每个 task 会为每个下游 task 都创建一个临时磁盘文件,并将数据按 key 进行 hash 然后根据 key 的 hash 值,将 key 写入对应的磁盘文件之中

每个下游task都创建一个临时磁盘文件,并将数据按key进行hash然后根据key的hash值,将key写入对应的磁盘文件之中

运行机制的不同在于:第一,磁盘写机制 不同;第二,不会进行排序。也就是说,启用该机制的最大好处在于,shuffle write 过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。

六、Spark内存管理

Driver负责创建 Spark 上下文,提交 Spark 作业(Job), 并将作业转化为计算任务(Task),在各个 Executor 进程间协调任务的调度

Executor执行具体的计算任务,并将结果返回给 Driver,同时为需要持 久化的 RDD 提供存储功能。

1、堆内和堆外内存规划

堆内:申请释放(删除引用或等待GC)由JVM完成

堆外:直接在工作节点的系统内存中开辟空间,存储经过序列化的二进制数据。

申请释放不再通过JVM,降低了GC难度

通过配置 spark.memory.offHeap.enabled 参 数启用,并由 spark.memory.offHeap.size 参数设定堆外空间的大小

2、内存空间分配

静态分配:启动前配置,运行期间固定(存储内存和执行内存分开)

统一内存管理:存储内存 和执行内存共享同一块空间,可以动态占用对方的空闲区域

3、存储内存管理

RDD的持久化机制(7种存储级别)

Spark 的 Storage 模块完成RDD的持久化

以 Block 为基本存储单位,RDD 的每个 Partition 经 过处理后唯一对应一个 Block

具有7种持久化级别

RDD的缓存过程

将 Partition 由不连续的存储空间转换为连续存储空间的过程,Spark 称之为"展开"(Unroll)

淘汰与落盘

被淘汰的 Block 如果其存储级别中同时包 含存储到磁盘的要求,则要对其进行落盘(Drop)

4、执行内存管理

Shuffle Write:普通排序和Tungsten序列化形式排序

Shuffle Read:Aggregator聚合、最终使用ExternalSorter

七、Spark核心组件解析

1、BlockManager 数据存储与管理机制

包含组件:磁盘、内存、链接

2、Spark 共享变量底层实现

广播变量:每个均拷贝一份

累加变量:共同操作,只有 Driver 程序可以读取 Accumulator 的值

【Spark】Day05-内核解析:组件、流程、部署、运行模式、通讯架构、任务调度(Stage、task级)、两种Shuffle机制、内存管理、核心组件的更多相关文章

  1. Spark安装部署| 运行模式

    Spark 一种基于内存的快速.通用.可扩展的大数据分析引擎: 内置模块: Spark Core(封装了rdd.任务调度.内存管理.错误恢复.与存储系统交互): Spark SQL(处理结构化数据). ...

  2. spark之scala程序开发(集群运行模式):单词出现次数统计

    准备工作: 将运行Scala-Eclipse的机器节点(CloudDeskTop)内存调整至4G,因为需要在该节点上跑本地(local)Spark程序,本地Spark程序会启动Worker进程耗用大量 ...

  3. Gravitational Teleport docker-compose组件独立部署运行

    Gravitational Teleport 可以作为堡垒机进行使用,上次写过一个all in one 的,这次参考官方 的配置运行一个proxy node auth 分离的应用 备注: 基于dock ...

  4. spark(四)yarn上的运行模式

    架构图 yarn-cluster yarn-client 区别 Yarn-cluster spark的driver运行在applicationMaster内,启动流程为: 这张图可能比较直观 Yarn ...

  5. 运行SPL Streams debugger(sdb)的两种方法

    You can use the SPL Streams Debugger in InfoSphere® Streams Studio to help you debug your SPL applic ...

  6. Nginx部署静态页面及引用图片有效访问的两种方式

    nginx安装百度一下有很多,直接正题: 静态文件目录结构 file#文件位置 /home/service/file/ css js images html fonts 配置nginx.conf核心代 ...

  7. 【原】Spark不同运行模式下资源分配源码解读

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Task的提交源码解读 http://www.cnblogs.com/yourarebest/p/5423906.html Sch ...

  8. Spark的 运行模式详解

    Spark的运行模式是多种多样的,那么在这篇博客中谈一下Spark的运行模式 一:Spark On Local 此种模式下,我们只需要在安装Spark时不进行hadoop和Yarn的环境配置,只要将S ...

  9. 【转载】Spark系列之运行原理和架构

    参考 http://www.cnblogs.com/shishanyuan/p/4721326.html 1. Spark运行架构 1.1 术语定义 lApplication:Spark Applic ...

  10. [转帖]kubernetes ingress 在物理机上的nodePort和hostNetwork两种部署方式解析及比较

    kubernetes ingress 在物理机上的nodePort和hostNetwork两种部署方式解析及比较 https://www.cnblogs.com/xuxinkun/p/11052646 ...

随机推荐

  1. Python Client API文档

    官网文档地址:http://docs.minio.org.cn/docs/master/python-client-api-reference 初使化MinIO Client对象 from minio ...

  2. Elasticsearch 集群健康值红色终极解决方案

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247483905&idx=1&sn=acaff63 ...

  3. 工厂有了 ERP 系统,为什么还要上 MES 系统?

    工厂可以没有ERP,但如果要用系统,必定是MES系统!所以即使工厂有了ERP,也还是要上MES系统的.产生这样的疑问很重要的一个原因是没有明确ERP与MES到底是啥.ERP是Enterprise Re ...

  4. .NET下数据库的负载均衡(有趣实验)(续)

    .NET下数据库的负载均衡(有趣实验)这篇文章发表后,受到了众多读者的关注与好评,其中不乏元老级程序员. 读者来信中询问最多的一个问题是:它是否能支持"异种数据库"的负载均衡?? ...

  5. P5657 [CSP-S2019] 格雷码 (找规律)

    观察几个数据,有一种思路:类似于二分,判断每一位应该填1还是0: 1 #include <bits/stdc++.h> 2 //#define loveGsy 3 using namesp ...

  6. mysql安装教程-window操作系统

    1.下载安装包(官网下载) 直达链接:https://dev.mysql.com/downloads/mysql/ 下载后放到指定目录下解压即可(给电脑新手忠告:注意不要放在C盘,养成好习惯,放C盘多 ...

  7. vue+elementUi实现将数字转化为 对应的字符串内容

    文章目录 1.实现的效果 2.template 3.方法中的数据 4.实际运用 1.实现的效果 数据库状态字段 vue前端效果 2.template prop是你的数据库的字段名称 <el-ta ...

  8. JavaScript基础&实战(3)js中的流程控制语句、条件分支语句、for循环、while循环

    文章目录 1.流程控制语句 1.1 代码 1.2 测试结果 2.弹窗提示输入内容 2.1 代码 2.2 测试结果 3.条件分支语句 3.1 代码 3.2 测试结果 4.while和 do...whil ...

  9. 豆瓣电影排行简单数据爬取_pyhton

    先安装一下requests和bs4库: cmd下面:python -m pip install bs4 -i https://pypi.douban.com/simple 代码: import req ...

  10. 2.Python封装练习及私有属性

    面向对象三大特性 封装:根据职责将属性和方法封装到一个抽象的类中 继承:实现代码的重用,相同代码不需要重复的编写 1.单继承 2.多继承 多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的 ...