入:HDFS读数据:partiton=task split
出:
map端最后一个rdd的partiton数作为ResultStage的partition
reduceByKey(func, X) X就是ResultStage的partition
ShuffleManager
val shortShuffleMgrNames = Map(
"hash" -> "org.apache.spark.shuffle.hash.HashShuffleManager", ## 1.2版本之前默认使用,2版本之后就没有hash了。
"sort" -> "org.apache.spark.shuffle.sort.SortShuffleManager",
"tungsten-sort" -> "org.apache.spark.shuffle.sort.SortShuffleManager")
每一个maptask的都会生成N个reducetask的文件
对相同的key执行hash算法,从而将相同的key都写入到一个磁盘文件中,而每一个磁盘文件都只属于下游stage的一个task。在将数据写入磁盘之前,会先将数据写入到内存缓冲,当内存缓冲填满之后,才会溢写到磁盘文件中。但是这种策略的不足在于,下游有几个task,上游的每一个task都就都需要创建几个临时文件,每个文件中只存储key取hash之后相同的数据,导致了当下游的task任务过多的时候,上游会堆积大量的小文件。
小文件数 = M * R
Bucket:Core * R
环境准备:将版本改到1.6.0,并 set spark.shuffle.manager = hash;
4*2
val dataRDD = sc.textFile("file:///E:\\ruozeinput.txt",4)
dataRDD.flatMap(_.split("\t")).map((_,1)).reduceByKey(_ + _,2).foreach(println)
5*3
val dataRDD = sc.textFile("file:///E:\\ruozeinput.txt",5)
dataRDD.flatMap(_.split("\t")).map((_,1)).reduceByKey(_ + _,3).foreach(println)