为什么要有广播?
广播是由Driver发给当前Application分配的所有的Executor内存级别的全局只读变量,Executor中的线程池中的线程共享该全局变量,极大地减少了网络传输(否则每个Task都要传输一次该变量),并极大地节省了内存,隐形的提高可CPU得有效工作。
1.大变量(每个Task执行时,拷贝数据副本(因为是函数式编程,状态一致性),若变量比较大的话,就呵呵了)
2.join时,减少通信、数据冗余
3.同步,broadcast变量是只读
val number = 10
val broadcastNumber = sc.broadcast(number)
.map(_*broadcastNumber.value)
--------------------------------------------------------------------------------------------------------------------------------------------------------------
累加器Accumulator
对于Executor只能修改但不可读,只对Driver可读。
进程级别数据安全
val sum = sc.accumulator(8)
val data = sc.parallelize(1 to 100)
val result = data.foreach(item => sum += item)