ブロードキャスト変数の役割
- ブロードキャスト変数:分散読み取り専用変数。
- エグゼキュータ側がドライバ側の変数にアクセスする必要がある場合、sparkはこの変数のコピーをエグゼキュータ側の各タスクに送信します。この変数が大きい場合、エグゼキュータノードの大量のメモリを占有します。
- ブロードキャスト変数を使用すると、sparkは1つの変数のみを1つのエグゼキューターノードに送信します。
ブロードキャスト変数の使用
要求する
リストとRDDは、結合演算子と同様の効果を実現します。
object Spark08_Broadcast {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]")
val sc = new SparkContext(conf)
val list1: List[(String, Int)] = List(("a",1),("b",2),("c",2))
val list2: RDD[(String, Int)] = sc.makeRDD(List(("a",3),("b",4),("c",5)))
// 启用广播变量
val broadList: Broadcast[List[(String, Int)]] = sc.broadcast(list1)
// join两个数据,结构(key,(value1,value2))
val resRDD: RDD[(String, (Int, Int))] = list2.map {
case (word, count) => {
// 定义临时变量,保存相同key对应的value
var v3 = 0
// 获取广播变量中的值
val broadValue: List[(String, Int)] = broadList.value
for (w <- broadValue) {
if (w._1 == word) {
v3 = w._2
}
}
(word, (count, v3))
}
}
resRDD.foreach(println)
sc.stop()
}
}