gpt4 book ai didi

apache-spark - 如何只处理最后的、最相关的事件(并在延迟增长太快时跳过其他事件)?

转载 作者:行者123 更新时间:2023-12-03 09:24:37 24 4
gpt4 key购买 nike

上下文:处理来自 Kafka 的数据并将结果发送回 Kafka。

问题:每个事件都可能需要几秒钟的时间来处理(正在进行改进)。在那段时间里,事件(和 RDD)确实会累积。不必处理中间事件(按键),只需处理最后一个事件。因此,当一个进程完成时,Spark Streaming 最好跳过所有不是当前最后一个事件的事件(按键)。

我不确定仅使用 Spark Streaming API 是否可以完成该解决方案。我对Spark Streaming的理解,DStream RDD会一个一个累加处理,后面有其他的不考虑。

可能的解决方案:

  • 仅使用 Spark Streaming API,但我不确定如何使用。 updateStateByKey 似乎是一个解决方案。但我不确定当 DStream RDD 累积时它是否会正常工作,你必须只按键处理持续事件。

  • 有两个 Spark Streaming 管道。一个通过键获取最后更新的事件,将其存储在 map 或数据库中。第二个管道仅在它们是另一个管道指示的最后一个事件时才处理事件。子问题:

    • 两个管道是否可以共享相同的 sparkStreamingContext 并以不同的速度处理相同的 DStream(低处理速度与高速处理速度)?

    • 是否可以在不使用外部数据库的情况下轻松地在管道之间共享值(例如 map )?我认为累加器/广播可以工作,但我不确定在两个管道之间。

最佳答案

考虑到流式传输是一个连续的过程,因此很难定义“最后”在这种情况下的含义。但是,假设您想要在给定时间段内处理最后一个事件,例如每 10 秒运行一次处理,并且在这 10 秒帧中只为每个键获取最后一个事件 - 有几种可能的方法。

窗口方法

其中一个选项是在 DStream 上创建 window:

val windowStream = dStream.window(Seconds(10), Seconds(10))
windowStream.forEachRDD { /* process only latest events */ }

在这种情况下,windowStream 将拥有 RDD,它结合了过去 10 秒内所有 RDD 的键/值,您可以在 forEachRDD 中访问所有这些键/值,就好像您最初将它们放在单个 RDD 中一样。缺点是它不会提供有关事件如何进入流的事件排序的任何信息,但您可能在值中有事件时间信息或重用 Kafka 的偏移量

updateStateByKey 方法

基本上就像您建议的那样 - 它可以让您积累值(value)。Databricks 有一个很好的例子来说明如何做到这一点 here

虽然他们在示例中进行累加,但您可以只更新键的值

Kafka 日志压缩

虽然这不会取代在 Spark 端处理它的需要,但如果您将事件保留在 Kafka 中一段时间​​,您可能需要考虑使用 Kafka 的 Log Compaction它不能保证重复项不会从 Kafka 进入 Spark 流,但会通过仅在日志尾部保留最新键来减少 Kafka 中存储的事件数量。

关于apache-spark - 如何只处理最后的、最相关的事件(并在延迟增长太快时跳过其他事件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34635795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com