XML Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 package com.lyzx.day18 import org.apache.spark.{SparkContext, SparkConf} class T1 { /* 通常情况下,当给spark操作传递一个函数的时候,调用函数本身的阶段在Driver端,但是函数执行却在Worker端 这时如果函数体内部有变量时,这个变量会被复制到每个任务中,如果一个RDD操作有多个partition并且都不在一台机器上 那么就会提交多个任务,此时该变量会被复制多份,即使这个变量没有改变也要传回Driver 如果该变量很大就会造成资源的浪费(shuffle时耗费带宽资源)和数据冗余 为此,spark提供了两种类型限制的共享变量 1> 广播变量 2> 累加器 */ /* * 广播变量 * 特点:只读(Read_only) * * 并不会为每个任务分配一个变量而是为没台机器分配一个广播变量,可被多个任务之间共同使用 */ def f1(sc:SparkContext): Unit ={ //通过SparkContext.broadcast()方法来创建一个广播变量 val broadcast = sc.broadcast(List(1,2,3,4,5)) //是org.apache.spark.broadcast.TorrentBroadcast变量并不是RDD println(broadcast.getClass.getName) //通过使用broadcast.value来获取其值 println(broadcast.value) } /* 累加器 特点:只能累计不能读取 */ def f2(sc:SparkContext): Unit ={ val accumulator = sc.accumulator(1,"lyzx_Accumulator") for(i <- 1 to 100){ accumulator.add(i) Thread.sleep(500) } println(accumulator.value) } } object T1{ def main(args: Array[String]) { val conf = new SparkConf().setAppName("day18").setMaster("local") val sc = new SparkContext(conf) val t = new T1// t.f1(sc) t.f2(sc) sc.stop() } }