Flink/Scala-DataSetアプリケーションのブロードキャスト変数

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は後で紹介されます。

おすすめ

転載: blog.csdn.net/BIT_666/article/details/123367597