spark源码分析— spark广播变量

本文深入剖析了Spark广播变量的原理与实现细节,包括如何创建、存储和读取。广播变量通过BitTorrent协议实现,分摊driver的网络传输压力,优化数据在集群间的共享。在每个节点存储两份数据,一份是完整对象,另一份是切分的数据块,以提高读取效率。
摘要由CSDN通过智能技术生成
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拉取数据,然后将拉取来的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值