1.广播变量的意义
广播变量的好处,不需要每个task带上一份变量副本,而是变成每个节点的executor才一份副本。这样的话, 就可以让变量产生的副本大大减少,从而减少传输过程中的IO,减少存放变量的内存占用.
2.下面一张高清大图说明广播的过程,Driver将数据collect到一起,然后将完整的数据分发到executors上,进行相应的处理
3.广播变量的用法
广播变量用法很简单,其实就是SparkContext的broadcast()方法,传入你要广播的变量,即可。
context.broadcast(a) // a 为需要广播出去的变量;context 为SparkContext
使用广播变量的时候,直接调用广播变量(Broadcast类型)的value() / getValue() 可以获取到之前封装的广播变量。
a.value() //a为上面广播出去的变量。
4.广播变量的例子
需求:查询日志中每个省所拥有的资源数
import org.apache.log4j.{
Level, Logger}
import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{
SparkConf, SparkContext}
/**
* 广播变量的例子
*/
object IPLocation {
val rulesFilePath = "D:\\data\\ip.txt"
val accessFilePath = "D:\\data\\access.log"
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
val conf = new SparkConf().setAppName("IPLocation").setMaster("local[*]")
val sc = new SparkContext(conf)
//1:读取IP规则资源库
val ipRulesLines: RDD[String] = sc