[3.1.0]结合案例详解hash-shuffle原理

参考

中华石杉
详细探究spark shuffle的实现

场景

什么是shuffle?shuffle类算子有哪些?怎么具体的形象的理解shuffle过程?

分析

还是从wordcount程序说起。
简单起见,假设spark集群共由3台机器:1台driver node、2台worknode组成。现在要计算某个文件中各个单词出现的次数,假设这个文件里只包含 hello,spark , word这三种类型的单词。且作业map端并行度被设置为4-即作业被划分为 4 个 task执行;reduce端被设置为 2-即共有2个task 。代码如下:

val lines2 = sc.textFile("file:///home/pengyucheng/resource/hellospark.txt")  
lines2.flatMap(line => line.split(" ") ).map( word => (word,1) ).reduceByKey(_+_).collect

那么,wordcount程序的核心执行过程(个人认为其实就是shuffle)可以用下面的这张图来描述(画了我好久好久啊啊啊)

这里写图片描述

                               图解shuffle类算子:reduceByKey 
一、stage划分过程

1、action类算子 collect 触发job的生成
2、DAGScheduler 负责划分job为多个stage。划分的依据:如果发现有触发shuffle操作的算子(本例中的 reduceByKey),就将这个操作的前半部分,以及之前所有的RDD及transformation操作,划分为一个stage(stage 0); 将reduceByKey操作的后半部分,以及后面的直到action为止的所有RDD及transformation操作,划分为另一个stage(stage 1)

二、什么是shuffle

shuffle就是洗牌(原谅我),就是把分布在集群中各个节点上的同一个key(本例中的 hello)的values(1)集中到某一节点的一个excecutor关联的某一task中,形如:[key,Iterable[value]] - 这样,shuffle类算子(reduceByKey)就能对其进行相关的聚合类操作了[得到 (hello,9)]。

三、shuffle类算子有哪些

大致可以分为三类
- 对单个RDD重排,如sort、partitionBy;
- 对单个RDD基于key进行重组和reduce,如groupByKey、reduceByKey;
- 对两个RDD基于key进行join和重组,如join、cogroup

四、hash-shuffle原理

shuffle类算子reduceByKey,将作业划分为两个stage:父stage与子stage-父stage对应到MapReduce思想的map端,子stage对应到 reduce 端。父stage中的每个 task为子stage的每个task分别生成一份文件,共 生成 M*R 份文件(M=map端task数量、R=reduce端task数量)。需要注意的是:

1、map端 task在写入数据到磁盘文件之前,都会先写入到自己关联的内存缓冲中,内存缓冲满溢之后,再写到磁盘文件中; reduce端task在拉取(fetch)数据的时候,首先会放入自己关联的内存缓存中,内存缓存满了再写到磁盘中,然后用 HashMap进行 key与values的聚合 - 具体怎么聚合取决与我们自己定义的聚合方式(比如同key其value相加)!

2、map端每个task生成文件的时候遵守如下的规则:

  • 同一个key对应的values,一定是写入同一个文件中 :(hello,1)写进同一个文件;
  • 不同key对应的values,可能写入同一个文件:(spark,1)与(word,1)写入了同一个文件

总结

1、把上文结合wordcount描述的具体hash shuffle过程,抽象一下即可得到如下的一般hash shuffle过程:

这里写图片描述

2、同一个key对应的values,一定是写入同一个文件中;不同key对应的values,可能写入同一个文件

wireshark-win64-3.1.0rc0-318-gf69726f9.msi是Wireshark软件的一个版本,用于在Windows 64位操作系统上运行。Wireshark是一个流行的开源网络协议分析工具,它能够通过捕获网络数据包来帮助用户分析和诊断网络问题。 首先,要下载wireshark-win64-3.1.0rc0-318-gf69726f9.msi,你可以在Wireshark官方网站上找到该软件的下载页面。在那里,你可以找到适用于不同操作系统和体系结构的安装包。找到对应的版本,然后点击下载按钮。 开始下载后,你需要等待网页加载完毕并显示下载链接。点击下载链接后,会弹出文件保存对话框。选择一个合适的保存位置,然后点击"保存"按钮。 下载过程可能需要一些时间,具体取决于你的网络速度。一旦下载完成,可以在保存位置找到wireshark-win64-3.1.0rc0-318-gf69726f9.msi文件。双击该文件,便会启动安装程序。 在安装过程中,按照安装向导的指示逐步完成安装过程。你可以选择安装位置,也可以选择是否在桌面上创建快捷方式等选项。完成所有设置后,点击"安装"按钮。 安装过程可能需要一些时间,一旦安装完成,你就可以开始使用Wireshark软件了。打开Wireshark,它会显示一个网络数据包捕获界面,你可以在那里开始进行网络数据包分析。 总结来说,下载wireshark-win64-3.1.0rc0-318-gf69726f9.msi可以通过官方网站找到对应的下载链接,然后选择保存位置并双击安装文件完成安装过程。安装完成后,即可使用Wireshark进行网络数据包分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值