当前位置: 首页 > news >正文

Spark中的shuffle

Shuffle的本质基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】的问题。

1、Spark的Shuffle设计

Spark Shuffle过程也叫作宽依赖过程,Spark不完全依赖于内存计算,面临以上问题时,也需要Shuffle过程。

2、Spark中哪些算子会产生Shuffle?

只要这个算子包含以下四个功能之一:必须经过Shuffle

        进行join:join、fullOuterJoin、 leftOuterJoin 、rightOuterJoin
        大数据量全局分组:reduceByKey、groupByKey
        大数据量全局排序:sortBy、sortByKey
        大数据量增大分区:repartition、coalesce 

 3、Spark中有哪些shuffle【分类的】? 

Spark 0.8及以前 Hash Based Shuffle
Spark 0.8.1 为 Hash Based Shuffle 引入 File Consolidation 机制
Spark 1.1 引入 Sort Based Shuffle ,但默认仍为 Hash Based Shuffle
Spark 1.2 默认的 Shuffle 方式改为 Sort Based Shuffle
Spark 1.4 引入 Tungsten-Sort Based Shuffle 直接使用堆外内存和新的内存管理模型,节省了内存空间和大量的gc,提升了性能
Spark 1.6 Tungsten-sort 并入 Sort Based Shuffle
Spark 2.0 Hash Based Shuffle 退出历史舞台

1)Hash Based Shuffle

特点:没有排序,只分区,每个Task按照ReduceTask个数生成多个文件【M * R】

优点:简单,数据量比较小,性能就比较高

缺点:小文件非常多,数据量比较大性能非常差

2) Hash Based Shuffle 【优化后的,File Consolidation机制 

3) Sort Based Shuffle [目前最新的] 

 Shuffle Write + Shuffle Read

Shuffle Write:类似于MR中的Map端Shuffle,但是Spark的 Shuffle Write 有3种,会根据情况自动判断选择哪种Shuffle Write

Shuffle Read:类似于MR中的Reduce端Shuffle,但是 Spark的 Shuffle Read 功能由算子来决定,不同算子经过的过程不一样的。

MR Shuffle可以参考MapReduce 的 Shuffle 过程-CSDN博客

4、Spark 2以后的Shuffle Write判断机制:

第一种:SortShuffleWriter:普通Sort Shuffle Write机制

排序,生成一个整体基于分区和分区内部有序的文件和一个索引文件
大多数场景:数据量比较大场景  与MR的Map端Shuffle基本一致
特点:有排序,先生成多个有序小文件,再生成整体有序大文件,每个Task生成2个文件,数据文件和索引文件
Sort Shuffle Write过程与MapReduce的Map端shuffle基本一致

第二种:BypassMergeSortShuffleWriter 

类似于优化后的Hash Based Shuffle,先为每个分区生成一个文件,最后合并为一个大文件,分区内部不排序
条件:分区数小于200,并且Map端没有聚合操作
场景:数据量小

跟第一个相比,处理的数据量小,处理的分区数小于200 ,不在内存中排序。

第三种:UnsafeShuffleWriter 

钨丝计划方案,使用UnSafe API操作序列化数据,使用压缩指针存储元数据,溢写合并使用fastMerge提升效率

条件:Map端没有聚合操作、序列化方式需要支持重定位,Partition个数不能超过2^24-1个

在什么情况下使用什么ShuffleWriter 呢?

ShuffleWriter的实现方式有三种:

BypassMergeSortShuffleWriter

使用这种shuffle writer的条件是:

(1) 没有map端的聚合操作
(2) 分区数小于参数:spark.shuffle.sort.bypassMergeThreshold,默认是200

UnsafeShuffleWriter

使用这种shuffle writer的条件是:

(1) 序列化工具类支持对象的重定位
(2) 不需要在map端进行聚合操作
(3) 分区数不能大于:PackedRecordPointer.MAXIMUM_PARTITION_ID + 1

SortShuffleWriter

若以上两种shuffle writer都不能选择,则使用该shuffle writer类。
这也是相对比较常用的一种shuffle writer。

5、 Shuffle Read:类似于MapReduce中的Reduce端shuffle

MR:Reduce端的shuffle过程一定会经过合并排序、分组
需求:统计每个单词出现的次数,不需要排序,依旧会给结果进行排序


Spark:Shuffle Read具体的功能由算子来决定,不同的算子在经过shuffle时功能不一样
reduceByKey:Shuffle Read:只分组聚合,不排序
sortByKey:Shuffle Read:只排序,不分组
repartition:Shuffle Read:不排序,不分组

http://www.lryc.cn/news/481272.html

相关文章:

  • 网络安全SQL初步注入2
  • 使用Go语言编写一个简单的NTP服务器
  • 注意力机制篇 | YOLO11改进 | 即插即用的高效多尺度注意力模块EMA
  • 昇思大模型平台打卡体验活动:项目3基于MindSpore的GPT2文本摘要
  • web——[GXYCTF2019]Ping Ping Ping1——过滤和绕过
  • 婚礼纪 9.5.57 | 解锁plus权益的全能结婚助手,一键生成结婚请柬
  • M1M2 MAC安装windows11 虚拟机的全过程
  • 监控架构-Prometheus-普罗米修斯
  • Kylin Server V10 下自动安装并配置Kafka
  • windows环境下cmd窗口打开就进入到对应目录,一般人都不知道~
  • 企微SCRM价格解析及其性价比分析
  • 【SpringMVC】记录一次Bug——mvc:resources设置静态资源不过滤导致WEB-INF下的资源无法访问
  • 【React】React 生命周期完全指南
  • 【NLP】使用 SpaCy、ollama 创建用于命名实体识别的合成数据集
  • 【C++练习】二进制到十进制的转换器
  • Vue功能菜单的异步加载、动态渲染
  • 云技术基础学习(一)
  • 【优选算法篇】微位至简,数之恢宏——解构 C++ 位运算中的理与美
  • MFC工控项目实例二十九主对话框调用子对话框设定参数值
  • Java | Leetcode Java题解之第546题移除盒子
  • 【前端】Svelte:响应性声明
  • PostgreSQL 性能优化全方位指南:深度提升数据库效率
  • Flutter鸿蒙next 使用 BLoC 模式进行状态管理详解
  • Gen-RecSys——一个通过生成和大规模语言模型发展起来的推荐系统
  • Android 重新定义一个广播修改系统时间,避免系统时间混乱
  • 第3章:角色扮演提示-Claude应用开发教程
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
  • 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
  • Git LFS
  • 基于Redis缓存机制实现高并发接口调试