1、shuffle分类
spark的shuffle机制可以分为3类,分别是HashShuffleManager、SortShuffleManager、tungsten-sortShuffleManager(钨丝ShuffleManager),下面对着几种shuffle机制进行详细的介绍
2、HashShuffleManager
普通的HashShuffleManager
HashShuffleManager 是早期的Spark版(1.2之前)本中的默认的shuffle的机制,但是这种shuffle机制有很明显的缺陷,下面是hashShuffleManager的原理图
下面图中是有两个executor, 每个executor中有一个cpu core,所以每个executor中的并行度是1,在进行shuffle的过程,,map端shuffle的数据回先写到bucket缓存中(32kb),当达到一定的大小时,会溢写到磁盘上,每个Map task会为每个reduce task产生一份数据,所以map端一共产生的小文件是就是 map task 数* reduce task数
假设一共有100个map task 和 100 个reduce task, 那么产生的小文件个数时10000个小文件,这么多小文件带来很多问题:
(1)写磁盘的小文件多,IO多
(2)reduce 端读取数据时建立的 连接多
(3)占用内存多,频繁gc,gc时会对外停止工作, 还可能导致oom内存溢出
如果说一台机器是32核 双线程,那么它能够并行的map task的数量是64个,如果有1000个reduce task,那么所占用的内存就会有的64 * 100 * 32kb 是2个多G,非常占用内存
(4)在拉去数据时,可能会跨节点连接,跨节点连接可能会由于网络不稳定,连接中断,很耗时