一、各个角色解释

  • Application 基于Spark的应用程序,包含了driver程序和 集群上的executor
  • Driver Program 运⾏行main函数并且新建SparkContext的 程序
  • Cluster Manager 在集群上获取资源的外部服务(例如 standalone,Mesos,Yarn )
  • Worker Node 集群中任何可以运⾏行应⽤用代码的节点
  • Executor是在⼀一个worker node上为某应⽤用启动的⼀一 个进程,该进程负责运⾏行任务,并且负责将数据存在内存或 者磁盘上。每个应⽤用都有各⾃自独⽴立的executor
  • Task 被送到某个executor上的工作单元
  • Job 包含很多任务的并行计算,可以看做和Spark的action 对应。一个Action操作产生一个Job
  • Stage⼀一个Job会被拆分很多组任务,每组任务被称为 Stage(就像Mapreduce分map任务和reduce任务⼀一样)。一个transformation操作划分一个Stage, stage的划分是通过宽依赖。在下图中,我们可以看到:

二、Spark任务调度器

2.1、调度器根据RDD的结构信息为每个Action操作确定有效的执行计划 。调度器的接口是runJob函数,参数为RDD及其分区集,和 一个RDD分区上的函数。该接口足以表示Spark中的所有动作 (即count、collect、save等)。

2.2、总的来说,我们的调度器跟Dryad类似,但我们还考虑了哪些 RDD分区是缓存在内存中的。调度器根据目标RDD的Lineage 图创建一个由 stage构成的有向无环路图(DAG)。每个 stage内部尽可能多地包含一组具有窄依赖关系的转换,并将 它们流水线并行化(pipeline)。
### stage的边界有两种情况:

  • 一是宽依赖上的Shuffle操作;
  • 二是已缓存分区,它可以缩短 父RDD的计算过程。
    父RDD完成计算后,可以在 stage内启动一组任务计算丢失的分区。

三、任务调度

3.1standlone模式执行架构

3.2、yarn-client模式执行架构

3.2.1、yarn-client模式下,会产生什么样的问题呢?

由于咱们的driver是启动在本地机器的,而且driver是全权负责所有的任务的调度的,也就是说要跟yarn集群上运行的多个executor进行频繁的通信(中间有task的启动消息、task的执行统计消息、task的运行状态、shuffle的输出结果)。
比如你的executor有100个,stage有10个,task有1000个。每个stage运行的时候,都有1000个task提交到executor上面去运行,平均每个executor有10个task。接下来问题来了,driver要频繁地跟executor上运行的1000个task进行通信。通信消息特别多,通信的频率特别高。运行完一个stage,接着运行下一个stage,又是频繁的通信。

在整个spark运行的生命周期内,都会频繁的去进行通信和调度。所有这一切通信和调度都是从你的本地机器上发出去的,和接收到的。这是最要人命的地方。你的本地机器,很可能在30分钟内(spark作业运行的周期内),进行频繁大量的网络通信。那么此时,你的本地机器的网络通信负载是非常非常高的。会导致你的本地机器的网卡流量会激增!!!

你的本地机器的网卡流量激增,当然不是一件好事了。因为在一些大的公司里面,对每台机器的使用情况,都是有监控的。不会允许单个机器出现耗费大量网络带宽等等这种资源的情况。运维人员。可能对公司的网络,或者其他(你的机器还是一台虚拟机),对其他机器,都会有负面和恶劣的影响。

3.2.2、解决的方法:

实际上解决的方法很简单,就是心里要清楚,yarn-client模式是什么情况下,可以使用的?yarn-client模式,通常咱们就只会使用在测试环境中,你写好了某个spark作业,打了一个jar包,在某台测试机器上,用yarn-client模式去提交一下。因为测试的行为是偶尔为之的,不会长时间连续提交大量的spark作业去测试。还有一点好处,yarn-client模式提交,可以在本地机器观察到详细全面的log。通过查看log,可以去解决线上报错的故障(troubleshooting)、对性能进行观察并进行性能调优。

