Spark集群启动和任务提交流程、案例练习

回顾

1、常用算子运用场景和源代码执行过程

今天内容

1、用SparkCore实现案例需求
2、Spark集群启动和任务提交流程
3、WordCount过程中产生的RDD
4、RDD的依赖关系
5、Lineage
6、RDD的缓存
7、DAG的生成
8、任务生成和提交的四个阶段

教学目标

1、加深理解算子运用技巧
2、理解Spark启动流程和任务提交流程
3、通过WordCount过程分析创建的RDD
4、RDD的依赖关系
5、RDD的Lineage
6、RDD的缓存及缓存级别
7、DAG的生成和Stage划分
8、任务生成和提交的四个重要阶段

第一节 案例练习

统计所有用户对每个学科的各个模块的访问次数,再取Top3

版本一:

 

版本二:cache(缓存)

 

版本三:自定义分区

 

第二节 Spark集群启动和任务提交流程

startandsubmit

startandsubmitdesc

第三节 WordCount过程中产生的RDD

wordcount

在WordCount的代码中可以调用toDebugString方法来查看整个过程产生的RDD

println(res.toDebugString)

第四节 RDD的依赖关系

RDD和它依赖的父RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。

dependencies

4.1、窄依赖

窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用

总结:窄依赖我们形象的比喻为独生子女

narrowdep

4.2、 宽依赖

宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition

总结:宽依赖我们形象的比喻为超生

widedep

第五节 Lineage

RDD只支持粗粒度转换,即在大量记录上执行的单个操作。将创建RDD的一系列Lineage(即血统)记录下来,以便恢复丢失的分区。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。

lineage

第六节 RDD的缓存

Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或缓存多个数据集。当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。RDD相关的持久化和缓存,是Spark最重要的特征之一。可以说,缓存是Spark构建迭代式算法和快速交互式查询的关键。

6.1、缓存方式

RDD通过persist方法或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

 
 
6.2、缓存级别

通过查看源码发现cache最终也是调用了persist方法,默认的存储级别都是仅在内存存储一份,Spark的存储级别还有好多种,存储级别在object StorageLevel中定义的

 

第七节 DAG的生成

DAG(Directed Acyclic Graph)叫做有向无环图,原始的RDD通过一系列的转换就就形成了DAG,根据RDD之间的依赖关系的不同将DAG划分成不同的Stage,对于窄依赖,partition的转换处理在Stage中完成计算。对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算,因此宽依赖是划分Stage的依据。

dag

第八节 任务生成和提交的四个阶段

RDD的生成、stage切分、task的生成、任务提交

taskgeneratesubmit

第九节 案例练习

通过点击流日志中用户IP来统计区域访问量

 

附件

access.txt

http.log

ip.sql

ip.txt

pom.xml

总结

1、Spark集群启动和任务提交流程
2、Stage划分依据及DAG生成过程
3、RDD缓存和存储级别

作业

1、自己实现案例需求
2、Spark启动流程和任务提交流程
3、DAG的生成

面试题

1、Spark集群启动流程
2、Spark任务时怎么提交的
3、DAG生成过程