2

我是新来流处理(kafka流/ flink /风暴/火花/等),并试图找出处理现实世界问题的最佳方法,代表这里以玩具为例。我们与Kafka绑定用于我们的pubsub/data摄入,但对流处理器框架/方法没有特别的依赖。流处理架构:未来事件影响过去的结果

理论上,假设我有一个零星发射浮点值的源。在任何给定的点上都有一个乘数M应该应用于这个源的值;但是M可以改变,而且批判地说,我可能只在晚些时候才会发现这种变化 - 甚至可能不是“按照变化顺序”。

我想到卡夫卡表示此为

"Values": (timestamp, floating point value) - the values from the source, tagged with their emission time. 

"Multipliers": (timestamp, floating point multiplier) - indicates M changed to this floating point multiplier at this timestamp. 

然后,我会很想创建一个输出话题,说:“结果”,使用标准的流处理架构,连接两个流,并只需将值中的每个值乘以由乘子确定的当前乘数。

但是,根据我的理解,这不会起作用,因为发布到乘法器的新事件可能会对已写入结果流的结果产生任意大的影响。从概念上讲,我希望能得到类似于结果流的结果流,该结果流是发布到乘法器的最后一个事件针对值中的所有值发布的,但可以作为其他值或乘法器事件进行“重新计算”。

用kafka和主流处理器来实现/构建这些技术有哪些?

例子:

最初,

Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)] 
Multipliers = [(1, 1.0)] 
Results = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)] 

后来,

Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)] 
Multipliers = [(1, 1.0), (4, 2.0)] 
Results = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 4.4)] 

最后,在另一个事件发布到乘法器(也是一个新值发出过):

Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2), (7, 5.0)] 
Multipliers = [(1, 1.0), (4, 2.0), (2, 3.0)] 
Results = [(1, 2.4), (2, 10.8), (3, 3.0), (5, 4.4), (7, 10.0)] 
+0

恕我直言,这是相当广泛的给你一个具体的答案。实际的解决方案将取决于要求:“我们需要怎样处理数据”。在提供的示例中,我将存储这两个流并在读取时执行操作:即。当需要结果时。但是根据实际情况中的应用需求,这可能还不够。 – maasg

+0

在此程序中,乘数乘以按键的值。 所以你的结果会受到影响。 –

+0

好点maasg。在我们的例子中,有太多的数据流入来支持推迟计算。另外,我们需要做一些查询,比如“给我所有的结果值和它们的时间戳,其值在X和Y之间,就你所知,根据目前关于乘数的信息”;如果没有计算它们,就不能对该查询的结果编制索引。 – jdowdell

回答

1

我是只有熟悉Spark并且为了使其按照您所描述的方式工作,您需要在收到新的乘数值时选择性地“更新”以前的结果,同时将最高的索引乘数应用于尚未应用乘数的新值他们。 AFAIK,Spark本身不会让你使用流式处理(你需要缓存和更新旧的结果,而且你还需要知道哪些是用于新值的乘数),但是你可以编写逻辑以便写入您的“结果”主题添加到常规数据库表中,并且当您收到新的乘数时,值数据框中的所有后续事件将仅使用该值,但您会执行一次检查以查找结果表中是否有值现在需要更新以使用新的乘数并简单地更新数据库表中的这些值。

您的结果消费者必须能够处理插入和更新。您可以使用Spark与任何数据库has a connector来实现此目的。

或者,您可以使用SnappyData,将Apache Spark变成一个可变的计算+数据平台。使用Snappy,您可以将值和乘数作为常规流式数据框,并且您可以将结果作为数据框设置作为SnappyData中的复制表。当您在乘数流中处理新条目时,您将更新结果表中存储的所有结果。这可能是最简单的方法来完成你正在尝试做的事