美文网首页
Spark学习笔记六:广播变量和累加器

Spark学习笔记六:广播变量和累加器

作者: 开发者连小超 | 来源:发表于2019-12-25 13:59 被阅读0次

一、广播变量

Driver端new一个list,假设给每个Excutor发送100个task,每个task带一个list过来,100个task带100个list,放在Excutor端的内存里,这样会存在问题,所以使用广播变量来解决。
使用广播变量,在每个Excutor端有blockManager来管理这个list,当task执行时先去blockManager内寻找list,不必获取Driver的list,如此100个task共享使用这个list即可。

广播变量.jpg

广播变量使用

val conf = new SparkConf()
conf.setMaster("local").setAppName("brocast")
val sc = new SparkContext(conf)
val list = List("hello xasxt")
val broadCast = sc.broadcast(list)
val lineRDD = sc.textFile("./words.txt")
lineRDD.filter { x => broadCast.value.contains(x) }.foreach { println}
sc.stop()

注意事项:

  • 能不能将一个RDD使用广播变量广播出去?
    不能,因为RDD是不存储数据的。可以将RDD的结果广播出去。
  • 广播变量只能在Driver端定义,不能在Executor端定义。
  • 在Driver端可以修改广播变量的值,在Executor端无法修改广播变量的值。

二、累加器

下图中代码内部给i+1是在Excutor端执行的,并不改变外面Driver端i的值,所以最终打印结果i=0,在Driver端定义一个累加器来解决此问题。
累加器相当于把每个RDD分区处理的结果进行累加。

累计器.jpg

累加器使用

val conf = new SparkConf()
conf.setMaster("local").setAppName("accumulator")
val sc = new SparkContext(conf)
val accumulator = sc.accumulator(0)
sc.textFile("./words.txt").foreach { x =>{accumulator.add(1)}}
println(accumulator.value)
sc.stop()

注意事项:

  • 累加器在Driver端定义赋初始值,累加器只能在Driver端读取,在Excutor端更新

相关文章

网友评论

      本文标题:Spark学习笔记六:广播变量和累加器

      本文链接:https://www.haomeiwen.com/subject/nfdcoctx.html