- 基本名词
- Job : 包含多个 Task 组成的并行计算,往往由 Spark action 催生。
- Stage : Job 的调度单位,对应于 TaskSet 。
- TaskSet :一组关联的、相互之间没有 shuffle 依赖关系的任务组成的任务集。
- Task : 被送到某个 executor 上的工作单元
- 运行流程
- 简单流程
- 完整流程
- DAGScheduler的职责
- DAGScheduler 构建 Stage
- 记录哪个 RDD 或者 Stage 输出被物化
- 重新提交 shuffle 输出丢失的 stage
- 将 Taskset 传给底层调度器
- – spark-cluster TaskScheduler
- – yarn-cluster YarnClusterScheduler
- – yarn-client YarnClientClusterScheduler
- TaskSchedler的职责
- 为每一个 TaskSet 构建一个 TaskSetManager 实例管理这个 TaskSet 的生命周期
- 数据本地性决定每个 Task 最佳位置 (process-local, node-local, rack-local and then any) ,
- 提交 taskset( 一组 task) 到集群运行并监控
- 推测执行,碰到 straggle 任务需要放到别的节点上重试
- 出现 shuffle 输出 lost 要报告 fetch failed 错误
- Driver的执行流程
- ExecuteBackend执行流程
- 两种Task类型:二种 Task : shuffleMapTask 和 ResultTask ,被执行的 task 多数都是 shuffleMapTask
- ResultTask ( FinalStage 所对应的任务) , 返回给 driver 的是运算结果本身
- – 结果足够小,则直接放在 DirectTaskResult 对象内
- – 超过特定尺寸(默认约 10MB )则在 Executor 端会将 DirectTaskResult 先序列化,再把序列化的结果作为一个 Block 存放在 BlockManager 里,而后将 BlockManager 返回的 BlockID放在 IndirectTaskResult 对象中返回给 driver
- ShuffleMapTask ,返回给 DAGScheduler 的是一个 MapStatus 对象, MapStatus 对象管理了 ShuffleMapTask 的运算输出结果在 ShuffleBlockManager 里的相关存储信息,而非结果本身,这些存储位置信息将作为下一个 Stage 的任务的获取输入数据的依据
- shuffle 的结果 patition 数目由 ShuffleDependency 中的 Partitioner 对象来决定
- Spark 内核将提供一个可拔插的 shuffle 接口
- ResultTask ( FinalStage 所对应的任务) , 返回给 driver 的是运算结果本身
- WordCount的例子以及解析
- 代码
val lines = ssc.textFile(args(1)) // 输入
val words = lines.flatMap(x =>x.split(" "))
words.cache() // 缓存
val wordCounts = words.map(x =>(x, 1) )
val red = wordCounts.reduceByKey( (a,b)=>{a + b} , 8)
red.saveAsTextFile(“/root/Desktop/out” , 8) // 行动
val sortResult=words.map(x=>(x,1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))//对统计结果进行排序 - RDD构建流程
- 代码
- DAGScheduler的职责
- 简单流程
Spark 入门之三:Spark运行框架
最新推荐文章于 2021-12-31 10:15:59 发布