Spark 入门之三:Spark运行框架

来源:互联网 发布:新疆网络监控处置中心 编辑:程序博客网 时间:2024/05/22 01:59
  1. 基本名词
    1. Job : 包含多个 Task 组成的并行计算,往往由 Spark action 催生。
    2. Stage : Job 的调度单位,对应于 TaskSet 。
    3. TaskSet :一组关联的、相互之间没有 shuffle 依赖关系的任务组成的任务集。
    4. Task : 被送到某个 executor 上的工作单元

  2. 运行流程
    1. 简单流程

    2. 完整流程

      1. DAGScheduler的职责
        1. DAGScheduler 构建 Stage
        2. 记录哪个 RDD 或者 Stage 输出被物化
        3. 重新提交 shuffle 输出丢失的 stage
        4. 将 Taskset 传给底层调度器
          1. – spark-cluster TaskScheduler
          2. – yarn-cluster YarnClusterScheduler
          3. – yarn-client YarnClientClusterScheduler
      2. TaskSchedler的职责
        1. 为每一个 TaskSet 构建一个 TaskSetManager 实例管理这个 TaskSet 的生命周期
        2. 数据本地性决定每个 Task 最佳位置 (process-local, node-local, rack-local and then any) ,
        3. 提交 taskset( 一组 task) 到集群运行并监控
        4. 推测执行,碰到 straggle 任务需要放到别的节点上重试
        5. 出现 shuffle 输出 lost 要报告 fetch failed 错误
      3. Driver的执行流程

      4. ExecuteBackend执行流程

      5. 两种Task类型:二种 Task : shuffleMapTask 和 ResultTask ,被执行的 task 多数都是 shuffleMapTask 
        1. ResultTask ( FinalStage 所对应的任务) , 返回给 driver 的是运算结果本身
          1. – 结果足够小,则直接放在 DirectTaskResult 对象内
          2. – 超过特定尺寸(默认约 10MB )则在 Executor 端会将 DirectTaskResult 先序列化,再把序列化的结果作为一个 Block 存放在 BlockManager 里,而后将 BlockManager 返回的 BlockID放在 IndirectTaskResult 对象中返回给 driver
        2. ShuffleMapTask ,返回给 DAGScheduler 的是一个 MapStatus 对象, MapStatus 对象管理了 ShuffleMapTask 的运算输出结果在 ShuffleBlockManager 里的相关存储信息,而非结果本身,这些存储位置信息将作为下一个 Stage 的任务的获取输入数据的依据
          1. shuffle 的结果 patition 数目由 ShuffleDependency 中的 Partitioner 对象来决定
          2. Spark 内核将提供一个可拔插的 shuffle 接口
      6. WordCount的例子以及解析
        1. 代码
          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))//对统计结果进行排序
        2. RDD构建流程



0 0