流处理架构:未来事件影响过去结果
stream processing architecture: future events effect past results
我是流处理(kafka 流/flink/storm/spark 等)的新手,并试图找出处理现实世界问题的最佳方法,这里用一个玩具示例表示。我们的 pubsub/data 摄取依赖于 Kafka,但在流处理器方面没有特别的依恋 framework/approach.
理论上,假设我有一个源偶尔发出浮点值。此外,在任何给定点,都应将乘数 M 应用于该源的值;但是 M 可以改变,而且关键的是,我可能会在很久以后才知道这个改变——甚至可能不会 "in change order."
我正在考虑在 Kafka 中将其表示为
"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.
然后我会想创建一个输出主题,比如 "Results",使用标准流处理框架,连接两个流,并且仅将值中的每个值与乘数确定的当前乘数相乘.
但是,根据我的理解,这是行不通的,因为发布到 Multipliers 的新事件可能会对已写入结果流的结果产生任意大的影响。从概念上讲,我想要一个类似于结果流的东西,它是截至最后一个事件发布到 Multipliers 针对 Values 中的所有值,但它可以是 "recalculated" 随着进一步的 Values 或 Multipliers 事件进入。
使用 kafka 和主要流处理器 achieving/architecting 有哪些技巧?
示例:
最初,
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)]
最后,在另一个事件发布到 Multipliers 之后(也发出了一个新值):
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)]
我只熟悉 Spark,为了让它像你描述的那样工作,你希望有选择地 "update" 在收到新乘数值时以前的结果,同时将最高索引乘数应用于新值尚未对其应用乘数。 AFAIK,Spark 本身不会让你使用流式处理(你需要缓存和更新旧结果,你还需要知道哪个是用于新值的乘数),但你可以编写逻辑您的 "results" 主题到常规数据库 table,并且当您收到一个新的乘数时,Values 数据框中的所有后续事件都将只使用该值,但您会进行一次检查以查找是否存在是结果 table 中的值,现在需要更新它们以使用新的乘数并简单地更新数据库 table 中的这些值。
您的结果使用者必须能够处理插入和更新。您可以将 Spark 与 has a connector 的任何数据库一起使用来实现此目的。
或者,您可以使用 SnappyData,它将 Apache Spark 变成一个 mutable 计算 + 数据平台。使用 Snappy,您可以将 Values 和 Multipliers 作为常规流数据帧,并将结果作为数据帧设置为 SnappyData 中的复制 table。当您处理乘数流中的新条目时,您将更新存储在结果 table 中的所有结果。这可能是完成您正在尝试做的事情的最简单方法
我是流处理(kafka 流/flink/storm/spark 等)的新手,并试图找出处理现实世界问题的最佳方法,这里用一个玩具示例表示。我们的 pubsub/data 摄取依赖于 Kafka,但在流处理器方面没有特别的依恋 framework/approach.
理论上,假设我有一个源偶尔发出浮点值。此外,在任何给定点,都应将乘数 M 应用于该源的值;但是 M 可以改变,而且关键的是,我可能会在很久以后才知道这个改变——甚至可能不会 "in change order."
我正在考虑在 Kafka 中将其表示为
"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.
然后我会想创建一个输出主题,比如 "Results",使用标准流处理框架,连接两个流,并且仅将值中的每个值与乘数确定的当前乘数相乘.
但是,根据我的理解,这是行不通的,因为发布到 Multipliers 的新事件可能会对已写入结果流的结果产生任意大的影响。从概念上讲,我想要一个类似于结果流的东西,它是截至最后一个事件发布到 Multipliers 针对 Values 中的所有值,但它可以是 "recalculated" 随着进一步的 Values 或 Multipliers 事件进入。
使用 kafka 和主要流处理器 achieving/architecting 有哪些技巧?
示例:
最初,
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)]
最后,在另一个事件发布到 Multipliers 之后(也发出了一个新值):
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)]
我只熟悉 Spark,为了让它像你描述的那样工作,你希望有选择地 "update" 在收到新乘数值时以前的结果,同时将最高索引乘数应用于新值尚未对其应用乘数。 AFAIK,Spark 本身不会让你使用流式处理(你需要缓存和更新旧结果,你还需要知道哪个是用于新值的乘数),但你可以编写逻辑您的 "results" 主题到常规数据库 table,并且当您收到一个新的乘数时,Values 数据框中的所有后续事件都将只使用该值,但您会进行一次检查以查找是否存在是结果 table 中的值,现在需要更新它们以使用新的乘数并简单地更新数据库 table 中的这些值。
您的结果使用者必须能够处理插入和更新。您可以将 Spark 与 has a connector 的任何数据库一起使用来实现此目的。
或者,您可以使用 SnappyData,它将 Apache Spark 变成一个 mutable 计算 + 数据平台。使用 Snappy,您可以将 Values 和 Multipliers 作为常规流数据帧,并将结果作为数据帧设置为 SnappyData 中的复制 table。当您处理乘数流中的新条目时,您将更新存储在结果 table 中的所有结果。这可能是完成您正在尝试做的事情的最简单方法