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.