- 不适用广播变量的缺点
def main(args: Array[String]): Unit = {
val sparkConf: SparkConf = new SparkConf().setAppName("haha").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
val list = List(1,2,3,4)
val rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4),4)
// 此处的rdd分为四个区,即四个task,一个Executor。在下面的计算中,list会以task来分发,即分发四次
// 此处的list数据量少,如果list的数据量很大,就会占用大量的内存空间。或者说这里只有四个task,如果task有一万个呢?要分发一万次
// 解决办法:使用广播变量 因为广播变量是以 Executor为单位来传播变量的
rdd.foreach(num=>{
println(num + list.sum)
})
sc.stop()
}
- 使用广播变量
def main(args: Array[String]): Unit = {
val sparkConf: SparkConf = new SparkConf().setAppName("haha").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
val list = List(1,2,3,4)
val rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4),4)
// 使用广播变量
val broadcast: Broadcast[List[Int]] = sc.broadcast(list)
rdd.foreach(num=>{
println(num+broadcast.value.sum)
})
sc.stop()
}