Spark Job具体的物理执行

即使采用pipeline的方式,函数f对依赖的RDD中的数据集合的操作也会有两种方式:

1.f(record),f作用于集合的每一条记录,每次只作用于一条记录

2.f(records),f一次性作用于集合的全部数据;

Spark采用的是第一种方式,因为:

1.无需等待,可以最大化的使用集群的计算资源

2.减少OOM的产生

3.最大化的有利于并发

4.可以精准的控制每一个Partition本身(Dependency)及其内部的计算(compute)

5.基于lineage的算子流动式函数式计算,可以节省中间结果的产生,可以最快的恢复

不会产生网络流量,因为用的是pipeline。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

物理执行过程

Spark Application里面可以产生1个或者多个job,例如spark-shell默认启动时,内部就没有job,只是作为资源的分配程序,可以在里面写代码产生多个Job,普通程序一般而言,可以有不用的Action,每一个Action一般也会触发一个Job。

Spark是MapReduce思想的一种更加精致和高效的实现,MapReduce有很多不同的具体实现,例如Hadoop的MapReduce基本的计算流程,如下:首先是并发,以JVM为对象的并发Mapper,Mapper中的map的执行会产生输出数据,输出的数据会经由Partitioner指定的规则,放到localFileSystem中,然后再经由Shuffle、Sort、Aggregate变成reducer中的Reduce的输入,执行reduce产生最终的执行结果。hadoop MapReduce执行的流程虽然简单,但是过于死板,尤其是构造复杂算法(迭代)时候,非常不利于算法的实现,且执行效率极为低下。

Spark执行时,物理算法构造和物理执行时,最基本的核心:最大化pipeline

基于pipeline的思想,数据被使用的时候才开始计算,从数据流动的视角来说,是数据流动到计算的位置。实质上,从逻辑的角度来看,是算子在数据上流动。

从算法构建的角度而言,是算子作用于数据,所以是算子在数据上流动。方便算法的构建。

从物理执行的角度而言,是数据流动到计算的位置。方便系统更加高效的运行。

对于pipeline而言,数据计算的位置就是每个Stage中最后的RDD,每个Stage中除了最后一个RDD算子是真实的意外,前面的算子都是假的。

由于计算的Lazy特性,导致计算从后往前回溯,形成Computing Chain,导致的结果就是需要首先计算出具体一个Stage内部左侧的RDD中本次计算依赖的Partition。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

窄依赖的物理执行

一个Stage内部的RDD都是窄依赖,窄依赖计算本身是逻辑上看从stage内部的最左侧的RDD开始计算的,根据Computing Chain,数据(Record)从一个计算步骤流动到下一个计算步骤,以此类推,直到计算到Stage内部的最后一个RDD产生计算结果。

Computing Chain的构建是从后往前回溯构建而成的,而实际的物理计算则是让数据从前往后在算子上流动,直到流动到不能再流动为止,才开始计算下一个Record。这就导致后面的RDD对前面的RDD的依赖,虽然是Partition级别的数据集合的依赖,但是并不需要父RDD把Partition中的所有的Record计算完毕,才整体完后流动数据进行计算。这极大地提高了计算速率。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

宽依赖的物理执行

必须等到依赖的父Stage中的最后一个RDD把全部数据彻底计算完毕,才能够经过shuffle来计算当前的Stage。

时间: 2024-11-19 04:41:11

Spark Job具体的物理执行的相关文章

从物理执行的角度透视Spark Job(DT大数据梦工厂)

内容: 1.再次思考pipeline: 2.窄依赖物理执行内幕: 3.宽依赖物理执行内幕: 4.Job提交流程: 物理执行是更深层次的角度. ==========再次思考pipeline ============ 即使采用pipeline的方式,函数f对依赖的RDD中的数据集合的操作也会有两种方式: 1.f(record),f作用于集合的每一条记录,每次只作用于一条记录: 2.f(records), f一次性作用于集合的全部数据: Spark运行的时候用的是第一种方式,为什么呢? 1.无需等待,

从物理执行角度透视Spark Job(23)

