第十一周 Spark性能优化的道与术-1
宽依赖和窄依赖
1 | 先看一下什么是窄依赖: |
1 | 下面来看图具体分析一个案例 |

1 | 最左侧是linesRDD,这个表示我们通过textFile读取文件中的数据之后获取的RDD |
Stage
1 | spark job是根据action算子触发的,遇到action算子就会起一个job |

1 | 为什么是从后往前呢?因为RDD之间是有血缘关系的,后面的RDD依赖前面的RDD,也就是说后面的RDD要等前面的RDD执行完,才会执行。 |
Spark Job的三种提交模式
1 | 1. 第一种,standalone模式,基于Spark自己的standalone集群。 |

1 | 左边是standalone模式,现在我们使用的提交方式,driver进程是在客户端机器中的,其实针对standalone模式而言,这个Driver进程也是可以运行在集群中的 |

Shuffle
1 | 在MapReduce框架中,Shuffle是连接Map和Reduce之间的桥梁,Map阶段通过shuffle读取数据并输出到对应的Reduce;而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中,往往伴随着大量的磁盘和网络I/O。所以shuffle性能的高低也直接决定了整个程序的性能高低。Spark也会有自己的shuffle实现过程。 |
未优化的Hash Based Shuffle
1 | 来看一个图,假设我们是在执行一个reduceByKey之类的操作,此时就会产生shuffle |

1 | 1:假设有1个节点,这个节点上有2个CPU,上面运行了4个ShuffleMapTask,这样的话其实同时只有2个ShuffleMapTask是并行执行的,因为一个cpu core同时只能执行一个ShuffleMapTask。 |
优化后的Hash Based Shuffle

1 | 看这个优化后的shuffle流程 |
Sort-Based Shuffle
1 | 引入Consolidation机制虽然在一定程度上减少了磁盘文件数量,但是不足以有效提高Shuffle的性能,这种情况只适合中小型数据规模的数据处理。 |
