spark广播变量是spark中一种只读的数据,广播的数据被集群不同节点共享,且默认存储在内存中,读取速度比较快。
spark内部有很多地方都使用的广播变量功能,比如spark sql的join有一种broadcast join,就是使用广播变量实现的小表join的优化;spark提交job时,将task的依赖关系广播到集群等。
接下来,分析一下,spark广播变量的实现细节:
```
val broadcastVar = sc.broadcast(Array(1, 2, 3)) // 创建一个广播变量
```
看一下一个广播如何创建,并在集群间共享的
```
def broadcast[T: ClassTag](value: T): Broadcast[T] = {
assertNotStopped()
require(!classOf[RDD[_]].isAssignableFrom(classTag[T].runtimeClass),
"Can not directly broadcast RDDs; instead, call collect() and broadcast the result.")
val bc = env.broadcastManager.newBroadcast[T](value, isLocal) //主要代码
val callSite = getCallSite
logInfo("Created broadcast " + bc.id + " from " + callSite.shortForm)
cleaner.foreach(_.registerBroadcastForCleanup(bc))
bc
}
```
通过BroadcastManager的newBoadcast()方法创建广播变量,该方法只有一行代码,就是调用BroadcastFactory的子类的newBroadcast()的方法,BroadcastFactory只有一个实现子类,就是TorrentBroadcastFactory。
```
def newBroadcast[T: ClassTag](value_ : T, isLocal: Boolean): Broadcast[T] = {
broadcastFactory.newBroadcast[T](value_, isLocal, nextBroadcastId.getAndIncrement())
}
```
TorrentBroadcastFactory类的newBroadcast()方法会创建一个TorrentBroadcast,该实现使用了类BitTorrent的p2p协议,实现机制如下:driver会将广播的对象序列化,然后将序列化对象拆分为小数据块,并将这些数据块存储在driver端的BlockManage中。在每个executor端,executor首先会试图从它自己的BlockManager拉取数据。如果没有,它会从driver或者其他executor拉取数据,然后将拉取来的
spark内部有很多地方都使用的广播变量功能,比如spark sql的join有一种broadcast join,就是使用广播变量实现的小表join的优化;spark提交job时,将task的依赖关系广播到集群等。
接下来,分析一下,spark广播变量的实现细节:
```
val broadcastVar = sc.broadcast(Array(1, 2, 3)) // 创建一个广播变量
```
看一下一个广播如何创建,并在集群间共享的
```
def broadcast[T: ClassTag](value: T): Broadcast[T] = {
assertNotStopped()
require(!classOf[RDD[_]].isAssignableFrom(classTag[T].runtimeClass),
"Can not directly broadcast RDDs; instead, call collect() and broadcast the result.")
val bc = env.broadcastManager.newBroadcast[T](value, isLocal) //主要代码
val callSite = getCallSite
logInfo("Created broadcast " + bc.id + " from " + callSite.shortForm)
cleaner.foreach(_.registerBroadcastForCleanup(bc))
bc
}
```
通过BroadcastManager的newBoadcast()方法创建广播变量,该方法只有一行代码,就是调用BroadcastFactory的子类的newBroadcast()的方法,BroadcastFactory只有一个实现子类,就是TorrentBroadcastFactory。
```
def newBroadcast[T: ClassTag](value_ : T, isLocal: Boolean): Broadcast[T] = {
broadcastFactory.newBroadcast[T](value_, isLocal, nextBroadcastId.getAndIncrement())
}
```
TorrentBroadcastFactory类的newBroadcast()方法会创建一个TorrentBroadcast,该实现使用了类BitTorrent的p2p协议,实现机制如下:driver会将广播的对象序列化,然后将序列化对象拆分为小数据块,并将这些数据块存储在driver端的BlockManage中。在每个executor端,executor首先会试图从它自己的BlockManager拉取数据。如果没有,它会从driver或者其他executor拉取数据,然后将拉取来的