第27课:彻底解密Spark Shuffle令人费解的6大经典问题(课程内容全球独家)

来源:互联网 发布:华西期货软件下载 编辑:程序博客网 时间:2024/06/04 03:55

第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),当然大家也可以通过spark.shuffle.spill=false来设置只能使用内存,使用
ExternalAppendOnlyMap的方式时候如果内存使用达到一定临界值后会首先尝试在内存中扩大ExternalAppendOnlyMap(内部有实现算法
),如果不能扩容的话才会spill到磁盘


Shuffle的第三大问题:shuffle的数据在mapper端如何存储,在reducer端又是如何知道数据具体在哪里的?

 在spark的实现中每一个stage(里面是ShuffleMapTask)中Task在stage的最后一个RDD上一定会注册给Driver上的
MapoutputTrackerMaster,Mapper通过和MapOutputTrackerMaster来汇报ShuffleMapTask具体数据的位置(具体的输出文件及内容和
Reduce有关的。Reducer是向Driver中的MapOutputTrackerMaster请求数据的元数据,然后和Mapper所在的Executor进行通信。


Shuffle的第四大问题:仅仅从 HashShuffle 的角度来讲,我们在 Shuffle 的时候到底可以产生多少 Mapper 端的中间文件? 

 

例如说有M个Mapper、R个Reducer 和 C个Core,那么 HashShuffle 可以产生多少个 Mapper 的中间文件?如果回答是M*R个临时中间文
件的话就是有问题的,我们从另外一个角度来说明一下,例如在实际生产环境中有Excutors(例如100个),每个Excutor上有C个

cores(例如10个),同时有R个Reducer。在Hash Shuffle情况下会产生多少Mapper端的中间文件呢?是否可以回答E*C*R个临时文件呢?


答案是:

在没有Consolidation机制的情况下第一个问题会产生M*R个中间文件,第二个问题的答案是实际的Task的个数*R

        在有Consolidation机制的情况下,第一个问题会产生C*R个文件吗?不一定。这取决于一个越来越重要的配置参数 spark.task.cpus(该参数决定了运行spark的每个task需要多少个Cores,默认情况是1个),假如Spark.task.cpus为T,那么第一个问题的答案是C/T*R,第二个问题的答案是E*C/T*R
      如何理解Consolidation机制,你可以认为是文件池的复用。


  

Shuffle的第5大问题:Spark中Sorted-Based Shuffle 数据结果默认是排序的吗?Sorted-Based Shuffle 采用了什么的排序算法?这个排序算法的好处是什么?

Spark Sorted-Based Shuffle 在 Mapper 端是排序的,包括 partition 的排序和每个 partition 内部元素的排序!但在 Reducer 端是没有进行排序,所以 Job 的结果默认不是排序的。Sorted-Based Shuffle 采用了 Tim-Sort 排序算法,好处是可以极为高效的使用 Mapper 端的排序成果全局排序。

  
Shuffle的第6大问题::Spark Tungsten-Sorted Shuffle 在 Mapper 中会对内部元素进行排序吗?Tungsten-Sorted Shuffle不适用于什么情况?说出具体的原因。

Tungsten-Sorted Shuffle 在 Mapper 中不会对内部元素进行排序 (它只会对Partition进行排序),原因是它自己管理的二进制序列化后的数据,问题来啦:数据是进入 Buffer 时或者是进入磁盘的时才进行排序呢?答案是数据的排序是发生在 Buffer 要满了 spill 到磁盘时才进行排序的。所以 Tungsten-Sorted Shuffle 它对内部不会进行排序
Tungsten-Sorted Shuffle 什么时候会退化成为 Sorted-Based Shuffle?它是在程序有 Aggregrate 操作的时候;或者是 Mapper 端输出的 partition 大于 16777216;或者是一条 Record 大于128M的时候,原因也是因为它自己管理的二进制序列化后的数据以及数组指针管理范围。

0 0
原创粉丝点击