Spark之Task内核解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34993631/article/details/87170066

首先献上粗粒度的Task执行流程。

  • 准备阶段

这个阶段发生在Executor刚接收到LauntchTask请求的时候。这时会将传过来的Task进行反序列化。然后通过网络拉取Task的支持文件比如说用到的jar包。

  • 执行阶段

这时会运行Task的Run方法(Task本来是一个Runnable)。这里就会调用RDD的iterator()方法。然后就会针对这个Task对应的分区去执行我们的算子操作。

这里就要说一下Task的种类,在最后一个Stage中的Task都是ResultTask,在前面的Stage的都是ShuffleMapTask。

对于ShuffleMapTask来说,在数据计算完成后会使用ShuffleManager的ShuffleWriter将数据写入对应的分区文件中。当所有操作完成之后会将MapStatus发送给DAGScheduler。具体来说就是将MapStatus汇报给MapOutPutTracker(这个组件属于Driver范围内)。

对于ResultMapTask来说,它主要就是针对ShuffleMapTask的输出执行shuffle等操作当然也包括我们自己定义的算子。同时这个Task也可能会去MapOutPutTracker中拉取需要的数据。如下图所示:

Task内核深入分析

准备阶段

主要的方法是updateDependencies,这里就是要准备好TaskRunner运行需要的资源。将序列化的Task数据进行反序列化,通过网络通信将需要的文件jar等资源拷贝过来。在此也用到了一些技巧。

  1. 由于有很多资源时共享的所以在访问时可能会出现多个Task(Task的本质是一个Runnable)的高并发的问题,这时Spark使用了线程同步synchronized来防止线程安全问题。
  2. 在拉取jar包的时候用到了数据库事务中的MVCC的思想。这里是指我们拉取的jar包它的时间是在我们规定的目标之前的。
  3. 多个Task之间实现数据共享也用到了共享变量。

核心方法

执行Task也就是执行Task中的run方法,这是一个Task中最核心的部分。具体步骤如下:

  • 首先创建一个TaskContext,也就是Task执行的上下文。里面包含了诸如Task重试了几次,这个Task属于哪一个Satge,Task要处理那个Partition等信息。
  • 以上面的TaskContext作为参数,然后执行runTask(context)方法。这里需要注意的是它是一个抽象方法真正执行有效方法的是它的实现类,比如说ShuffleMapTask或者是ResultTask。这里以ShuffleMapTask举例,这个类会首先将RDD中的元素进行Hash分桶划分为多个bucket,然后内部进行真实的数据处理最后返回一个MapStatus作为Task执行之后的数据的封装。
  • 这里开始说最核心的方法,RDD的Iterator()。这个方法中就是一个Task针对一个Partition中的数据执行算子最后返回结果的过程。

RDD的iterator()中有ComputeOrReadCheckPoint()方法,然后这个方法中会有compute()方法,compute()中又有f()方法。就是这个f()方法就是我们写的算子方法的封装。这里所说的封装言外之意就是还有其它的操作包含在其中。

  • 当这些方法一层一层的执行完的时候,这时返回的数据会通过ShuffleWriter,经过HashPartition进行分区之后,写入自己对应的分区bucket。而最后返回的MapStatus里面封装了这些写出数据的存储位置。其实这就是BlockManager(Spark底层管理物理资源的组件)。如果返回的MapStatus紧接着要为一个新的ShuffleMapTask所用的话,那么新的ShuffleMapTask就会联系Driver中的MapOutPutTracker来获取上一个ShuffleMapTask的数据输出位置,然后通过网络拉取数据。

后续处理

Task计算完成后会将返回的MapStatus进行序列化,然后通过网络发送给Driver。同时也会封装一些Task相关信息,这些信息会在SparkUI中展示出来。最后会执行execBackendStatusUpdate()(底层是ExecutorBackend的statusUpdate())来将Task置为完成状态,进而将Task从内存中移除。

最后感谢石杉老师!

猜你喜欢

转载自blog.csdn.net/qq_34993631/article/details/87170066