实际上线了以后,在生产环境中,都得用yarn-cluster模式,去提交你的spark作业。

yarn-cluster模式,就跟你的本地机器引起的网卡流量激增的问题,就没有关系了。也就是说,就算有问题,也应该是yarn运维团队和基础运维团队之间的事情了。使用了yarn-cluster模式以后,就不是你的本地机器运行Driver,进行task调度了。是yarn集群中,某个节点会运行driver进程,负责task调度。

3.3、yarn-cluster模式执行架构

==================================

3.3.1、实践经验,碰到的yarn-cluster的问题:

有的时候,运行一些包含了spark sql的spark作业,可能会碰到yarn-client模式下,可以正常提交运行;yarn-cluster模式下,可能是无法提交运行的,会报出JVM的PermGen(永久代)的内存溢出,OOM。

yarn-client模式下,driver是运行在本地机器上的,spark使用的JVM的PermGen的配置,是本地的spark-class文件(spark客户端是默认有配置的),JVM的永久代的大小是128M,这个是没有问题的;但是呢,在yarn-cluster模式下,driver是运行在yarn集群的某个节点上的,使用的是没有经过配置的默认设置(PermGen永久代大小),82M

spark-sql,它的内部是要进行很复杂的SQL的语义解析、语法树的转换等等,特别复杂,在这种复杂的情况下,如果说你的sql本身特别复杂的话,很可能会比较导致性能的消耗,内存的消耗。可能对PermGen永久代的占用会比较大。

所以,此时,如果对永久代的占用需求,超过了82M的话,但是呢又在128M以内;就会出现如上所述的问题,yarn-client模式下,默认是128M,这个还能运行;如果在yarn-cluster模式下,默认是82M,就有问题了。会报出PermGen Out of Memory error log。

3.3.2、如何解决这种问题?

既然是JVM的PermGen永久代内存溢出,那么就是内存不够用。咱们呢,就给yarn-cluster模式下的,driver的PermGen多设置一些。

spark-submit脚本中,加入以下配置即可:

--conf spark.driver.extraJavaOptions="-XX:PermSize=128M -XX:MaxPermSize=256M"

这个就设置了driver永久代的大小,默认是128M,最大是256M。那么,这样的话,就可以基本保证你的spark作业不会出现上述的yarn-cluster模式导致的永久代内存溢出的问题。

总结一下yarn-client和yarn-cluster模式的不同之处:

yarn-client模式,driver运行在本地机器上的;
yarn-cluster模式,driver是运行在yarn集群上某个NM节点上面的。

yarn-client会导致本地机器负责spark作业的调度,所以网卡流量会激增;
yarn-cluster模式就没有这个问题。

yarn-client的driver运行在本地,通常来说本地机器跟yarn集群都不会在一个机房的,所以说性能可能不是特别好;
yarn-cluster模式下,driver是跟yarn集群运行在一个机房内,性能上来说,也会好一些。

下图为流程图

3.1、DAG Scheduler

• 基于Stage构建DAG,决定每个任务的最佳位置
• 记录哪个RDD或者Stage输出被物化
• 将taskset传给底层调度器TaskScheduler
• 重新提交shuffle输出丢失的stage

3.2、Task Scheduler

• 提交taskset(⼀一组task)到集群运⾏行并汇报结果
• 出现shuffle输出lost要报告fetch failed错误
• 碰到straggle任务需要放到别的节点上重试
• 为每一个TaskSet维护一个TaskSetManager(追踪本地性 及错误信息)

四、任务的调度

