Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 流处理体系结构:未来事件影响过去的结果_Apache Kafka_Spark Streaming_Apache Storm_Apache Kafka Streams - Fatal编程技术网

Apache kafka 流处理体系结构:未来事件影响过去的结果

Apache kafka 流处理体系结构:未来事件影响过去的结果,apache-kafka,spark-streaming,apache-storm,apache-kafka-streams,Apache Kafka,Spark Streaming,Apache Storm,Apache Kafka Streams,我对流处理(kafka streams/flink/storm/spark/etc)是新手,我试图找出处理现实世界问题的最佳方法,这里用一个玩具示例来表示。我们的pubsub/数据摄取与Kafka有关,但在流处理器框架/方法方面没有特别的附件 理论上,假设我有一个偶尔发出浮点值的源。此外,在任何给定点上,都有一个乘数M,应应用于该源的值;但是M可以改变,而且关键的是,我可能只会在很久以后才发现改变——甚至可能不会“按改变顺序” 我想在卡夫卡中将这一点表现为 "Values": (timestam

我对流处理(kafka streams/flink/storm/spark/etc)是新手,我试图找出处理现实世界问题的最佳方法,这里用一个玩具示例来表示。我们的pubsub/数据摄取与Kafka有关,但在流处理器框架/方法方面没有特别的附件

理论上,假设我有一个偶尔发出浮点值的源。此外,在任何给定点上,都有一个乘数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)]
最后,在将另一个事件发布到乘数后(同时也发布了一个新值):


我只熟悉Spark,为了让它像您描述的那样工作,您希望在收到新的乘数值时有选择地“更新”以前的结果,同时对尚未应用乘数的新值应用最高索引乘数。顺便说一句,Spark本身不允许您使用流式处理(您需要缓存和更新旧结果,还需要知道新值使用的乘数),但您可以编写逻辑,以便将“结果”主题写入常规DB表,并且在收到新乘数时,Values dataframe中的所有后续事件都将仅使用该值,但您需要进行一次性检查,以查找结果表中是否有现在需要更新的值,以使用新的乘数,并简单地更新DB表中的这些值

您的结果使用者必须能够处理插入和更新。您可以将Spark与任何DB一起使用以实现此目的


或者,您可以使用,这将ApacheSpark转变为一个可变的compute+数据平台。使用Snappy,将值和乘数作为常规流数据帧,并将结果作为数据帧设置作为SnappyData中的复制表。当您处理乘数流中的新条目时,您将更新存储在结果表中的所有结果。这可能是完成您在本程序中尝试执行的操作的最简单方法,即乘法器按键乘以值。所以你的结果会受到影响。嗯,这是相当广泛的,可以给你一个具体的答案。实际解决方案将取决于需求:“我们需要对数据做什么”。在提供的示例中,我将存储这两个流,并在需要结果时对read:ie执行操作。但根据实际场景中的应用程序需求,这可能还不够。在我们的例子中,有太多的数据流入,无法支持延迟计算。此外,我们需要做一种查询,比如“根据当前关于乘数的信息,给我所有结果值及其时间戳,其中值在X和Y之间”;在未计算结果之前,无法为该查询的结果编制索引。
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)]