• 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过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。

  • 相关阅读:
    640. 求解方程
    C/C++飞机票订购系统
    【Redis】Redis最佳实践:键值设计
    11.18-创建视图 11.19-SELECT语法结构 11.20-简单查询 11.21-连接查询 11.22-聚集函数 11.23-授权语句
    2022运营版开发代驾小程序/仿滴滴代驾小程序/打车/网约车/顺风车/快车/代驾/货运/Thinkphp+Uniapp开源版
    SpringMvc学习笔记
    JSON转SQL小工具源码分享
    Python中最强大的错误重试库
    【不三不四的脑洞】一个梦所引发关于排序算法的思考
    12.ElasticSearch系列之分布式特性及分布式搜索机制(一)
  • 原文地址:https://blog.csdn.net/zjjcchina/article/details/126119180