Scala 弗林克';广播状态行为

Scala 弗林克';广播状态行为,scala,apache-flink,broadcast,flink-streaming,Scala,Apache Flink,Broadcast,Flink Streaming,我试着用一个简单的例子来玩弄弗林克的布罗卡斯特州 我只是想把一个整数流乘以另一个整数,得到一个广播流 我的广播行为是“怪异的”,如果我在输入流中放入的元素太少(如10),则什么也不会发生,并且我的MapState为空,但如果我放入更多元素(如100),我就有了我想要的行为(这里的整数流乘以2) 如果我提供的元素太少,为什么广播流不考虑? 如何控制广播流何时工作? 可选:我只想保留广播流的最后一个元素,.clear()是好方法吗 谢谢大家! 这是我的广播处理函数: import org.apach

我试着用一个简单的例子来玩弄弗林克的布罗卡斯特州

我只是想把一个整数流乘以另一个整数,得到一个广播流

我的广播行为是“怪异的”,如果我在输入流中放入的元素太少(如10),则什么也不会发生,并且我的
MapState
为空,但如果我放入更多元素(如100),我就有了我想要的行为(这里的整数流乘以2)

如果我提供的元素太少,为什么广播流不考虑?

如何控制广播流何时工作?

可选:我只想保留广播流的最后一个元素,
.clear()
是好方法吗

谢谢大家!

这是我的
广播处理函数

import org.apache.flink.streaming.api.functions.co.BroadcastProcessFunction
import org.apache.flink.util.Collector
import scala.collection.JavaConversions._

class BroadcastProcess extends BroadcastProcessFunction[Int, Int, Int] {
  override def processElement(value: Int, ctx: BroadcastProcessFunction[Int, Int, Int]#ReadOnlyContext, out: Collector[Int]) = {
    val currentBroadcastState = ctx.getBroadcastState(State.mapState).immutableEntries()
    if (currentBroadcastState.isEmpty) {
      out.collect(value)
    } else {
      out.collect(currentBroadcastState.last.getValue * value)
    }
  }

  override def processBroadcastElement(value: Int, ctx: BroadcastProcessFunction[Int, Int, Int]#Context, out: Collector[Int]) = {
    // Keep only last state
    ctx.getBroadcastState(State.mapState).clear()
    // Add state
    ctx.getBroadcastState(State.mapState).put("key", value)
  }
}
和我的
MapState

import org.apache.flink.api.common.state.MapStateDescriptor
import org.apache.flink.api.scala._

object State {
  val mapState: MapStateDescriptor[String, Int] =
    new MapStateDescriptor(
      "State",
      createTypeInformation[String],
      createTypeInformation[Int]
    )
}
和我的
Main

import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.api.scala._

object Broadcast {
  def main(args: Array[String]): Unit = {
    val numberElements = 100
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)
    val broadcastStream = env.fromElements(2).broadcast(State.mapState)
    val input = (1 to numberElements).toList
    val inputStream = env.fromCollection(input)
    val outputStream = inputStream
      .connect(broadcastStream)
      .process(new BroadcastProcess())
    outputStream.print()
    env.execute()
  }
}

编辑:我使用Flink 1.5,广播状态文档是。

Flink不同步流的摄取,即流尽快生成数据。这适用于常规和广播输入。
广播进程
在接收常规输入之前不会等待第一个广播输入到达


当您在常规输入中输入更多的数字时,序列化、反序列化和服务输入只需花费更多的时间,以便在第一个常规数字到达时广播输入已经存在。

谢谢您的回答!你知道是否有办法控制(或至少知道)广播输入何时到达吗?这是特定于应用程序的。bc输入也可能是无限的。您可以将所有常规输入缓冲在状态(例如ListState)中,并在收到所有(或第一次)bc输入后在
processBroadcastElement()
中处理记录的事件。谢谢!在“正常”情况下,这不会是一个问题,但我想“单元测试”broadccast处理。我将检查是否找到了解决方案,或者是否只添加了
线程.sleep
以等待广播元素。