[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,可能写入同一个文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值