Apache flink Flink KeyedProcessFunction与广播状态

Apache flink Flink KeyedProcessFunction与广播状态,apache-flink,Apache Flink,我尝试在flink应用程序中使用广播状态模式,但经过一些研究后,我做了以下操作: case class MyData(field1: String, field2: String, ts: Long, type: String) // type can be DATA or CONFIG val stream1: DataStream[MyData] = ... // kinesis queue 1. main Data stream val stream2: DataStream[MyDat

我尝试在flink应用程序中使用广播状态模式,但经过一些研究后,我做了以下操作:

case class MyData(field1: String, field2: String, ts: Long, type: String) // type can be DATA or CONFIG

val stream1: DataStream[MyData] = ... // kinesis queue 1. main Data stream
val stream2: DataStream[MyData] = ... // kinesis queue 2. configuration stream

val union = stream1.union(stream2)
  .keyBy(x => s"${x.field1}_${x.field2}")
  .process(new MyProcessFun)
MyProcessFun()
中,我读取数据,并根据来自
stream2
的数据,对数据进行一些逻辑处理并发出一些元素。 基本上,我使用
stream2
,就像广播状态模式一样。我没有专门使用广播,因为没有简单的方法从
processBroadcastElement
访问我的某些状态。 因为我的配置流被用作清理状态的指示器,所以我在我的
MyProcessFun()
中使用了它

流是
.keyBy
,因此我不认为并行性>1会出现问题。这是真的吗

我的问题是,还需要广播哪些案例? 在什么情况下需要使用广播模式? 因为在许多情况下,这种功能可以借助于
.union()
.connect()//无广播来解决
+
{Co}ProcessFunction()

这里有两件事要说。 首先,您似乎可以使用标准的
KeyedCoProcess
函数来实现您现在使用
union
所做的事情。它实际上不会有太大的区别,但您可以为两个流使用单独的类,这样总体上可以更好地实现类型安全性和更好的域隔离

至于
广播
,主要用例是
控件
流没有键到
keyBy
或者根本不能/不应该被分区

可以考虑的一个例子是,您可能有一些由外部系统生成的事件,并且您希望应用规则来筛选出不满足规则中要求的事件。您希望拥有动态规则,这样,如果用户定义了规则,它将立即用于过滤传入事件。为了简单起见,让我们假设规则对于所有事件类型都是通用的(比如,如果事件发生在给定的一天下午5点之后,那么应该对其进行过滤,或者如果事件持续时间超过5分钟,我们假设它无效)。您无法对这些规则进行分区,因此解决方案将是
广播


或者,如果你想拥有一个系统,你可以实时计算送货司机的总收入。你可能有一套额外的奖金(比如如果司机在一小时内完成10次送货,就有5%的奖金)。你不想为每个车手创建一套单独的奖金规则,这样你就可以
keyBy
it,好吗?:)

我使用了
.union
,因为我实际上在那里组合了几个流。据我所知,如果您使用
.connect
,这是不可能的。也就是说,在我的实现中,并行度大于1没有问题?感谢您对何时使用广播的详细解释。我的理解如下:如果您希望将常规事件发送到
控件
流,而这些事件不绑定到
数据流中的任何实体-使用广播:)如果键是唯一的,那么在处理并集情况下的并行性时就不应该出现任何问题。