乐趣区

关于spark:Spark-Task的执行过程一

后面讲了 Task 的创立、提交,以及对 Task 进行资源调度与调配,对于 Task 的实现细节一笔带过,所以这篇开始解说 Task 的执行过程。Task 又分为 ShuffleMapTask 和 ResultTask,咱们离开来讲。

ShuffleMapTask

ShuffleMapTask 进行写入的时候,有三种形式,别离是 UnsafeShuffleWriter、BypassMergeSortShuffleWriter、SortShuffleWriter。而最终应用哪个 ShuffleWriter 是取决于 RDD 依赖的 ShuffleHandle。
如果不须要 map 端进行合并且分区数小于等于 200,则 ShuffleHandle 为 BypassMergeSortShuffleHandle,最终的 ShuffleWriter 是 BypassMergeSortShuffleWriter。
如果不须要 map 端进行合并且分区数 <16777216、Serializer 反对 relocation 则 ShuffleHandle 为 SerializedShuffleHandle,最终的 ShuffleWriter 是 UnsafeShuffleWriter。
其余状况下,ShuffleHandle 为 BaseShuffleHandle,最终的 ShuffleWriter 是 SortShuffleWriter。

上面就先介绍 BypassMergeSortShuffleWriter 的写入过程,其余两个留前面讲。

BypassMergeSortShuffleWriter

咱们假如有 2 个分区,这样最终就有 2 个 Task,假如每个 Task 发给一个 Executor,上面看看 Executor 是怎么解决每个 Task 中 RDD 计算的数据。

首先 Executor 会依据分区的数量,创立等同数量的 DiskBlockObjectWriter。因为咱们的分区数是 2,所以 DiskBlockObjectWriter 是个数也是 2,每一个 DiskBlockObjectWriter 解决一个分区的数据,最初把 map 工作的输入写入磁盘。每个 DiskBlockObjectWriter 都维持着 BlockId 以及他的文件 File。

DiskBlockObjectWriter 筹备好后,开始迭代 RDD 计算的后果 records,假如第一条是 (a,1),应用分区计算器算出 a 这个 key 的分区,比方右边的分区 0,而后让右边的 DiskBlockObjectWriter 把(a,1) 写入到 Shuffle 文件的输入流中。同理,(b,1),(c,1),(d,1)也假如都在右边,(e,1),(f,1),(g,1),(h,1)依据 key 的分区计算,都在左边。

records 后果都解决完后,DiskBlockObjectWriter 就会把输入流中的数据写入到磁盘,文件的信息、索引的地位,都交给 FileSegment 来解决。

此时曾经生成了两个长期的 Shuffle 文件,为了缩小网络的 IO,这些临时文件须要进行合并。所以会把这两个长期的 Shuffle 文件内容,写入到 Shuffle 数据文件,并记录每个文件的长度(比方 4,4)。

写入到 Shuffle 数据文件后,临时文件就没有用了,就把他们都删除。

此时还要一个索引文件,因为咱们把两个文件的内容合并了,须要晓得原先每个文件里有哪些货色,下面咱们不是保留了文件的长度(4,4),所以依据这个失去了索引的值(0,4,8)。这样咱们从文件里拿到对应的数据,就能够通过索引了。

ResultTask

如果一个 RDD 的数据,最终发到 3 个 Executor,每个 Executor 都只解决一个 Task,那最初会有 3 个 dataFile 文件。

最初执行 ResultTask 的时候,就会从这些 dataFile 文件拿出数据,调用函数进行最终的解决,失去最初的后果。

退出移动版