一.再次思考pipeline 即使采用pipeline的方式,函数f对依赖的RDD中的数据集合的操作也会有两种方式: 1, f(record),f作用于集合的每一条记录,每次只作用于一条记录: 2, f(records),f一次性作用于集合的全部数据: Spark采用是是第一种方式,原因: 1, 无需等待,可以最大化的使用集群的计算资源: 2, 减少OOM的发生: 3, 最大化的有利于并发: 4, 可以精准的控制每一Partition本身(Dependency)及其内部的计算(compute):

spark(二):spark架构及物理执行图

上图是一个job的提交流程图,job提交的具体步骤如下 一旦有action,就会触发DagScheduler.runJob来提交任务,主要是先生成逻辑执行图DAG,然后调用 finalStage = newStage() 来划分 stage. new Stage() 的时候会调用 finalRDD 的 getParentStages(): getParentStages() 从 finalRDD 出发,反向 visit 逻辑执行图,遇到 NarrowDependency 就将依赖的 RDD 加入

Spark(六)Spark任务提交方式和执行流程

一.Spark中的基本概念 (1)Application:表示你的应用程序 (2)Driver:表示main()函数,创建SparkContext.由SparkContext负责与ClusterManager通信,进行资源的申请,任务的分配和监控等.程序执行完毕后关闭SparkContext (3)Executor:某个Application运行在Worker节点上的一个进程,该进程负责运行某些task,并且负责将数据存在内存或者磁盘上.在Spark on Yarn模式下,其进程名称为 Coar

【总结】Spark优化-多Job并发执行

Spark程序中一个Job的触发是通过一个Action算子,比如count(), saveAsTextFile()等 在这次Spark优化测试中,从Hive中读取数据,将其另外保存四份,其中两个Job采用串行方式,另外两个Job采用并行方式.将任务提交到Yarn中执行.能够明显看出串行与兵线处理的性能. 每个Job执行时间: JobID 开始时间 结束时间 耗时 Job 0 16:59:45 17:00:34 49s Job 1 17:00:34 17:01:13 39s Job 2 17:01

Spark任务提交方式和执行流程

转自:http://www.cnblogs.com/frankdeng/p/9301485.html 一.Spark中的基本概念 (1)Application:表示你的应用程序 (2)Driver:表示main()函数,创建SparkContext.由SparkContext负责与ClusterManager通信,进行资源的申请,任务的分配和监控等.程序执行完毕后关闭SparkContext (3)Executor:某个Application运行在Worker节点上的一个进程,该进程负责运行某些

Spark 宏观架构&执行步骤

Spark 使用主从架构,有一个中心协调器和许多分布式worker. 中心协调器被称为driver.Driver 和被称为executor 的大量分布式worker 通信 Driver 运行在它自己的Java 进程,而每个executor 是单独的Java 进程.Driver 和它的所有executor 一起被称为Spark 应用. Spark 应用运行在一组使用被称为集群管理器的外部服务的机器上.注意,Spark 打包了一个内置的集群管理器,叫做Standalong 集群管理器.Spark 也

spark DAGScheduler、TaskSchedule、Executor执行task源码分析

摘要 spark的调度一直是我想搞清楚的东西,以及有向无环图的生成过程.task的调度.rdd的延迟执行是怎么发生的和如何完成的,还要就是RDD的compute都是在executor的哪个阶段调用和执行我们定义的函数的.这些都非常的基础和困难.花一段时间终于弄白了其中的奥秘.总结起来,以便以后继续完善.spark的调度分为两级调度:DAGSchedule和TaskSchedule.DAGSchedule是根据job来生成相互依赖的stages,然后把stages以TaskSet形式传递给Task

Spark修炼之道(高级篇)——Spark源码阅读:第八节 Task执行

Task执行 在上一节中,我们提到在Driver端CoarseGrainedSchedulerBackend中的launchTasks方法向Worker节点中的Executor发送启动任务命令,该命令的接收者是CoarseGrainedExecutorBackend(Standalone模式),类定义源码如下: private[spark] class CoarseGrainedExecutorBackend( override val rpcEnv: RpcEnv, driverUrl: St