Spark之任务流程和角色相关推荐

  1. 《Spark与Hadoop大数据分析》——1.2 大数据科学以及Hadoop和Spark在其中承担的角色...

    1.2 大数据科学以及Hadoop和Spark在其中承担的角色 数据科学的工作体现在以下这两个方面: 要从数据中提取其深层次的规律性,意味着要使用统计算法提炼出有价值的信息.数据产品则是一种软件系统, ...

  2. 《Spark与Hadoop大数据分析》一一1.1 大数据分析以及 Hadoop 和 Spark 在其中承担的角色...

    本节书摘来自华章计算机<Spark与Hadoop大数据分析>一书中的第1章,第1.1节,作者:文卡特·安卡姆(Venkat Ankam) 更多章节内容可以访问云栖社区"华章计算机 ...

  3. 流程管理的流程与角色

    下面是我们在流程管理业务实践中建立起来的几个流程管理的流程(制度)和相关角色. 1.流程拟制流程 流程发布流程 2.处理会议纪要对流程影响的流程 3.流程定期审视和优化的流程 4.流程变革项目管理流程 ...

  4. Spark 任务提交流程说明

    前言 Spark on Yarn集群管理方式 Yarn-Client 任务提交方式 Yarn-Cluster 任务提交方式 Spark Standalone集群管理方式 Standalone Clie ...

  5. 【大数据开发】SparkCore——Spark作业执行流程、RDD编程的两种方式、简单算子

    文章目录 一.Spark作业执行流程(重点) 二.RDD编程 2.1创建RDD的⼆种⽅式: 2.2Transformation算⼦ 2.3Action算子 三.简单算子(必须掌握) 3.1 map.m ...

  6. Spark任务执行流程

    这是Spark官方给的图,大致意思就是: 四个步骤 1.构建DAG(有向无环图)(调用RDD上的方法) 2.DAGScheduler将DAG切分Stage(切分的依据是Shuffle),将Stage中 ...

  7. Spark SQL运行流程及性能优化:RBO和CBO

    1 Spark SQL运行流程 1.1 Spark SQL核心--Catalyst Spark SQL的核心是Catalyst查询编译器,它将用户程序中的SQL/Dataset/DataFrame经过 ...

  8. Spark Streaming 执行流程

    Spark Streaming 是基于spark的流式批处理引擎,其基本原理是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,便可以用于处理实时数据流. 本节描述了Spark Strea ...

  9. Spark SQL 处理流程分析 (一)

    下面的代码演示了通过Case Class进行表Schema定义的例子: // sc is an existing SparkContext. val sqlContext = new org.apac ...

最新文章

  1. ylb:创建数据库、表,对表的增查改删语句
  2. Java this 心得
  3. python redis 消息队列
  4. 两个listmap合并去重_Excel 二维表,相同行标题的多个值各占一行,如何合并为一行?...
  5. 51Nod 1105 第K大的数 二分答案
  6. 十进制数转化为2进制后有多少个1
  7. 有符号数与无符号数间的转换
  8. 一元线性回归多元线性回归
  9. Flutter的Chip标签组件
  10. Atitit 定时器timer 总结 目录 1.1. Js定时器 window.setInterval 1 2. Java定时器 timer 1 1.1.Js定时器 window.setInter
  11. 导出 excel表格(数据、echarts图片)
  12. 联想微型计算机怎么恢复系统,联想一体机系统还原的方法 联想一体机如何还原系统...
  13. android定时器课设报告,数显定时器课程设计报告.doc
  14. QT 插入视频并实现循环播放
  15. 如何在Linux上的命令行中设置Google Chrome浏览器的代理设置?
  16. Shell脚本命令(长期更新)
  17. 分享一款轻量简洁的全平台开源商城系统
  18. 第十二届蓝桥杯大赛软件赛省赛第二场题解
  19. easyrecovery工具2023最新版一键恢复丢失数据免费下载
  20. 计算机桌面怎么突然变大了,电脑桌面比例突然变大?一招还原比例!

热门文章

  1. 给出一个用逗号分隔开的字符串。求各部分之和
  2. document打印
  3. ThinkPHP实现定时执行任务的两种方法
  4. 好看的菜单导航色彩搭配
  5. 继承父类求解矩形,圆形的面积和周长
  6. CDH5.8安装说明
  7. 1908: 【18NOIP提高组】填数游戏
  8. 阿里云手机号停机了怎么办?阿里云手机号收不到验证码,阿里云子账号建立教程
  9. java排他_Activiti之排他网关
  10. 怎么做好数据可视化(文末送书)