Spark技术内幕:Shuffle Map Task运算结果的处理

Shuffle Map Task运算结果的处理

这个结果的处理,分为两部分,一个是在Executor端是如何直接处理Task的结果的;还有就是Driver端,如果在接到Task运行结束的消息时,如何对Shuffle Write的结果进行处理,从而在调度下游的Task时,下游的Task可以得到其需要的数据。

Executor端的处理

在解析BasicShuffle Writer时,我们知道ShuffleMap Task在Executor上运行时,最终会调用org.apache.spark.scheduler.ShuffleMapTask的runTask:

 override def runTask(context: TaskContext): MapStatus = {
   // 反序列化广播变量taskBinary得到RDD
   val ser = SparkEnv.get.closureSerializer.newInstance()
   val (rdd, dep) = ser.deserialize[(RDD[_], ShuffleDependency[_, _, _])](
     ByteBuffer.wrap(taskBinary.value),Thread.currentThread.getContextClassLoader)
//省略一些非核心代码
val manager =SparkEnv.get.shuffleManager //获得Shuffle Manager
    //获得Shuffle Writer
    writer= manager.getWriter[Any, Any](dep.shuffleHandle, partitionId, context)
//首先调用rdd .iterator,如果该RDD已经cache了或者checkpoint了,那么直接读取
//结果,否则开始计算计算的结果将调用Shuffle Writer写入本地文件系统
writer.write(rdd.iterator(partition,context).asInstanceOf[Iterator[_ <: Product2[Any, Any]]])
// 返回数据的元数据信息,包括location和size
returnwriter.stop(success = true).get

那么这个结果最终是如何处理的呢?特别是下游的Task如何获取这些Shuffle的数据呢?还要从Task是如何开始执行开始讲起。在Worker上接收Task执行命令的是org.apache.spark.executor.CoarseGrainedExecutorBackend。它在接收到LaunchTask的命令后,通过在Driver创建SparkContext时已经创建的org.apache.spark.executor.Executor的实例的launchTask,启动Task: 

</

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值