首页 理论教育 深入探析TaskRunner

深入探析TaskRunner

时间:2023-06-29 理论教育 版权反馈
【摘要】:TaskRunner的定义代码如下。TaskRunner的构造函数中有execBackend、taskId、attemptNumber、taskName和serial-izedTask共5个参数。其中execBackend作为和CoarseGrainedSchedulerBackend通信的使者传入到TaskRunner中,在任务计算状态发生变化时,调用execBackend的statusUpdate方法向CoarseGrainedSchedulerBackend报告。传入taskId是为了使用TaskMemoryManager管理该Task。大家知道,在线程池中启动Runnable任务会自动调用Runnable的run方法,TaskRunner作为一个Runnable接口的实现类,启动时会自动调用其run方法。·反序列化出Task和相关依赖Jar包。·返回Task运行结果。

深入探析TaskRunner

TaskRunner位于Executor中,继承自Runnable接口,代表一个可执行的任务,Driver端下发的任务最终都要在Executor中封装成TaskRunner,在TaskRunner的run方法中,将会进行任务的解析并调用Task接口的run方法进行计算计算。TaskRunner的定义代码如下。

TaskRunner的构造函数中有execBackend、taskId、attemptNumber、taskName和serial-izedTask共5个参数。其中execBackend作为和CoarseGrainedSchedulerBackend通信使者传入到TaskRunner中,在任务计算状态发生变化时,调用execBackend的statusUpdate方法向CoarseGrainedSchedulerBackend报告。传入taskId是为了使用TaskMemoryManager管理该Task。attemptNumber代表任务尝试执行的次数,serializedTask是序列化的任务,序列化的任务通过序列化工具反序列化得到任务对象。

那么,在TaskRunner中是如何运行任务的呢?大家知道,在线程池中启动Runnable任务会自动调用Runnable的run方法,TaskRunner作为一个Runnable接口的实现类,启动时会自动调用其run方法。run方法中主要完成以下任务。

·调用ExecutorBackend的statusUpdate方法向SchedulerBackend发送任务状态更新消息。

·反序列化出Task和相关依赖Jar包。(www.xing528.com)

·调用Task上的run方法运行任务。

·返回Task运行结果。

Task是一个接口,ResultTask和ShffleMapTask是它的两种实现。Task接口中提供了run方法,用于运行任务。在TaskRunner的run方法中,会通过反序列化器反序列化出Task并调用Task上的run方法运行任务,这里怎么知道是ResultTask还是ShffleMapTask呢?其实不管是ResultTask还是ShffleMapTask都一视同仁,因为ResultTask和ShffleMapTask都实现了Task接口,都有run方法。这正是面向接口编程带来的最大的好处,即灵活且最大限度地复用代码。

Task将运行结果分为3种情况来处理,第一种情况是resultSize大于maxResultSize,这种情况下构建IndirectTaskResult对象,并返回该IndirectTaskResult对象,IndirectTaskResult对象中包含结果所在的BlockId,在SchedulerBackend中可以通过BlockManager获得该Block-Id对应的结果数据,这里的maxResultSize默认为1 GB;第二种情况是resultSize大于Akka帧的大小,这种情况下也是构建IndirectTaskResult对象,并返回该IndirectTaskResult对象,Akka帧的大小为128 MB;第三种情况是直接返回DirectTaskResult,这是在resultSize小于Akka帧大小的情况下采取的默认返回方式。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