ラジオは、変数の変数を放送しました
1、つまり放送変数
この変数は、変数を放送されていない場合、ドライバ側で配布されるなどの辞書、セット、黒と白のリストは、、、一般的には、各タスクが配布されます:私たちは、例えば、分散型で大きなオブジェクトを配布している計算したい場合このドライバの帯域幅は、タスクの数のシステムのボトルネックになる各エグゼキュータ、エグゼキュータの開始を持っていることを除いて、変数は、放送変数として宣言されている場合、非常に多くのケースで、タスクサーバー上のリソースを大量に消費しますタスクは、変動費を共有し、リソースサーバ通信を保存します。
例えば:スパークアプリケーション50エグゼキュータ1000番目のタスクを有し、データ放送の10Mのサイズは可変ではなく、それが必要10Mある*メモリ1000 = 10G放送変数を使用している間だけ、メモリ10Mを必要* 50 = 500M
2、サンプルコード
package com.test.bigdata
import org.apache.spark.{SparkConf, SparkContext}
object BroadcastApp {
def main(args: Array[String]) {
val sparkConf = new SparkConf()
.setMaster("local[2]").setAppName("SparkContextApp")
val sc = new SparkContext(sparkConf)
// commonJoin(sc)
broadcastJoin(sc)
sc.stop()
}
def broadcastJoin(sc: SparkContext): Unit = {
// 假设 a1是个小表
val a1 = sc.parallelize(Array(("1", "大米"), ("2", "土豆"), ("29", "小花"))).collectAsMap()
//广播
val a1Broadcast = sc.broadcast(a1)
sc.longAccumulator("").add(1)
val f11 = sc.parallelize(Array(("29", "深圳", 18), ("10", "北京", 2)))
.map(x => (x._1, x))
f11.mapPartitions(partition => {
// 获取广播里面的内容
val a1Stus = a1Broadcast.value
for ((key, value) <- partition if (a1Stus.contains(key)))
yield (key, a1Stus.getOrElse(key,""), value._2, value._3)
})
}
def commonJoin(sc: SparkContext): Unit = {
// a1 join f11 on a1.id = f11.id ==> 29,"小花","深圳",18
val a1 = sc.parallelize(Array(("1", "大米"), ("2", "土豆"), ("29", "小花"))).map(x => (x._1, x))
val f11 = sc.parallelize(Array(("29", "深圳", 18), ("10", "北京", 2))).map(x => (x._1, x))
a1.join(f11).map(x => {
x._1 + " , " + x._2._1._2 + " , " + x._2._2._2 + " , " + x._2._2._3
}).collect()
}
}
3ノート
- 放送変数が大きすぎることはできません
- ブロードキャスト変数は、放送終了ドライバーで再放送を変数の値を変更し、属性を変更することはできません読み込まれ、放送はエグゼキュータの終わりに変数の値を変更することはできません。
- RDDアクションがブロードキャストされなければならない後の操作が行われた
ヴァルA1 = sc.parallelize(配列(( "1"、 " 米")、( "2"、 "ジャガイモ")、( "29"、 "花"))) .collectAsMap()
ヴァル= a1Broadcast sc.broadcast(A1)//放送
アキュムレータアキュムレータ
1、アキュムレータ
スパークアプリケーションでは、私たちはしばしばこのような異常監視などの必要性を、持っている、デバッグ、機能の数に合わせてデータを記録する変数は、アキュムレータとして宣言されていない場合、この要求は、その後、カウンタを使用する必要があります運転者側のグローバルランタイム分散元の変数のコピーだけを実行しているタスクごとに集計する際には、元の変数の値を変更しない、変更されませんが、変数がアキュムレータとして宣言された場合この変数の後にカウントを配布されます。
2、アキュムレータの使用
val conf = new SparkConf()
conf.setMaster("local").setAppName("accumulator")
val sc = new SparkContext(conf)
//定义累加器
val accumulator = sc.accumulator(0)
//分布式累加
sc.textFile("./words.txt").foreach { x =>{accumulator.add(1)}}
//获取累加器的结果
println(accumulator.value)
sc.stop()