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

Spark中的shuffle过程详细

一、Spark中哪些算子会产生Shuffle

全局分组:reduceByKey,groupByKey

全局排序:sortBy,sortByKey

增大分区:repartition,coalese

groupByKey sortByKey sortBy reduceByKey repartition
coalesce(根据情况)  join / fullOuterJoin / leftOuterJoin / rightOuterJoin

二、Spark中有哪些shuffle分类

        Hash Based Shuffle (老的) Sort Based Shuffle 新的shuffle工具中包含Tungsten-Sort Based Shuffle

        1、Hash Based Shuffle

        没有排序,只有分区,每个Task按照ReduceTask个数生成【M*R】,简单数据量比较小,性能就比较高,但是:小文件非常多,数据量比较大性能非常差

2、Hash Based Shuffle 优化后,File  Consolidation机制

        没有排序,只有分区,每个Executor按照ReducTask个数生成多个文件:Executor*R

3、Sort Based Shuffle 目前是最新的

        分为两个

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

        Shuffle Read:类似与mr种的reduce端shuffle,但是Spark的Shuffle Read功能由算子决定,不同算子经过的过程不一样

        SortShuffleWrite:普通 Sort Shuffle Write

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

        BypassMergeSortShuffleWriter:

类似与序列化后的Hash Based Shuffle,先每个分区生成一个文件,最后合并为一个大文件,分区内部不排序,分区数小于200,并且没有map端的聚合操作,适用于数据量小的数据,不在内存中排序

        UnsafeShuffleWriter

        钨丝计划方案,使用UnSafe API操作序列化数据,使用压缩指针存储元数据,溢写合并使用fastMerge提升效率,Map端没有聚合操作、序列化方式需要支持重定位,Partition个数不能超过2^24-1个

        什么时候下使用ShuffleWriter

ShuffleWriter的实现方式

        BypassMergeSortShuffleWriter

        使用这种shuffle writer的条件是,没有map端的聚合操作,分区数小于参数:spark.shuffle.sort.bypassMergeThreshold,默认是200

        UnsafeShuffleWriter

        使用这种shuffle writer的条件是,序列化工具类支持对象的重定位,不需要在map端进行聚合操作,分区数不能大于:PackedRecordPointer.MAXIMUM_PARTITION_ID + 1

        SortShuffleWriter

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

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

        Reduce端的shuffle过程一定会经过合并排序、分组,不需要排序,依旧会给结果进行排序


http://www.kler.cn/a/386828.html

相关文章:

  • 记录使用documents4j来将word文件转化为pdf文件
  • WebAssembly在现代Web开发中的应用
  • 排序算法 - 冒泡
  • 3D绘制动态爱心Matlab
  • 重构代码之内联临时变量
  • 动态规划 —— 子数组系列-最大子数组和
  • 使用AutoMySQLBackup 数据库自动备份
  • 【LeetCode】【算法】146. LRU缓存
  • CSP/信奥赛C++刷题训练:经典信奥数学例题(3):洛谷P1075 :[NOIP2012 普及组] 质因数分解
  • JAVA_冒泡排序
  • 数字身份发展趋势前瞻:身份韧性与安全
  • c语言其实很简单----【数组】
  • Spring WebFlux 核心原理(2-3)
  • Nginx简易配置将内网网站ssh转发到外网
  • 【计网不挂科】计算机网络期末考试(综合)——【选择题&填空题&判断题&简述题】完整题库
  • ArcGIS Pro SDK (二十二)订阅和搜索
  • 算法【Java】—— 动态规划之路径问题
  • 在 PostgreSQL 中,重建索引可以通过 `REINDEX` 命令来完成
  • 特殊符号大全
  • 工作:三菱PLC R系列的程序、子程序及中断程序
  • 电子取证小白教程
  • Python OpenCV形态学处理和图像梯度
  • nuiapp vue3 uni-ui uni.uploadFile 图片上传
  • I.MX6U 裸机开发5.准备C环境并用C语言控制LED
  • 数据血缘追踪是如何在ETL过程中发挥作用?
  • 23-Update by Query Reindex