学习笔记-spark

概念

RDD: 弹性分布式数据集(由分区组成),每个分区在不同节点上
job:在里面可以看到当前应用分析出来的所有任务,以及所有的excutors中action的执行时间。

stage:在里面可以看到应用的所有stage,stage是按照宽依赖来区分的,因此粒度上要比job更细一些。从作业调度角度展示调度的阶段和任务的完成装填

storage:我们所做的cache persist等操作,都会在这里看到,可以看出来应用目前使用了多少缓存。从存储角度展示RDD的存储状态

environment:里面展示了当前spark所依赖的环境,比如jdk,lib等等。spark以及系统参数

executors:这里可以看到执行者申请使用的内存以及shuffle中input和output等数据。从执行角度展示每个executor运行任务的状况

https://blog.****.net/hjw199089/article/details/77938688 Spark中job、stage、task的划分+源码执行过程分析

https://www.jianshu.com/p/3aa52ee3a802 理解Spark中Job-Stage-Task之间的关系

Job-Stage-Task之间的关系

如下图所示,一个Spark程序可以被划分为一个或多个Job,划分的依据是RDD的Action算子,每遇到一个RDD的Action操作就生成一个新的Job。

每个spark Job在具体执行过程中因为shuffle的存在,需要将其划分为一个或多个可以并行计算的stage,划分的依据是RDD间的Dependency关系,当遇到Wide Dependency时因需要进行shuffle操作,这涉及到了不同Partition之间进行数据合并,故以此为界划分不同的Stage。

Stage是由Task组组成的并行计算,因此每个stage中可能存在多个Task,这些Task执行相同的程序逻辑,只是它们操作的数据不同。一般RDD的一个Partition对应一个Task,Task可以分为ResultTask和ShuffleMapTask。
学习笔记-spark
https://blog.****.net/chengyuqiang/article/details/78170224 RDD依赖关系与stage划分

stage划分

由于shuffle依赖必须等RDD的父RDD分区数据全部可读之后才能开始计算,因此spark的设计是让父 RDD将结果写在本地,完全写完之后,通知后面的RDD。后面的RDD则首先去读之前RDD的本地数据作为输入,然后进行运算。

由于上述特性,将shuffle依赖就必须分为两个阶段(stage)去做:

(1)第1个阶段(stage)需要把结果shuffle到本地,例如reduceByKey,首先要聚合某个key的所有记录,才能进行下一步的reduce计算,这个汇聚的过程就是shuffle。

(2)第2个阶段(stage)则读入数据进行处理。

为什么要写在本地?

后面的RDD多个分区都要去读这个信息,如果放到内存,如果出现数据丢失,后面的所有步骤全部不能进行,违背了之前所说的需要父RDD分区数据全部ready的原则。

同一个stage里面的task是可以并发执行的,下一个stage要等前一个stage ready(和mapreduce的reduce需要等map过程ready 一脉相承)。

Spark 将任务以 shuffle 依赖(宽依赖)为边界打散,划分多个 Stage. 最后的结果阶段叫做 ResultStage, 其它阶段叫 ShuffleMapStage, 从后往前推导,依将计算。

学习笔记-spark
1.从后往前推理,遇到宽依赖就断开,遇到窄依赖就把当前RDD加入到该Stage

2.每个Stage里面Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的。

3.最后一个Stage里面的任务类型是ResultTask,前面其他所有的Stage的任务类型是ShuffleMapTask。

4.代表当前Stage的算子一定是该Stage的最后一个计算步骤

表面上看是数据在流动,实质上是算子在流动。

(1)数据不动代码动

(2)在一个Stage内部算子为何会流动(Pipeline)?首先是算子合并,也就是所谓的函数式编程的执行的时候最终进行函数的展开从而把一个Stage内部的多个算子合并成为一个大算子(其内部包含了当前Stage中所有算子对数据的计算逻辑);其次,是由于Transformation操作的Lazy特性!在具体算子交给集群的Executor计算之前首先会通过Spark Framework(DAGScheduler)进行算子的优化(基于数据本地性的Pipeline)。

Spark SQL job stage 切分规则
读一张表会切分一个job

sort merge join 会切分一个job

job中 遇到 shuffle(group by,distinct,distribute by,join) 会切分 stage,这个和rdd的切分一样

stage 中 连着的 filter,project 操作可以形成一个 whole stage codegen

Spark SQL特点

1.容易集成:已经集成到 Spark 中
2.提供统一的数据访问方式:访问接口 DataFrame(DataSet)
Spark SQL数据源:Oracle中的数据、文本(csv、json)、Hive 的表
3.兼容 Hive
4.提供标准的数据连接方式:JDBC 和 ODBC

Spark SQL 的数据模型:DataFrame(表)

1.表=表结构 + 数据
2.DataFrame = Schema(表结构) + RDD(数据)

https://snaildove.github.io/2020/02/10/summary_of_Translation(SparkTheDefinitiveGuide)_online/ 《Spark权威指南》的翻译综述

Transformations:
一个RDD上指定转换以创建另一个
distinct、filter、map、flatMap、sort

Actions:
action(动作/算子)要么将数据收集到驱动程序,要么写入外部数据源。
reduce、count、first、max、take、saveAsTextFile

共享变量:
1.广播变量是共享的,不可变的变量,它们缓存在集群中的每台计算机上,而不是与每个任务序列化。
2.累加器是Spark的第二种共享变量,是一种在各种转换中更新值并将该值以有效且容错的方式传播到驱动程序节点的方法。