1.复习:MR的shuffle
在MR中,shuffle分为两个阶段,分别为shuffle write 和 shuffle read
在shuffle writer阶段,会有 写数据-聚合-排序-写磁盘(产生磁盘小文件)-归并排序,合并成大文件
在shuffle read阶段,拉取数据写入内存-排序-溢写-合并分组
在MR中,排序的是强制的,为了后续的分组
2.Spark shuffle:分为两种,HashShuffle和SortShuffle
2.1HashShuffle:
特别标注:
1.磁盘核数问题:
未启用合并机制的时候:
产生的磁盘小文件个数:M(map task num)*R(reduce task num)
启用合并机制之后:
产生磁盘小文件的个数:C(核数:core)*R(reduce)
2.磁盘小文件过多带来的问题:
write 阶段需要创建大量的写文件打的对象
read阶段就要进行多次的网络通信
read阶段要创建大量的读文件的对象,由此会造成JVM内存不足
3.CR MR 哪个大?(C M 哪个大)
一般一个Core分配2到3个task。
例如:有三个核(A B C),每个核上有3个task。
因为性能差异问题,A B性能好,3 个task都执行完了。而C 性能比较差,只执行一个task还没执行完成, 这时,A B会拉取C上没有执行的task帮助它执行,提高效率
2.2.sortShuffle
1.sortshuffle的运行机制(两种):
- 普通运行机制
- bypass运行机制(合并机制)
普通运行机制:
补充知识:
1.spark只是一个软件框架,executor是一个JVM进程,spark不能严格控制JVM的资源情况
当5M内存中存满时,如5.01M。有一个监控对象,一直监控这块内存数据结构的情况,一旦满了,它会向EXecutor再去申请资源:(5.01*2 - 5)M的资源,如果Executor的资源充足,会给出。
此时,如果没有申请到资源,就会进行溢写。申请到了,内存充足,不进行溢写。
2.为什么要有这么监控对象:
因为spark无法控制,只能通过一个线程进行监控
3.产生磁盘小文件的数目:
2*M :一个Map task 产生两个(索引文件和磁盘的大文件)
4.小文件合并的实际运行:
当第二个小文件进行溢写时,已经开始和第一个小文件进行合并操作了。不是等全部执行完毕才进行合并
bypass机制:
bypass运行机制的触发条件如下:
shuffle reduce task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值。(默认值:200)
2.两种运行机制的区别:bypass比普通机制少一个shuffle的排序
2.3: shuffle过程中,磁盘小文件的寻址问题
文字说明:
当map端执行完毕后,会把执行的结果信息(磁盘小文件的位置,最终执行的状态等)封装到mapstatus中,然后会调用MapOutputTeackWorker向MapOutputTeackMaster上,此时Master上有所有磁盘小文件的信息,其他task想用这些数据,调用自身的MapOutputTeackWorker向主节点申请位置信息即可