Spark从入门到精通(三)--SparkShuffle与广播变量和累加器

Spark Shuffle

reduceByKey会将上一个RDD中的每一个key对应的所有value聚合成 一个value,然后生成一个新的RDD,元素类型是<key,value>对的形式,这样每一个key对应一个聚合起来的value
Shuffle Write:上一个stage的每个map task就必须保证将自己处理 的当前分区中的数据相同的key写入一个分区文件中,可能会写入多个 不同的分区文件中
Shuffle Read:reduce task就会从上一个stage的所有task所在的机 器上寻找属于自己的那些分区文件,这样就可以保证每一个key所对应的value都会汇聚到同一个节点上去处理和聚合
HashShufflManager和SortShuffleManager,Spark1.2之前是HashShuffleManager, Spark1.2引入SortShuffleManager
在Spark 2.0+版本中已经将HashShuffleManager丢弃。所以我就讲一下SortShuffleManager

SortShuffleManager
普通机制在这里插入图片描述

执行流程
a) map task 的计算结果会写入到一个内存数据结构里面,内存数据结构默认是5M
b) 在shuffle的时候会有一个定时器,不定期的去估算这个内存结构的大小,当内存结构中的数据超过5M时,比如现在内存结构中的数据为5.01M,那么他会申请5.012-5=5.02M内存给内存数据结构。
c) 如果申请成功不会进行溢写,如果申请不成功,这时候会发生溢写磁盘。
d) 在溢写之前内存结构中的数据会进行排序分区
e) 然后开始溢写磁盘,写磁盘是以batch的形式去写,一个batch是1万条数据,
f) map task执行完成后,会将这些磁盘小文件合并成一个大的磁盘文件,同时生成一个索引文件。
g) reduce task去map端拉取数据的时候,首先解析索引文件,根据索引文件再去拉取对应的数据。
产生磁盘小文件的个数: 2
M(map task的个数)

bypass机制

bypass运行机制的触发条件如下:
①.shuffle reduce task的数量小于spark.shuffle.sort.bypassMergeThreshold的参数值。这个值默认是200
②.产生的磁盘小文件为:2*M(map task的个数)
在这里插入图片描述

Shuffle文件寻址

在这里插入图片描述

内存管理:静态内存管理,统一内存管理

在这里插入图片描述

广播变量和累加器

广播变量

当Executor使用到Driver端的变量时:
如果不使用广播变量,在Executor有多少task就有多少Driver的变量副本
如果使用广播变量,在每个Executor中只有一份Driver的变量副本

val list = List[String]("hello java")
val broadcast = context.broadcast(list)
valfilterRDD = lines.filter(broadcast.value.contains(_))
filterRDD.foreach(println)
累加器

累加器在Driver端定义赋初始值,累加器只能在Driver端读取,在Excutor端更新。JavaSpark只有int或者double,不能再算子内获取累加器的值;scala还有long累加器,spark2之前只有intAccumulator,且不能在算子内获取累加器的值,long和double可以再算子内部获取值

val accumulator: LongAccumulator = context.longAccumulator
val filterRDD: RDD[String] = lines.filter(one => {
  	accumulator.add(1)
  	println("accumulator: "+accumulator.value)
  	broadcast.value.contains(one)
})
filterRDD.foreach(println)
println(s"final accumulator:${accumulator.value}")

二次排序和TopN问题: https://blog.csdn.net/happiless/article/details/107307705

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值