本文只是结合源码对spark的map和reduce过程做简单的总结,不是特别深入。主要是《深入理解Spark__核心思想与源码分析》一书中的内容和自己的一些理解。
1.Shuffle
不管是hadoop的MapReduce还是spark的map-reduce过程,核心过程都叫做shuffle,MapReduce的shuffle过程,要对每个分区的数据进行排序,然后merge,完成后输出到下游的reduce进行进一步的操作,spark的shuffle过程类似,但是又有一些不同。
Spark的shuffle过程发展主要分成了三个阶段:第一阶段,每个map阶段的每个分区的数据都要生成N个小文件,分别对应下游的N个reducer,或者说是对应下游reducer要处理的N个分区,这样的话就需要生成好多个小文件,浪费资源和计算性能;在第二阶段,每个map分区可能需要k个core来处理,那么就讲每个core对应的map分区数据放到同一个文件中,这个在一定程度上是减少了文件数量;第三阶段就讲map阶段每个分区的数据先进行排序,和分区划分到一个文件中,也就是每个分区只产生一个文件,供reduce来读取,这里的分区是逻辑上的分区,并不是实际物理上的分区,并且在map的阶段也可以对数据进行聚合和排序(聚合和排序不是必须的,有些算子是不需要聚合排序了)。
这里的过程说的相对简单,有兴趣的可以自己深入了解。
2. Map端计算结果缓存
Map计算只是对数的第一步处理,处理结果要缓存起来,以便后面的reducer去读取数据。在整个数据处理的过程中,如果数据量较少,每多一步对数据的处理,就会增加复杂度,反过来数据量较大的时候,如果能够对数据按照一定的方式预处理,那么就反而会较少整体的