Spark的Shuffle过程 原

Shuffle过程图

 

 

 

 

 

 

Shuffle过程分为shuffle write和shuffle read。

由父RDD(比如join就是join两边的RDD)根据分区数进行划分,并写内存或磁盘,构成write过程。由子RDD(join之后生成的RDD,分区数由spark.default.parallelism控制)从父RDD那里拉取数据到自己的分区构成read过程。

write就是Map细分的过程,而read就是Reduce合并的过程。Spark里也存在combine过程,就是在父RDD的write的时候,在本地做一次合并,相当于一次Reduce,可以减少read过程读取的数据量,减少网络IO。Shuffle过程中,需保证同一个key落在同一个partion里就可以了。

Shuffle又分为hash shuffle和sort based shuffle,后者是对前者的改进,在spark的后期版本里,后者是默认选择。

Hash shuffle与Sort based shuffle的区别在于Write过程不同,其Read过程完全一样。在shuffle中,如果父RDD的分区数为m,子RDD的分区数为n,那么Hash Shuffle在write过程中每个分区会写n个文件,每个文件对应了子RDD的一个分区,这样一共为 m*n 个文件。而Sort based shuffle则与Hadoop MR的shuffle很像,父RDD的每个分区只会生成一个文件(文件中一个分区的数据是连续的),同时会生成该文件的索引文件,索引文件可以明确指出子RDD分区所需要的数据在哪。

这样Sort based shuffle的好处就在于它比Hash shuffle生成了更少的文件,shuffle过程中磁盘上不会累积大量数据文件,同时在文件生成过程中也不会占用更多内存缓冲空间

update: 2017-03-25 增加了两种shuffle的区别说明

欢迎阅读转载,转载请注明出处:https://my.oschina.net/u/2539801/blog/758389

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章