Spark内核解析 (7)

在Receiver的方式中,Spark中的partition和kafka中的partition并不是相关的,所以如果我们加大每个topic的partition数量,仅仅是增加线程来处理由单一Receiver消费的主题。但是这并没有增加Spark在处理数据上的并行度。

基于DirectDStream:

Spark会创建跟Kafka partition一样多的RDD partition,并且会并行从Kafka中读取数据,所以在Kafka partition和RDD partition之间,有一个一对一的映射关系。

reduce端task个数的确定

Reduce端进行数据的聚合,一部分聚合算子可以手动指定reduce task的并行度,如果没有指定,则以map端的最后一个RDD的分区数作为其分区数,那么分区数就决定了reduce端的task的个数。

reduce端数据的读取

根据stage的划分我们知道,map端task和reduce端task不在相同的stage中,map task位于ShuffleMapStage,reduce task位于ResultStage,map task会先执行,那么后执行的reduce task如何知道从哪里去拉去map task落盘后的数据呢?

reduce端的数据拉取过程如下:

1、map task执行完毕后会将计算状态以及磁盘小文件位置等信息封装到mapStatue对象中,然后由本进程中的MapOutPutTrackerWorker对象将mapstatus对象发送给Driver进程的MapOutPutTrackerMaster对象;

2、在reduce task开始执行之前会先让本进程中的MapOutPutTrackerWorker向Driver进程中的MapOutPutTrackerMaster发动请求,请求磁盘小文件位置信息;

3、当所有的Map task执行完毕后,Driver进程中的MapOutPutTrackerMaster就掌握了所有的磁盘小文件的位置信息。此时MapOutPutTrackerMaster会告诉MapOutPutTrackerWorker磁盘小文件的位置信息;

4、完成之前的操作之后,由BlockerTransforService去Executor所在的节点拉数据,默认会启动五个子线程。每次拉取的数据量不能超过48M(reduce task每次最多拉取48M数据,将拉来的数据存储到Executor内存的20%内存中)。

HashShuffle解析

以下的讨论都假设每个Executor有一个CPU core。

1、未经优化的HashShuffleManager

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxwxz.html