Spark一路火花带闪电——Spark底层原理介绍
文章目录
- Spark计算引擎原理
- 1.1 术语
- 1.1.1 Application:Spark应用程序
- 1.1.2 Driver:驱动程序
- 1.1.3 Cluster Manager:资源管理器
- 1.1.4 Executor:执行器
- 1.1.5 Worker:计算节点
- 1.1.6RDD:弹性分布式数据集
- 1.1.7 DAGScheduler:有向无环图调度器
- 1.1.8 TaskScheduler:任务调度器
- 1.1.9 Job:作业
- 1.2 计算流程
- RDD 原理
- DAG
- 窄依赖
- 宽依赖
- Stage概念
- RDD partitioner与并行度
Spark计算引擎原理
Spark应用程序以进程集合为单位在分布式集群上运行,通过driver程序的main方法创建的SparkContext对象与集群交互。
- Spark通过SparkContext向Cluster manager(资源管理器)申请所需执行的资源(cpu、内存等)
- Cluster manager分配应用程序执行需要的资源,在Worker节点上创建Executor
- SparkContext 将程序代码(jar包或者python文件)和Task任务发送给Executor执行,并收集结果给Driver。
1.1 术语
1.1.1 Application:Spark应用程序
指的是用户编写的Spark应用程序,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。
Spark应用程序,由一个或多个作业JOB组成,如下图所示:
1.1.2 Driver:驱动程序
Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常SparkContext代表Driver,如下图所示:
1.1.3 Cluster Manager:资源管理器
指的是在集群上获取资源的外部服务,常用的有:Standalone,Spark原生的资源管理器,由Master负责资源的分配;Haddop Yarn,由Yarn中的ResearchManager负责资源的分配;Messos,由Messos中的Messos Master负责资源管理,如下图所示:
1.1.4 Executor:执行器
Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor,如下图所示:
1.1.5 Worker:计算节点
集群中任何可以运行Application代码的节点,类似于Yarn中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点,在Spark on Yarn模式中指的就是NodeManager节点,在Spark on Messos模式中指的就是Messos Slave节点,如下图所示:
1.1.6RDD:弹性分布式数据集
Resillient Distributed Dataset,Spark的基本计算单元,可以通过一系列算子进行操作(主要有Transformation和Action操作),如下图所示:
1.1.7 DAGScheduler:有向无环图调度器
基于DAG划分Stage 并以TaskSet的形势提交Stage给TaskScheduler;负责将作业拆分成不同阶段的具有依赖关系的多批任务;最重要的任务之一就是:计算作业和任务的依赖关系,制定调度逻辑。在SparkContext初始化的过程中被实例化,一个SparkContext对应创建一个DAGScheduler。
1.1.8 TaskScheduler:任务调度器
将Taskset提交给worker(集群)运行并回报结果;负责每个具体任务的实际物理调度。如图所示:
1.1.9 Job:作业
由一个或多个调度阶段所组成的一次计算作业;包含多个Task组成的并行计算,往往由Spark Action催生,一个JOB包含多个RDD及作用于相应RDD上的各种Operation。如图所示:
1.2 计算流程
RDD 原理
DAG
RDD提供了许多转换操作,每个转换操作都会生成新的RDD,这是新的RDD便依赖于原有的RDD,这种RDD之间的依赖关系最终形成了DAG(Directed Acyclic Graph,有向无环图)。
窄依赖
父RDD每一个分区最多被一个子RDD的分区所用;表现为一个父RDD的分区对应于一个子RDD的分区,或两个父RDD的分区对应于一个子RDD 的分区。如图所示:
宽依赖
父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区。如图所示:
常见的窄依赖有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned :如果JoinAPI之前被调用的RDD API是宽依赖(存在shuffle), 而且两个join的RDD的分区数量一致,join结果的rdd分区数量也一样,这个时候join api是窄依赖)。
常见的宽依赖有groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned :除此之外的,rdd 的join api是宽依赖)。
其实区分宽窄依赖主要就是看父RDD的一个Partition的流向,要是流向一个的话就是窄依赖,流向多个的话就是宽依赖。看图理解:
Stage概念
Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。stage是由一组并行的task组成。
- stage切割规则
切割规则:从后往前,遇到宽依赖就切割stage。
比较hadoop,每执行一个map或reduce都要开启一个新的进程,是不是很耗时,但是在spark中通过划分RDD的依赖关系,可以让多个窄依赖在一个线程中以流水线执行,快速且节省资源。
DAG将一个job根据宽依赖划分多个stage,一个stage的父stage都执行完才能开始执行,通过这样有逻辑地执行任务可以避免冗余操作,合理安排执行顺序,大大节约了时间。
RDD partitioner与并行度
每个RDD都有Partitioner属性,它决定了该RDD如何分区,当然Partition的个数还将决定每个Stage的Task个数。当前Spark需要应用设置Stage的并行Task个数(配置项为:spark.default.parallelism),在未设置的情况下,子RDD会根据父RDD的Partition决定,如map操作下子RDD的Partition与父Partition完全一致,Union操作时子RDD的Partition个数为父Partition个数之和。
如何设置spark.default.parallelism对用户是一个挑战,它会很大程度上决定Spark程序的性能。
Spark一路火花带闪电——Spark底层原理介绍相关推荐
- Spark一路火花带闪电——Spark踩坑记
文章目录 坑有哪些? 踩坑记:版本号一定要正确!!!JDK一定要匹配. 使用idea打包maven项目 坑有哪些? ClassNotFoundException:表明maven依赖和服务器中的版本不匹 ...
- Spark一路火花带闪电——Spark常用算子(参数及其返回值)探究
文章目录 转化算子 行动算子 转化算子 以数据Seq(1,2,3,3)为例子 map(f:T => U):RDD[U] 映射:将函数应用于RDD内的每个元素,将其返回值构成新的RDD rdd.m ...
- Spark一路火花带闪电——认识Spark
文章目录 认识Apache Spark 1.1 Spark是一个软件栈 1.1.1 Spark Core 1.1.2 Spark SQL 1.1.3 Spark Streaming 1.1.4 MLl ...
- Spark一路火花带闪电——Accumulator Broadcast
文章目录 Accumulator累加器 Accumulator简介 陷阱及解决办法 Broadcast广播变量 Accumulator累加器 Accumulator简介 Accumulator是spa ...
- Spark一路火花带闪电——Pair RDD常用算子(参数及其返回值)探究
文章目录 转化算子 行动算子 转化算子 以键值对集合{(1,2),(3,4),(3,6)}为例 RDD[U,T]注意下面的函数,对应U和T reduceByKey(f:(T,T) => T):R ...
- 手拿菜刀砍电线,一路火花带闪电,神经病人思维广,弱智孩子欢乐多!
150条经典装逼语录,签名专用 ~~~手拿菜刀砍电线,一路火花带闪电~~~(转) 2009年07月26日 星期日 12:10 1.<卖火柴的小女孩>这篇文章主要写得是:一个小女孩五次擦火柴 ...
- 程序猿菜鸟打怪升级—一路火花带闪电
文章目录 一. 昨夜西风凋碧树,独上高楼,望尽天涯路 二. 衣带渐宽终不悔,为伊消得人憔悴 三.众里寻他千百度,蓦然回首,那人却在,灯火阑珊处 [告别平庸的9个方法] 各位小伙伴,大家好!我是猿人谷, ...
- quartz获取开始结束时间_quartz核心元素及底层原理介绍
quartz核心元素及底层原理介绍 Quartz的核心元素主要有Scheduler.Trigger.Job.JobDetail.其中 - Scheduler为调度器负责整个定时系统的调度,内部通过线程 ...
- Hadoop 底层原理介绍
1 概述 Apache Hadoop是一个软件框架,可在具有数千个节点和PB级数据的大型集群上进行分布式处理. Hadoop主要包含四个项目:Hadoop Common.Hadoop分布式文件系统(H ...
最新文章
- LB负载均衡集群 - NAT
- 学python可以做什么知乎-学完Python后能做什么?
- Python 库安装问题-用pip安装pyHook3报错的两种常见问题和解决方法
- DOS下查看局域网的ip使用情况,以及ip对应的主机名
- 绍中考能不能用计算机了,全国计算机二级考什么内容
- Java oracle查询语句无法赋值给_java.sql.SQLException: 无法转换为内部表示 -〉java 查询oracle数据库返回错误信息...
- 我的世界javamod怎么装_装暖气片,10个有8个人都想知道的这点事儿!
- 了解css中伪元素 before和after的用法
- 物联网 云计算 大数据 分布式
- 基于react/vue的移动端终极适配方案(更新css-modules配置)
- 【3D视觉】深度摄像头与3D重建
- oracle查询sql对应用户名,Oracle EBS-SQL (SYS-21):sys_用户名与人员对应关系查询.sql
- R语言 按照行名称取行
- 利用毒株的accession号,批量下载fasta格式的文件
- Lua IDE - x-studio 强大的IDE
- 兰德系数(Rand Index)
- C#中打印功能的实现
- SaaS云服务应用的访问安全性分析
- 帆软report分析报表修改控件样式
- jQuery 效果- 隐藏和显示
热门文章
- Python fidder的简单实用
- libgomp.so.1:version 'GOMP_4.0' not fount 问题的解决方案
- 初识Serverless
- 服务器从上架到上线经验
- 如何安装使用Clion
- 最强旅游攻略 | 用Python分析国庆中秋最佳旅游景点 (文末福利)
- Sparse 3D convolution
- 市场热门护照识别性能测评对比
- ​​​​​​​Snmp学习总结(五)——SNMP4J介绍
- python svr回归_SVR回归分析简明教程