Spark Streaming - 基于TIMESTAMP字段的处理

时间:2017-02-14 09:17:49

标签: apache-spark apache-spark-sql spark-streaming

我很擅长激发流媒体,我需要一些基本的澄清,我无法完全理解阅读文档。

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

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

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

如果有可能,我是否需要简单的火花流媒体或者我需要切换到结构化流媒体?

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

提前致谢

2 个答案:

答案 0 :(得分:1)

<强> TL; DR

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

详细答案

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

但是,您的要求中存在大量复杂性,您解决的复杂程度取决于流式作业输出中的不准确成本。

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

你需要考虑以下几点:

  • 如果批次失败并重试,会对您的计数器产生怎样的影响?
  • 如果事件迟到,您会忽略它们,重新处理整个受影响的窗口,还是更新输出?如果后者如何保证更新安全完成?
  • 您是否会通过保留大型事件窗口或接受较小窗口可能产生的任何不准确性来最大限度地降低腐败风险?
  • 事件的分区会不会因处理它们的顺序而变得复杂?

我的意见是,除非你对准确性有宽松的限制,否则Spark不适合这项工作。

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

答案 1 :(得分:0)

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

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