spark 广播变量与累加器

如何理解广播变量?

 

 

适用场景:大变量,比如100M以上的大集合。算子函数中使用到外部变量时,默认情况下,Spark会将该变量复制多个副本,通过网络传输到task中,此时每个task都有一个变量副本。如果变量本身比较大的话(比如100M,甚至1G),那么大量的变量副本在网络中传输的性能开销,以及在各个节点的Executor中占用过多内存导致的频繁GC,都会极大地影响性能。

如果使用的外部变量比较大,建议使用Spark的广播功能,对该变量进行广播。广播后的变量,会保证每个Executor的内存中,只驻留一份变量副本,而Executor中的task执行时共享该Executor中的那份变量副本。这样的话,可以大大减少变量副本的数量,从而减少网络传输的性能开销,并减少对Executor内存的占用开销,降低GC的频率。

 spark.sparkContext.setLogLevel("error")

    val data=spark.sparkContext.textFile("F:\\IdeaWorkspace\\lzm\\Resource\\kzc202007.txt")
    val l=List("hadoop","apache")
    val lbroad=spark.sparkContext.broadcast(l)
    data.flatMap(x=>x.trim.split(" ")).map((_,1)).filter(x=>{
      !lbroad.value.contains(x._1)
    }).reduceByKey(_+_).collect().foreach(println(_))

通过value访问广播变量的值

 

posted @ 2021-01-11 17:02  bioamin  阅读(89)  评论(0编辑  收藏  举报