spark的reduce过程究竟做了什么呢?我们可以看一下:
先拉取数据,在聚合,最后会调上一章讲map操作时的insertAll方法即缓存结果的方法。
如何做reduce聚合没啥好说的,我们看下他是怎么读取中间计算结果的
1.从BlockManage处获取map任务的状态信息
首先会试图获取任务的状态信息,以确认当前从哪里读取数据
我们看下是从具体的获取信息过程:
可以看到有以下关键点:
- reduce的上游任务节点状态一开始是不确定的, 如果没有需要自己根据shuffleId去拉取过来。
- 取状态信息时,不是马上就去取,而是放入一个fetching队列里取,避免同时发送过多的零碎状态信息请求。
注意这个时候还没有真正拿到数据,只是获取了数据的情况。
2.使用splitLocalRemoteBlocks方法 ,按照中间结果所在节点划分各个Block
获取了上游任务节点该map数据的状态,