• spark内核SortShuffle解析_大数据培训


     普通SortShuffle

    在该模式下,数据会先写入一个数据结构,reduceByKey写入Map,一边通过Map局部聚合,一遍写入内存。Join算子写入ArrayList直接写入内存中。然后需要判断是否达到阈值,如果达到就会将内存数据结构的数据写入到磁盘,清空内存数据结构。

    图5-3 SortShuffle流程

    在溢写磁盘前,先根据key进行排序,排序过后的数据,会分批写入到磁盘文件中。默认批次为10000条,数据会以每批一万条写入到磁盘文件。写入磁盘文件通过缓冲区溢写的方式,每次溢写都会产生一个磁盘文件,也就是说一个Task过程会产生多个临时文件。

    最后在每个Task中,将所有的临时文件合并,这就是merge过程,此过程将所有临时文件读取出来,一次写入到最终文件。意味着一个Task的所有数据都在这一个文件中。同时单独写一份索引文件,标识下游各个Task的数据在文件中的索引,start offset和end offset。

    bypass SortShuffle

    bypass运行机制的触发条件如下:

    1)shuffle map task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值,默认为200。

    2)不是聚合类的shuffle算子(比如reduceByKey)。

    图5-4 bypassSortShuffle流程

    此时task会为每个reduce端的task都创建一个临时磁盘文件,并将数据按key进行hash然后根据key的hash值,将key写入对应的磁盘文件之中。当然,写入磁盘文件时也是先写入内存缓冲,缓冲写满之后再溢写到磁盘文件的。最后,同样会将所有临时磁盘文件都合并成一个磁盘文件,并创建一个单独的索引文件。

    该过程的磁盘写机制其实跟未经优化的HashShuffleManager是一模一样的,因为都要创建数量惊人的磁盘文件,只是在最后会做一个磁盘文件的合并而已。因此少量的最终磁盘文件,也让该机制相对未经优化的HashShuffleManager来说,shuffle read的性能会更好。

    而该机制与普通SortShuffleManager运行机制的不同在于:不会进行排序。也就是说,启用该机制的最大好处在于,shuffle write过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。

  • 相关阅读:
    PHP基础面试题
    什么是代理模式,用 Python 如何实现 Proxy(代理 或 Surrogate)对象结构型模式?
    <类与对象(上)>——《C++初阶》
    机器学习-决策树
    【饭谈】细嗦那些职场中喜欢用领导口气命令别人的同事
    字符设备驱动框架(字符设备基础一)
    471-82(647、5、92、143、148、19)
    JavaScript核心Web APIs
    LeetCode-2609. 最长平衡子字符串-双指针
    MySQL主从复制与读写分离
  • 原文地址:https://blog.csdn.net/zjjcchina/article/details/126119180