Spark三大核心数据结构(三)——广播变量

Spark的三大核心数据结构:RDD、累加器(只写不读)、广播变量(只读不写)

广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。

不用广播变量的话,转换算子和执行算子之间会有shuffle的过程;

使用广播变量的好处是避免了RDD转换和行动中的shuffle的落盘和磁盘IO,提高性能,是Spark的一种优化手段。

广播变量原理是将RDD封装成广播变量,存放在内存中;其余的RDD与这个RDD数据进行交互的时候,就是在内存中相交互,只做map操作,效率得到很大的提高。

1. 正常的RDDs的join操作

scala> val rdd1 = sc.makeRDD(Array((1,"a"),(2,"b")))
rdd1: org.apache.spark.rdd.RDD[(Int, String)] = ParallelCollectionRDD[2] at makeRDD at <console>:24

scala> val rdd2 = sc.makeRDD(Array((1,"a"),(2,"bb"),(3,"cc")))
rdd2: org.apache.spark.rdd.RDD[(Int, String)] = ParallelCollectionRDD[3] at makeRDD at <console>:24

scala> rdd1.join(rdd2).collect
res1: Array[(Int, (String, String))] = Array((1,(a,a)), (2,(b,bb)))

用时如下0.5s:

 

2. 使用广播变量

sc.broadcast创建广播变量,变量.value获取广播变量的值

但是由于广播变量是传入每个Worker工作节点中,所以广播变量内存不宜过大,否则会造成Worker节点的Executor内存不足

scala> val rdd2 = sc.makeRDD(Array((1,"a"),(2,"bb"),(3,"cc")))
rdd2: org.apache.spark.rdd.RDD[(Int, String)] = ParallelCollectionRDD[3] at makeRDD at <console>:24

scala> val bc = sc.broadcast(Array((1,"a"),(2,"bb")))
bc: org.apache.spark.broadcast.Broadcast[Array[(Int, String)]] = Broadcast(3)

scala> rdd2.map(item=>{bc.value;item}).collect
res2: Array[(Int, String)] = Array((1,a), (2,bb), (3,cc))

用时44ms:

相比不使用广播变量,性能得到了很大的提高。

猜你喜欢

转载自blog.csdn.net/wx1528159409/article/details/87823369