Spark Streaming - 基于 TIMESTAMP 字段的处理

Posted

技术标签:

【中文标题】Spark Streaming - 基于 TIMESTAMP 字段的处理【英文标题】:Spark Streaming - TIMESTAMP field based processing 【发布时间】:2017-02-14 09:17:48 【问题描述】:

我对 Spark Streaming 还很陌生,我需要一些基本的说明,但阅读文档时我无法完全理解。

用例是我有一组包含转储事件的文件,并且每个事件都已经在一个字段 TIMESTAMP 内。

目前我正在加载此文件并提取 JavaRDD 中的所有事件,我想将它们传递给 Spark Streaming,以便根据 TIMESTAMP(一种重放)收集一些统计信息。

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

如果可能的话,我是需要简单的 spark 流式传输还是需要切换到结构化流式传输?

我在这里发现了一个类似的问题: Aggregate data based on timestamp in JavaDStream of spark streaming

提前致谢

【问题讨论】:

我认为有两种解释方式。您想按照 TIMESTAMP 字段指定的顺序进行处理,还是还想保留每个事件之间的到达间隔等待时间? 酷,您是在执行聚合,例如按分钟计数,还是按 TIMESTAMP 顺序单独处理每个事件?抱歉所有问题,只是你的用例的微妙之处会对方法产生很大的影响。 嗨,我可能需要同时处理这两种情况。我的意思是我必须基于时间窗口构建一些聚合统计信息,但是为了计算其中一些计数器,我需要根据时间戳检查特定的事件到达顺序。 【参考方案1】:

TL;DR

是的,你可以使用 Spark Streaming 或 Structured Streaming,但如果我是你,我不会。

详细解答

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

但是,您的要求有很多复杂性,您解决的复杂性有多少取决于流式作业输出中不准确的成本。

Spark Streaming 不保证以任何顺序处理事件。要强制排序,您需要设置一个窗口来进行处理,以将乱序处理的风险降至可接受的水平。您需要使用足够大的数据窗口来准确捕获您的时间顺序。

您需要考虑以下几点:

如果批次失败并被重试,这将如何影响您的计数器? 如果事件迟到,您会忽略它们,重新处理整个受影响的窗口,还是更新输出?如果是后者,如何保证更新安全完成? 您是否会通过保持较大的事件窗口来最大程度地降低损坏风险,还是接受较小窗口可能导致的任何不准确性? 事件的划分是否会导致处理顺序的复杂性?

我的观点是,除非您放松对准确性的限制,否则 Spark 不是适合这项工作的工具。

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

【讨论】:

您是否看到了替代 Spark 的替代解决方案?【参考方案2】:

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

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

【讨论】:

有趣。非常感谢,我试试看 Java 中是否有类似的方法?

以上是关于Spark Streaming - 基于 TIMESTAMP 字段的处理的主要内容,如果未能解决你的问题,请参考以下文章

Real Time Credit Card Fraud Detection with Apache Spark and Event Streaming

Spark Streaming架构设计和运行机制总结

Spark Streaming基于Spark Streaming&Flume&Kafka打造通用流处理平台

Spark Streaming基于Spark Streaming&Flume&Kafka打造通用流处理平台

Spark Streaming基于Spark Streaming&Flume&Kafka打造通用流处理平台

Spark 实践——基于 Spark Streaming 的实时日志分析系统