第27课:彻底解密Spark Shuffle令人费解的6大经典问题(课程内容全球独家)
Shuffle的第一大问题:什么时候进行shuffle的fetch操作?Shuffle具体在什么时候开始运行(是在一边Mapper的map操作同时进行
reduce端的shuffle的reduce操作吗)? 错误的观点:Spark是一遍Mapper一遍Shuffle,而Hadoop的MapReduce是先完成Mapper然后才进行Reducer的shuffle。 事实是:Spark一定是先完成Mapper端所有的Tasks,才会进行Reducer端的shuffle过程。 原因:Spark的job是按照stage线性执行的,前面的stage必须执行完才能够执行后面的Reducer的shuffle过程。 补充说明:Spark的shuffle是边拉取数据边进行Aggregate操作的。其实与Hadoop MapReduce相比起优势确实在速度上。但是也会导致一 些算法不好实现,例如求平均值等。(但是spark提供了一些内置函数)
Shuffle的第二大问题:shuffle fetch过来的数据到底放到了哪里?抓过来的数据首先肯定是放在reducer端的内存缓冲区中的,spark曾经有版本要求只能放在内存缓存中,数据结构类似于HashMap (AppendOnlyMap),显然特别消耗内存和极易出现OOM,同时也从reducer端极大的限制了spark集群的规模,现在的实现都是内存+磁盘 的方式(数据结构使用ExternalAppendOnlyMap),当然大家也可以通过s