什么是广播变量?
driver端分发任务,每一个executor(可以理解成worker)总的多个task从executor获取信息,而不是直接从driver段获取,可以节省带宽和资源
定义一个广播变量
val a = 3
val broadcast = sc.broadcast(a)
//还原
val c = broadcast.value
注意事项
- 不能将一个RDD使用广播变量广播出去,因为RDD是不存储数据的。可以将RDD的结果广播出去。
- 广播变量只能在Driver端定义,不能在Executor端定义。
- 在Driver端可以修改广播变量的值,在Executor端无法修改广播变量的值。
- 如果executor端用到了Driver的变量,如果不使用广播变量在Executor有多少task就有多少Driver端的变量副本。
- 如果Executor端用到了Driver的变量,如果使用广播变量在每个Executor中只有一份Driver端的变量副本
什么是累加器?
在分布式运行时每个task运行的只是原始变量的一个副本,并不能改变原始变量的值,但是当这个变量被声明为累加器后,该变量就会有分布式计数的功能。可以理解成每一个task可以把结果反馈给driver,driver就可以将每个task中的运行结果累加记录
val a = sc.accumulator(0)
//还原
val b = a.value