ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spark Shuffle

2021-03-10 23:58:31  阅读:178  来源: 互联网

标签:文件 Shuffle map reduce 50 拉取 shuffle Spark


Spark Shuffle

shuffle的分区数怎么确定?

  • Map端由初始读取的数据源和算子计算后决定,比如:kafka的分区数
  • Reduce端由spark.default.parallelism决定,如果没有配置,由上一个map的分区数一致

Reduce怎么拉取数据?

先上图:

在这里插入图片描述

  • BlockManager 是传输数据
  • MapoutputTracker是通讯

流程:

  • MapOutputTrackerWorker将自己的map端输出的文件位置信息通过包装为MapStatus发送给Driver端的MapoutputTrackerMaster
  • Reduce端的在拉取数据前,先会在本地找,找不到向MapoutTrackerMaster获取
  • 通过BlockManager的BlockTransforService传输数据

每次默认5个线程,拉取48M

两种分发文件的方式(即shuffle的方式)

HashShuffle

在这里插入图片描述

顾名思义:

它是利用hash算法将相同的key的数据分发到同一个文件

shuffle read的拉取过程是一边拉取一边进行聚合的

产生的文件数

由reduce的任务数 * map端的任务数

缺陷

会产生大量的文件,增加磁盘IO的开销,如果reduce端100个,map 50个,那产生了5000个文件

优化后的HashShuffle

在这里插入图片描述

开启合并文件的参数:

spark.shuffle. consolidateFiles

它允许在第一次并行执行的任务写入的文件上加上一个shuffleGroupFile的概念来合并文件,后面的每一次执行的任务都可以复用相同的文件。当然也是要遵循hash的原则

产生的文件数

excutor*excutor core * reduce tasks(即相同的excuto上map端输出的对应的reduce文件会复用)

以上两种方式已经是过去时了,现在的版本不推荐使用,默认是sortbaseshuffle.

如果reduce端100个,map 50个,每个executor单核,10个executor 每个执行 5个任务,

产生的文件数1000个文件

SortShuffle

在这里插入图片描述

流程:

  • 首先根据算子选择数据结构,比如:聚合使用map,join使用array
  • 然后向数据结构中写入数据,当达到一定的阈值的时候,溢写到磁盘
  • 排好序后溢写磁盘的过程中使用Java的BufferOutputStream进行缓冲写入文件
  • 合并每一次溢写的文件
  • 再合并同一个任务的所有文件(这里有没有排序不知道,也就是说可能是不保证全局排序,只是每一个文件的排序而已
  • 并且写一个索引文件告诉reduce从哪里开始是你要拉取数据

文件数

Map端Tasks

所以这种模式下就一个任务一个文件,即就是任务数。

如果reduce端100个,map 50个,每个executor单核,10个executor 每个执行 5个任务,

50个

从 5000个 到1000个 再到 50个,整整提高90%的效率

跟hash shuffle的合并模式比较,主要就是此种模式不受excutor core的影响

特殊模式(bypass)

以上是普通模式,还有一种省略了中排序的模式,分发文件时使用Hash,最后来合并文件。

文件数也是一样的,但是它不能使用在聚合算子上。

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

  • shuffle map task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值。

  • 不是聚合类的shuffle算子。

BlockManager 存储管理

在这里插入图片描述

  • BlockManaerMaster对子节点的元数据管理

  • BlockManagerWorker发生了数据的增删改就会通知BlockMangerMaster

  • 使用BlockTransferService传输数据

标签:文件,Shuffle,map,reduce,50,拉取,shuffle,Spark
来源: https://blog.csdn.net/HanJuly9569/article/details/114649850

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有