自己编写的spark代码执行流程

Posted irich的架构师之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己编写的spark代码执行流程相关的知识,希望对你有一定的参考价值。

  我们自己编写了spark代码后;放到集群中一执行,就会出现问题,没有序列化、指定的配置文件不存在、classnotfound等等。这其实很多时候就是因为我们对自己编写的spark代码执行流程的不熟悉导致的,源码阅读可以解决,但源码不是每个人都能看懂或能看进去的,下面我们就来讲一下,我们自己写的spark代码究竟是这么执行的。从执行的过程可分为三个部分来分析main方法,RDD处理方法,DStream处理方法,从执行的JVM虚拟机可以分为两个部分driver端,worker端
(架构师之路③群:256909960,欢迎加入)
一、main方法
  main方法就是在driver端执行的,当然这里是把RDD计算的Action剔除的情况,先看一段代码
1、driver端
  除了rdd算子中的代码其他都是在driver端执行,并且只执行一次
(架构师之路③群:256909960,欢迎加入)
2、worker端
  DSUtil.dSopt()这里的带就是处理DSTream的,其中有一部分代码是driver一部分是Worker的,这里姑且认为是在worker端
(架构师之路③群:256909960,欢迎加入)
二、DStream处理方法
  在sparkStreaming中spark引入了DStream,实际上就是RDD的map集合(不是很精确),在处理的时候代码是:
(架构师之路③群:256909960,欢迎加入)
1、driver端
  除了Dstram计算中的代码其他都是在driver端并且只执行一次。
  这里需要注意的是DStream的action方法(闭包)中的代码也不是全在worker端执行,只有在处理rdd时才会在Worker端执行,其他是在driver端执行的;
  与DStream的算子方法外的代码区别是,这里是计算一次执行一次。
(架构师之路③群:256909960,欢迎加入)
2、worker端
  rdd的Action操作(闭包)中的代码都是在Worker端执行的
(架构师之路③群:256909960,欢迎加入)
三、RDD处理方法
  最后我们来看看RDD算子闭包在执行时代码如何执行
(架构师之路③群:256909960,欢迎加入)
1、driver端
  挡在调用count方法处理rdd时,与rdd算子无关的代码都是计算一次执行一次
(架构师之路③群:256909960,欢迎加入)
2、worker端
  rdd的算子闭包是在driver端中执行的
(架构师之路③群:256909960,欢迎加入)
四、总结
  根据spark中job的生成过程,来看代码执行就一目了然了,spark中job的生成是在driver端,这里只是生成了一个模板,并不会在driver端执行,spark会把这个模板及与模板相关的对象一起发送到worker端(这就是移动计算不移动数据,与storm的区别),Worker有了数据和模板就可以计算了,Worker会从Action算子开始向上逆推在计算,这样就有了Rdd算子代码在worker端执行;
但是这里ForeachRDD,transformRDD中的代码怎么又在driver端执行了?
  这是因为spark一开始生成的是一个静态模板在spark每个batch执行计算式,会用这个静态的模板动态生成以DAG,所以就有了DStream中的算子代码在driver中执行
(架构师之路③群:256909960,欢迎加入)
五、参考资料
(架构师之路③群:256909960,欢迎加入)

以上是关于自己编写的spark代码执行流程的主要内容,如果未能解决你的问题,请参考以下文章

pyspark执行逻辑流程

Spark算子执行流程详解之二

spark-sql执行流程分析

大数据之Spark:Spark 底层执行原理

spark 能执行udf 不能执行udaf,啥原因

Spark的任务提交和执行流程详解