目录
Spark两种共享变量:广播变量与累加器。广播变量可以在Driver程序中写入,在Executor端读取。累加器在Executor中写入,而在Driver端读取。
共享变量出现的原因:通常,当在远程集群节点上执行传递给Spark操作的函数时,它将在函数中使用的所有变量的单独副本上工作。这些变量将复制到每台计算机,而且远程机器上的变量的更新不会同步给Driver端。这种情况下,跨任务读写共享变量效率低下。Spark使用共享变量(广播变量和累加器)来解决问题。
广播变量
为什么要将变量定义成广播变量?如果要在分布式计算里面分发大对象,例如:字典,集合等,这个都会由Driver端进行分发。一般来讲,如果这个变量不是广播变量,那么每个task就会分发一份,这在task数目十分多的情况下Driver的带宽会成为系统的瓶颈,而且会大量消耗task服务器上的资源,如果将这个变量声明为广播变量,那么只是每个executor拥有一份,这个executor启动的task会共享这个变量,节省了通信的成本和服务器的资源。
注意:
1、能不能将一个RDD使用广播变量广播出去?
不能,广播变量的值必须是本地的可序列化的值,而不是RDD或其他分布式数据结构。
2、 广播变量只能在Driver端定义,不能在Executor端定义
3、 在Driver端可以修改广播变量的值,在Executor端无法修改广播变量的值
Broadcast的实现
<