Flink/Scala - Variáveis de transmissão do aplicativo DataSet

I. Introdução

Além da entrada regular da operação, a variável broadcast Broadcast Value permite que um conjunto de dados seja disponibilizado para todas as instâncias paralelas da operação, ou seja, variáveis ​​adequadas para tarefas que precisam ser comuns, assim como as variáveis ​​comuns que todo executor em faísca precisa acessar. Isso é útil para conjuntos de dados auxiliares ou parametrização dependente de dados. O conjunto de dados é então acessado no operador como uma coleção. No Flink, as variáveis ​​de broadcast são geradas e obtidas pelos seguintes métodos:

Gerar: withBroadcastSet(DataSet, String) O primeiro é o conjunto de dados de transmissão e o último é o identificador de nome correspondente ao conjunto de dados

Get: getRuntimeContext().getbroadcastvariable(String) método para obter, o parâmetro é gerar o identificador de nome correspondente

2.Boardcast usa demonstração

Este exemplo chama o valor de broadcast na operação map do DataSet e imprime seu resultado.

    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()

Existem quatro marcadores A, B, C e D na demonstração, correspondendo a quatro situações:

A. para criar

Isso corresponde à criação de um DataSet. Para a criação de um DataSet relacionado, consulte a criação de um  Flink DataSet . Além de transmitir os tipos de dados básicos String, Double, etc., você também pode transmitir um tipo de dados personalizado , mas deve ser empacotado em um DataSet, ou seja, a variável broadcast deve ser um formato DataSet [T].

B. Transmissão

Na operação de transformação de DataSet, se você precisar adicionar variáveis ​​de broadcast, você precisa chamar o método .withBroadCast para especificar o identificador String correspondente ao DataSet. Para operações de transformação comuns, consulte  Flink DataSet Transformation .

c. adquirir

Primeiro inicialize a variável de transmissão correspondente na função e, em seguida, obtenha-a pelo seguinte método na função de inicialização aberta, T representa o tipo de dados no DataSet:

getRuntimeContext.getBroadcastVariable[T]("key") 

D. Coleção Comum

É apenas um DataSet[T] normal que pode ser inicializado diretamente em Function e também pode ser usado diretamente. Por que você precisa de uma transmissão tão complicada? Isso na verdade envolve a intenção original da transmissão. As variáveis ​​de transmissão são aplicáveis ​​a todas as tarefas públicas, então a inicialização externa transmite diretamente para A memória ocupada por cada nó também é relativamente pequena. Se não for transmitida, o mesmo conjunto de dados será inicializado em cada tarefa, todos apontando para diferentes ponteiros de memória, ocupando uma quantidade relativamente grande de memória. o conjunto de dados é particularmente pequeno, não será inicializado diretamente. Além de variáveis ​​de broadcast, a função de inicialização aberta é adequada para inicializar cliente, socket, conexão, servidor, etc. 

3. Resumo

Como o conteúdo da variável de transmissão é mantido na memória de cada nó, ela não deve ficar muito grande. Para algo tão simples quanto um valor escalar, você pode simplesmente passar o parâmetro como parte de um encerramento de função ou usar o método withParameters(...) para passar a configuração. O Flink está mais focado no processamento de dados de streaming, e o BroadcastStream de dados de streaming será introduzido posteriormente.

Guess you like

Origin blog.csdn.net/BIT_666/article/details/123367597