文章目录

  • 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底层原理介绍相关推荐

  1. Spark一路火花带闪电——Spark踩坑记

    文章目录 坑有哪些? 踩坑记:版本号一定要正确!!!JDK一定要匹配. 使用idea打包maven项目 坑有哪些? ClassNotFoundException:表明maven依赖和服务器中的版本不匹 ...

  2. Spark一路火花带闪电——Spark常用算子(参数及其返回值)探究

    文章目录 转化算子 行动算子 转化算子 以数据Seq(1,2,3,3)为例子 map(f:T => U):RDD[U] 映射:将函数应用于RDD内的每个元素,将其返回值构成新的RDD rdd.m ...

  3. 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 ...

  4. Spark一路火花带闪电——Accumulator Broadcast

    文章目录 Accumulator累加器 Accumulator简介 陷阱及解决办法 Broadcast广播变量 Accumulator累加器 Accumulator简介 Accumulator是spa ...

  5. Spark一路火花带闪电——Pair RDD常用算子(参数及其返回值)探究

    文章目录 转化算子 行动算子 转化算子 以键值对集合{(1,2),(3,4),(3,6)}为例 RDD[U,T]注意下面的函数,对应U和T reduceByKey(f:(T,T) => T):R ...

  6. 手拿菜刀砍电线,一路火花带闪电,神经病人思维广,弱智孩子欢乐多!

    150条经典装逼语录,签名专用 ~~~手拿菜刀砍电线,一路火花带闪电~~~(转) 2009年07月26日 星期日 12:10 1.<卖火柴的小女孩>这篇文章主要写得是:一个小女孩五次擦火柴 ...

  7. 程序猿菜鸟打怪升级—一路火花带闪电

    文章目录 一. 昨夜西风凋碧树,独上高楼,望尽天涯路 二. 衣带渐宽终不悔,为伊消得人憔悴 三.众里寻他千百度,蓦然回首,那人却在,灯火阑珊处 [告别平庸的9个方法] 各位小伙伴,大家好!我是猿人谷, ...

  8. quartz获取开始结束时间_quartz核心元素及底层原理介绍

    quartz核心元素及底层原理介绍 Quartz的核心元素主要有Scheduler.Trigger.Job.JobDetail.其中 - Scheduler为调度器负责整个定时系统的调度,内部通过线程 ...

  9. Hadoop 底层原理介绍

    1 概述 Apache Hadoop是一个软件框架,可在具有数千个节点和PB级数据的大型集群上进行分布式处理. Hadoop主要包含四个项目:Hadoop Common.Hadoop分布式文件系统(H ...

最新文章

  1. LB负载均衡集群 - NAT
  2. 学python可以做什么知乎-学完Python后能做什么?
  3. Python 库安装问题-用pip安装pyHook3报错的两种常见问题和解决方法
  4. DOS下查看局域网的ip使用情况,以及ip对应的主机名
  5. 绍中考能不能用计算机了,全国计算机二级考什么内容
  6. Java oracle查询语句无法赋值给_java.sql.SQLException: 无法转换为内部表示 -〉java 查询oracle数据库返回错误信息...
  7. 我的世界javamod怎么装_装暖气片,10个有8个人都想知道的这点事儿!
  8. 了解css中伪元素 before和after的用法
  9. 物联网 云计算 大数据 分布式
  10. 基于react/vue的移动端终极适配方案(更新css-modules配置)
  11. 【3D视觉】深度摄像头与3D重建
  12. oracle查询sql对应用户名,Oracle EBS-SQL (SYS-21):sys_用户名与人员对应关系查询.sql
  13. R语言 按照行名称取行
  14. 利用毒株的accession号,批量下载fasta格式的文件
  15. Lua IDE - x-studio 强大的IDE
  16. 兰德系数(Rand Index)
  17. C#中打印功能的实现
  18. SaaS云服务应用的访问安全性分析
  19. 帆软report分析报表修改控件样式
  20. jQuery 效果- 隐藏和显示

热门文章

  1. Python fidder的简单实用
  2. libgomp.so.1:version 'GOMP_4.0' not fount 问题的解决方案
  3. 初识Serverless
  4. 服务器从上架到上线经验
  5. 如何安装使用Clion
  6. 最强旅游攻略 | 用Python分析国庆中秋最佳旅游景点 (文末福利)
  7. Sparse 3D convolution
  8. 市场热门护照识别性能测评对比
  9. ​​​​​​​Snmp学习总结(五)——SNMP4J介绍
  10. python svr回归_SVR回归分析简明教程