Spark广播变量

该博客探讨了在Apache Spark中如何使用广播变量(Broadcast)来优化分布式计算。通过对比普通join操作和使用广播变量的join操作,展示了广播变量如何减少数据传输,提高内存效率,从而提升整体性能。示例代码中创建了RDD并执行了join操作,然后用广播变量实现相同功能,以减少数据复制,改善大规模数据处理的效率。
摘要由CSDN通过智能技术生成
package sparkCore.BroadCastV1

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

object BroadCastV1 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder()
      .appName(this.getClass.getName)
      .master("local[*]")
      .getOrCreate()

    val sc = spark.sparkContext

    val rdd01 = sc.makeRDD(List(('A', 1), ('B', 2), ('C', 3)), 2)
    val rdd02 = sc.makeRDD(List(('A', 10), ('B', 20), ('C', 30), ('C', 40), ('D', 40)), 3)

    //普通的join会产生shuffle,性能较低
    val rdd03 = rdd01.join(rdd02)

    val map1: Map[Char, Int] = rdd01.collect.toMap

    /**
      * 分布式共享只读变量--广播变量Broadcast
      * map1为map算子中匿名函数的一个外部变量,闭包数据是以Task为单位发送的
      * 这样会造成同一个Executor中有多少个Task,就会有多少份map1的数据,占用大量内存
      * 而广播变量可以将闭包的数据保存到Executor内存中,只保存1份数据
      * 每个Executor中的所有Task会共享这1份数据
      **/
      //同过map实现join效果,不过由于闭包数据会以Task为单位发送,性能较差
    val rdd04: RDD[(Char, (Int, Int))] = rdd02.map {
      case (word, cnt) => {
        val cnt2 = map1.getOrElse(word, 0)
        (word, (cnt, cnt2))
      }
    }.filter(_._2._2 != 0)

    //分布式共享只读变量--广播变量
    val broad = sc.broadcast(map1)

    val rdd05: RDD[(Char, (Int, Int))] = rdd02.map {
      case (word, cnt) => {
        val cnt2 = broad.value.getOrElse(word, 0)
        (word, (cnt, cnt2))
      }
    }.filter(_._2._2 != 0)

    rdd05.collect().foreach(println(_))

    sc.stop()
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值