当前位置: 首页 > 知识库问答 >
问题:

Flink KeyedProcessFunction与广播状态

袁建木
2023-03-14

我尝试在我的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()中,我读取数据,并根据来自stream 2的数据对数据进行一些逻辑处理并发出一些元素。基本上,我使用stream 2就像广播状态模式一样。我没有专门使用广播,因为没有简单的方法可以从Process BroadcastElement访问我的某些状态。由于我的配置流被用作清理状态的指示符,我在我的MyProcessFun()中拥有。

流是<代码>。keyBy所以我不希望出现并行性问题

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

共有1个答案

瞿和硕
2023-03-14

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

至于广播,主要的用例是当控制流没有键,或者根本不能/不应该被分区时。

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

或者,如果你想有一个系统,可以实时计算送货司机的总收入。您可能会获得一系列额外的奖金(例如,如果司机在一小时内完成10次送货,则会获得5%的奖金)。你不想为每个车手创建一套单独的奖金规则,这样你就可以通过按键来获得奖金,对吗?:)

 类似资料:
  • 在广播模式的文档中,提到没有RocksDB状态后端: 如果应用程序使用rocksdb作为状态后端,这将如何影响保存点行为?这是否意味着状态在保存点期间不存储,因此不会恢复?

  • 我们试图构建一个用例,其中来自流的数据通过计算公式运行,但公式本身也应该(很少)是可更新的。从阅读文档来看,在我看来,Flink broadcast state自然适合这种情况。 作为一个实验,我构建了一个简化的版本:假设我有一个整数流,第二个流包含这些整数的乘法因子(我可以随意发送值)。第二个流的频率很低,很容易在事件之间的几天或几周内出现。目前,这两个都实现为简单的套接字服务器,最终产品将使用

  • 问题内容: 我正在使用python 2.7,并且正在尝试从1.00000000到3.0000000008的一些随机数据进行预测。我的阵列中大约有196个项目,但出现错误 我似乎无法独自解决此问题。任何帮助或相关文档的链接将不胜感激。 这是我正在使用的代码,会产生此错误 问题答案: 如果和的形状与最后一行的rhs中的第二项(即)的形状不同,则将出现这种类型的错误。要将数组添加到数组的元组中,它们都必

  • 输出如下: 如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。 如果满足以下规则,可以进行广播: 如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则在计算中可它。 如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的。 数

  • 原文:Broadcasting 另见:numpy.broadcast 术语广播描述了NumPy在算术运算时如何处理不同形状的数组。 在某些条件下,较小的数组“广播”成较大的数组以便有相同的形状。 广播提供了一种矢量化操作数组的方法,这样可以在C而不是Python中进行循环。 它可以在不制作不必要的数据副本的情况下实现这一点,并且通常可以实现高效 然而,有些情况下广播是一个坏主意,因为它会导致内存使

  • 对于并行处理,Apache Spark使用共享变量。 当驱动程序将任务发送到集群上的执行程序时,共享变量的副本将在集群的每个节点上运行,以便可以将其用于执行任务。 Apache Spark支持两种类型的共享变量 - Broadcast Accumulator 让我们详细了解它们。 广播(Broadcast) 广播变量用于跨所有节点保存数据副本。 此变量缓存在所有计算机上,而不是在具有任务的计算机上