I.はじめに
操作への通常の入力に加えて、ブロードキャスト変数Broadcast Valueを使用すると、操作のすべての並列インスタンスでデータセットを使用できるようになります。つまり、すべての共通変数と同様に、共通である必要があるタスクに適した変数です。 Sparkのエグゼキュータがアクセスする必要があります。これは、補助データセットまたはデータ依存のパラメーター化に役立ちます。次に、データセットはオペレーターでコレクションとしてアクセスされます。Flinkでは、ブロードキャスト変数は次の方法で生成および取得されます。
生成:withBroadcastSet(DataSet、String)前者はブロードキャストデータセットであり、後者はデータセットに対応する名前識別子です。
Get:getRuntimeContext()。getbroadcastvariable(String)メソッドを取得します。パラメーターは、対応する名前識別子を生成することです。
2.Boardcastはデモを使用します
この例では、DataSetのマップ操作でブロードキャスト値を呼び出し、その結果を出力します。
val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
import org.apache.flink.api.scala._
// 1. The DataSet to be broadcast
// A.创建
val toBroadcastV1 = env.fromElements(1, 2, 3)
val toBroadcastV2 = env.fromElements(3, 4, 5)
case class Student(name: String)
val toBroadcastV3 = env.fromElements(Student("A"), Student("B"))
val data = env.fromElements("a", "b")
data.map(new RichMapFunction[String, String]() {
var broadcastSetV1: mutable.Buffer[String] = null
var broadcastSetV2: mutable.Buffer[String] = null
var broadcastSetV3: mutable.Buffer[Student] = null
// D.Common Collection
val notBroadcastSetV4: Array[Int] = Array(7, 8, 9)
override def open(config: Configuration): Unit = {
// 3. Access the broadcast DataSet as a Collection
// C.获取
broadcastSetV1 = getRuntimeContext.getBroadcastVariable[String]("broadcastSetNameV1").asScala
broadcastSetV2 = getRuntimeContext.getBroadcastVariable[String]("broadcastSetNameV2").asScala
broadcastSetV3 = getRuntimeContext.getBroadcastVariable[Student]("broadcastSetNameV3").asScala
}
override def map(in: String): String = {
broadcastSetV1.foreach(print)
broadcastSetV2.foreach(print)
broadcastSetV3.foreach(print)
notBroadcastSetV4.foreach(print)
"output: " + in
} // B.广播
}).withBroadcastSet(toBroadcastV1, name = "broadcastSetNameV1")
.withBroadcastSet(toBroadcastV2, name = "broadcastSetNameV2")
.withBroadcastSet(toBroadcastV3, name = "broadcastSetNameV3")
.print()
デモには、4つの状況に対応する4つのマーカーA、B、C、およびDがあります。
A.作成する
これは、データセットの作成に対応します。関連するデータセットの作成については、 Flinkデータセットの作成を参照してください 。基本データ型String、Doubleなどをブロードキャストするだけでなく、カスタムデータタイプをブロードキャストすることもできます。 、ただし、DataSetにパッケージ化する必要があります。つまり、ブロードキャスト変数はDataSet[T]形式である必要があります。
B.放送
DataSetの変換操作で、ブロードキャスト変数を追加する必要がある場合は、.withBroadCastメソッドを呼び出して、DataSetに対応する文字列識別子を指定する必要があります。一般的な変換操作については、FlinkDataSetTransformationを参照して ください。
c。取得する
最初に関数で対応するブロードキャスト変数を初期化し、次にオープン初期化関数で次のメソッドによって取得します。TはDataSetのデータ型を表します。
getRuntimeContext.getBroadcastVariable[T]("key")
D.コモンコレクション
Functionで直接初期化でき、直接使用できる通常のDataSet [T]です。なぜこのような複雑なブロードキャストが必要なのですか?これには実際にはブロードキャストの本来の意図が含まれます。ブロードキャスト変数はすべてのパブリックタスクに適用できるため、外部初期化はに直接ブロードキャストします各ノードが占有するメモリも比較的小さいです。ブロードキャストされない場合、同じデータセットが各タスクで初期化され、すべてが異なるメモリポインタを指し、比較的大量のメモリを占有します。データセットは特に小さいため、直接初期化されません。トラブル、結局のところトラブルを回避できます。変数のブロードキャストに加えて、オープン初期化関数は、クライアント、ソケット、接続、サーバーなどの初期化に適しています。
3.まとめ
ブロードキャスト変数の内容は各ノードのメモリに保持されるため、大きくなりすぎないようにする必要があります。スカラー値のような単純なものの場合は、関数クロージャの一部としてパラメータを渡すか、withParameters(...)メソッドを使用して構成を渡すことができます。Flinkはストリーミングデータの処理に重点を置いており、ストリーミングデータのBroadcastStreamは後で紹介されます。