Task原理和源码

本文深入探讨Spark Task的执行原理,从Executor的TaskRunner开始,详细阐述Task的运行流程,包括Task的准备、运行及不同类型的Task(ShuffleMapTask与ResultTask)的处理方式。同时,介绍了源码阅读的切入点,分析Task的反序列化、文件拉取、Task上下文以及ShuffleMapTask和ResultTask的内部机制,展示了如何根据ShuffleMapTask的输出进行数据拉取。
摘要由CSDN通过智能技术生成

一、Task原理

1、Executor接收到LaunchTask消息后,会在TaskRunner中运行一些准备操作,比如反序列化Task、通过网络拉取需要的文件或jar包等;

2、运行task的run方法或者说是runTask方法,这个方法内部最核心的就是调用RDD的iterator()方法,在这里,就会针对RDD的partition执行我们自定义的函数(算子)

3、接下来分两种,ShuffleMapTask和ResultTask

ShuffleMapTask:a、计算完partition数据后,实际上会使用ShuffleManager的ShuffleWriter,将数据写入对应的分区文件

                     b、所有操作完了,会发送一个MapStatus给DAGScheduler(DAGScheduler里面有一个MapOutputTracker),所有的MapStatus会发送给MapOutputTracker

ResultTask:主要是针对ShuffleMapTask的输出(RDD),来执行Shuffle等操作,包括我们自定义的算子和函数。可能会到MapOutputTracker去拉取需要的ShuffleMapTask输出。

二、源码阅读

从Executor中的TaskRunner开始入手。看run方法:

1、对序列化的task数据,进行反序列化

val (taskFiles, taskJars, taskBytes) = Task.deserializeWithDependencies(serializedTask)/2

2、把文件、jar包拷贝过来

updateDependencies(taskFiles, taskJars)

3、通过正式的反序列化操作,将整个task的数据集反序列化

task = ser.deserialize[Task[Any]](taskBytes, Thread.currentThread.getContextClassLoader)

4、用task的run方法执行task,这个res就是对于ShuffleMapTask来说就是MapStatus,封装了ShuffleMapTask计算的数据的输出位置信息。后面的task就会去联系MapOutputTracker来获取上个ShuffleMapTask的位置拉取数据

val res = task.run(
  taskAttemptId = taskId,
  attemptNumber = attemptNumber,
  metricsSystem = env.metricsSystem)

看下run方法()

创建了一个TaskContextImpl,就是task的上下文,里面记录了task执行的一些全局性变量,比如task重试了几次,属于哪个stage,要处理Rdd哪个partition。然后调用抽象方法runTask(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值