开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:Spark 原理_运行过程_概念介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/12025
Spark 原理_运行过程_概念介绍
内容简介
一、逻辑图的原理
二、物理图的原理
三、Job
在此之前,我们已经了解了物理执行图和逻辑执行图很多内容,接下来会学习物理执行图如何运行在集群中,怎样去调度、去执行,第一步要去了解运行所涉及的相关概念。
一、逻辑图的原理
是什么 怎样生成 具体怎么生成
Val textRDD = sc.parallelize(Seq(
“Hadoop Spark”,”hadoop flume”,”spark sqoop”))
Val splitRDD = textRDD.flatMap(_.split(
“ “))
Val tupleRDD = splitRDD.map((_,1))
Val reduceRDD = tupleRDD.reduceByKey(_+_)
Val strRDD = reduceRDD.map(item => s
”${item._}, ${item._2}”)
从 scala 运行语言的角度讲,这段代码的执行结果是怎样,哪一个执行对象
1.编辑代码
复制上述代码
输入
Scala>:paste
// Entering paste mode(ctrl.D to finish)
粘贴到此处
StrRDD
按 ctrl+D 运行
执行结果
Res2中的 rdd 代表的就是 strrdd
一个代码块的执行结果,就是最后一行代码的执行结果
2. 逻辑图的本质就是计算链条:
StrRDD 通过 map 知道父类是 reduceRDD,reduceRDD 通过 reducebykey 知道父类为 TupleRDD,由此继续
这段代码是放在 dirver 中执行的,就拿到了 strrdd ,这个对象中就包含了这个逻辑图,逻辑图的本质就是计算链条
二、物理图的原理
StrRDD.collect.toreach(item => pintln(item
)
Collect 方法称为 action
Action 算子会触发一次 job 的运行,一个 job 就是一个求值的过程
Collect 方法会去调用一个 runjob 方法,runjob 方法会去调用 DAG scheduler 方法
1.流程:Collect 方法会调用 DAGscheduler ,DAGscheduler 会调用 tasksheduler,通过 taskscheduler 将任务运行到集群当中
上述代码其实就是最后的一个 RDD 调用了 action 方法,调用 action 方法的时候,会请求一个叫做 DAGscheduler 的组件,DAGscheduler 会创建用于执行 RDD 的 stage 和 task
2.DAGscheduler 主要做三件事
(1)帮助每个 job 计算 DAG 并发给 tasksheduler 调度
(2)确定每个 task 的最佳位置 //一个 stage 中有多个 task,每个 task 针对 rdd 的分区进行划分
(3)跟踪 RDD 的缓存状态,避免重新计算
三、Job
1.Job什么时候生成?
当一个 RDD 调用了 action 算子的时候,在 action 算子内部,会使用 sc.runjob()调用 sparkcontext 中的 runjob 方法,这个方法又会调用 DAGscheduler 中的 runjob,后在 DAGscheduler 中使用消息驱动的形式创建 job
简而言之,job 在 RDD 调用 action 算子的时候生成,而且调用一次 action 算子,就会生成一个 job,如果一个 sparkAPPlication 中调用了多次 action 算子,会生成多个 job 串行执行,每个 job 独立运作,被独立调度,所以 RDD 的计算也会被执行多次
2.Job 是什么?
数据从读取到取得结果的过程叫做 job,job 是独立运行的,如果要将spark 的程序调度到集群中运行,job 是颗粒最大的单位,调度以 job 为最大单位,将 job 拆分为 stage 和 task 去调度分发和运行,一个 job 就是一个 spark 程序从读取-计算-运行的过程。
一个 spark APPlication 可以包含多个 job,这些 job 之间是串行的,也就是第二个 job 需要等待第一个 job 的执行结束后才会开始运行
总结
逻辑图的原理:此时数据还没有计算
物理图的原理:DAGscheduler 帮助生成 stage、task
Stage 中可以有多个 task
因为//stage 中最后一个 RDD 可以有很多分区,每个分区对应一个 task。
一个T ask 只能在一个 stage 中,一个t ask 只能计算一个分区
Job 是一个求值的过程。