Spark作业调度

对RDD的操作分为transformation和action两类,真正的作业提交运行发生在action之后,调用action之后会将对原始输入数据的所有transformation操作封装成作业并向集群提交运行。这个过程大致可以如下描述:

    • 由DAGScheduler对RDD之间的依赖性进行分析,通过DAG来分析各个RDD之间的转换依赖关系
    • 根据DAGScheduler分析得到的RDD依赖关系将Job划分成多个stage
    • 每个stage会生成一个TaskSet并提交给TaskScheduler,调度权转交给TaskScheduler,由它来负责分发task到worker执行

接下来,理解 Spark 中RDD的依赖关系.

 

RDD依赖关系  

Spark中RDD的粗粒度操作,每一次transformation都会生成一个新的RDD,这样就会建立RDD之间的前后依赖关系,在Spark中,依赖关系被定义为两种类型,分别是窄依赖和宽依赖

  • 窄依赖,父RDD的分区最多只会被子RDD的一个分区使用,
  • 宽依赖,父RDD的一个分区会被子RDD的多个分区使用(宽依赖指子RDD的每个分区都要依赖于父RDD的所有分区,这是shuffle类操作)

图中左边都是窄依赖关系,可以看出分区是1对1的。右边为宽依赖关系,有分区是1对多。(map,filter,union属于第一类窄依赖)

stage的划分

stage的划分是Spark作业调度的关键一步,它基于DAG确定依赖关系,借此来划分stage,将依赖链断开,每个stage内部可以并行运行,整个作业按照stage顺序依次执行,最终完成整个Job。实际应用提交的Job中RDD依赖关系是十分复杂的,依据这些依赖关系来划分stage自然是十分困难的,Spark此时就利用了前文提到的依赖关系,调度器从DAG图末端出发,逆向遍历整个依赖关系链,遇到ShuffleDependency(宽依赖关系的一种叫法)就断开,遇到NarrowDependency就将其加入到当前stage。stage中task数目由stage末端的RDD分区个数来决定,RDD转换是基于分区的一种粗粒度计算,一个stage执行的结果就是这几个分区构成的RDD。

图中可以看出,在宽依赖关系处就会断开依赖链,划分stage,这里的stage1不需要计算,只需要计算stage2和stage3,就可以完成整个Job。

总结:遇到一个宽依赖就分一个stage

参考博客:https://blog.csdn.net/mahuacai/article/details/51919615

https://wongxingjun.github.io/2015/05/25/Spark%E4%BD%9C%E4%B8%9A%E8%B0%83%E5%BA%A6%E4%B8%ADstage%E7%9A%84%E5%88%92%E5%88%86/

最新文章

  1. com.panie 项目开发随笔_前后端框架考虑(2016.12.8)
  2. 真正解决问题:maven eclipse tomcat java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  3. 使用Autodesk Vault插件向导轻松创建Vault插件
  4. lecture16-联合模型、分层坐标系、超参数优化及本课未来的探讨
  5. 在Android工程中运行main函数
  6. Auty自动化测试框架第一篇——生成执行列表
  7. HDU 4986
  8. VS2010 Notes
  9. javascripct流程语句
  10. Zend Cache的学习和实例
  11. Python学习笔记5(字符串与正则表达式)
  12. 更有效率的使用Visual Studio2
  13. NA笔记
  14. 前端面试题-----js和jquery的区别是什么?
  15. 绕过校园网WEB认证_iodine实现
  16. elasticsearch5之Elastalert 安装使用 配置邮件报警和微信报警
  17. James Munkres Topology: Theorem 19.6
  18. Axure8破解码
  19. Win10系列:C#应用控件进阶2
  20. 2018-2019-2 20165212《网络对抗技术》Exp2 后门原理与实践

热门文章

  1. rabbitMQ报错:Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method:
  2. c++学习笔记3(内联函数)
  3. NOIP模拟99(多校31)
  4. dart系列之:创建Library package
  5. [cf1392I]Kevin and Grid
  6. 2、使用HashOperations操作redis(Hash哈希表)
  7. 第09章 MySQL子查询
  8. Win10更新Win11步骤及体验感
  9. Python+selenium之多窗口,句柄
  10. Object类的toString和Equals方法,以及Objects类的Equals方法