广播变量和累加器

文章目录

      • 广播变量
        • 注意事项
      • 累加器
        • 注意事项

广播变量

广播变量和累加器_第1张图片
以前是每个task拥有一个变量,造成内存不足,将数据量较少的作为广播变量广播出去

scala版本

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()

java版本

 //定义
final Broadcast> broadcast = context.broadcast(list);
//获取 
broadcast.getValue();

注意事项

1.不能将一个RDD使用广播变量广播出去

2.广播变量只能在Driver端定义,不能再Executor端定义

3.在Driver端可以修改广播变量的值,在Executor端无法修改广播变量的值

累加器

广播变量和累加器_第2张图片
广播变量和累加器_第3张图片
累加器的使用

scala代码

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()

java代码

//driver端定义
Accumulator accumulator = context.accumulator(0);
//executor端执行
accumulator.add(1);

注意事项

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

你可能感兴趣的:(spark-鲨鱼)