Apache spark Spark Streaming-基于时间戳字段的处理

Apache spark Spark Streaming-基于时间戳字段的处理,apache-spark,apache-spark-sql,spark-streaming,Apache Spark,Apache Spark Sql,Spark Streaming,我是spark streaming的新手,我需要一些我在阅读文档时无法完全理解的基本说明 用例是我有一组包含转储事件的文件,每个事件都已经在一个字段时间戳中 目前,我正在加载这个文件并提取JavaRDD中的所有事件,我希望将它们传递给Spark Streaming,以便根据时间戳(一种重播)收集一些统计数据 我的问题是,是否可以使用事件时间戳作为时间参考而不是机器的实际时间来处理这些事件(很抱歉这个愚蠢的问题) 如果可能,我需要简单的spark流媒体还是需要切换到结构化流媒体 我在这里发现了一个

我是spark streaming的新手,我需要一些我在阅读文档时无法完全理解的基本说明

用例是我有一组包含转储事件的文件,每个事件都已经在一个字段时间戳中

目前,我正在加载这个文件并提取JavaRDD中的所有事件,我希望将它们传递给Spark Streaming,以便根据时间戳(一种重播)收集一些统计数据

我的问题是,是否可以使用事件时间戳作为时间参考而不是机器的实际时间来处理这些事件(很抱歉这个愚蠢的问题)

如果可能,我需要简单的spark流媒体还是需要切换到结构化流媒体

我在这里发现了一个类似的问题:

提前感谢TL;DR

是的,你可以使用Spark流媒体或结构化流媒体,但如果我是你,我不会

详细答案

对不起,这个问题没有简单的答案。如果需要单独检查每个事件,则Spark Streaming对于每个事件处理可能更好。结构化流媒体将是一种更好的方式来执行聚合和任何不需要按事件工作的处理

然而,在您的需求中有一大堆的复杂性,您处理的复杂性有多大取决于流作业输出中不准确的代价

Spark Streaming不保证事件将以任何形式的顺序进行处理。要实施订购,您需要设置一个窗口,在该窗口中进行处理,以将无序处理的风险降至可接受的水平。您需要使用足够大的数据窗口来准确地捕获您的时间顺序

您需要考虑以下几点:

  • 如果批处理失败并重试,这将如何影响您的计数器
  • 如果事件延迟到达,您会忽略它们,重新处理整个受影响的窗口,还是更新输出?如果是后者,您如何保证安全完成更新
  • 您是否会通过保持一个较大的事件窗口来最大限度地降低腐败风险,或接受较小窗口可能产生的任何不准确信息
  • 事件的分区是否会按处理顺序导致复杂性
我的观点是,除非你放松了对准确性的限制,否则Spark不是适合这份工作的工具


我希望这在某种程度上有所帮助。

使用Spark SQL(在批处理或结构化流式处理中)基于事件时间进行聚合很容易。您只需要在时间戳列上按时间窗口分组。例如,以下内容将按1分钟的间隔存储数据,并给出每个存储桶的计数

df.groupBy(window($"timestamp", "1 minute") as 'time)
  .count()

我认为有两种方式来解释这一点。您是想按照时间戳字段规定的顺序处理,还是还想保留每个事件之间的到达间隔等待时间?酷,您是在执行聚合,例如按分钟计数,还是单独并按时间戳顺序处理每个事件?对于所有的问题,我很抱歉,只是您的用例的微妙之处将对方法产生重大影响。嗨,我可能需要处理这两种场景。我的意思是,我必须基于时间窗口构建一些聚合的统计数据,但是为了计算一些计数器,我需要基于timestamp.interest检查特定的事件到达顺序。非常感谢,我将尝试在Java中使用类似的方法吗?您看到替代Spark的其他解决方案了吗?