Spark结构化流-状态流处理中具有Window操作的事件处理

时间:2019-10-18 06:04:24

标签: java apache-spark spark-structured-streaming

我不熟悉Spark结构化流处理,目前正在研究一个用例,其中结构化流应用程序将从Azure IoT中心-事件中心(例如,每20秒之后)获取事件。

任务是消耗这些事件并实时处理它。为此,我在Spark-Java中编写了以下Spark结构化流程序。

以下是重点

  1. 目前我已将窗口操作应用了10分钟 间隔和5分钟的滑动窗口。
  2. 将水印间隔10分钟应用于eventDate参数。
  3. 当前我不执行任何其他操作,而只是将其以Parquet格式存储在指定位置。
  4. 程序将一个事件存储在一个文件中。

问题:

  1. 是否可以将多个事件以拼写格式存储在文件中 基于窗口时间?
  2. 在这种情况下,窗口操作如何工作?
  3. 我还要检查以前的事件的状态,并根据一些计算(例如5分钟未收到事件),我想更新状态。

...

SELECT JSON_OBJECT('post_id', T1.post_id, 'user_id', T1.user_id,
                   JSON_ARRAYAGG(
        JSON_OBJECT('post_id', T2.post_id, 'saved_name', T2.saved_name,
GROUP_CONCAT(T2.saved_name ORDER BY  T2.post_id ASC)))) AS 'file_Name' 
FROM posts AS T1 INNER JOIN files AS T2 ON T1.post_id = T2.post_id   
group by T1.post_id ORDER BY created_date DESC

...

对此的任何帮助或指导都将很有用。

感谢和问候,

Avinash Deshmukh

1 个答案:

答案 0 :(得分:0)

  

是否可以根据窗口时间将多个事件以拼写格式存储在文件中?

是的

  

在这种情况下,窗口操作如何工作?

以下代码是Spark结构化流应用程序的主要部分:

Dataset<Row> devWindowDataset = messageDataset
  .withWatermark("eventDate", "10 minutes")
  .groupBy(
    functions.col("deviceID"),
    functions.window(functions.col("eventDate"), "10 minutes", "5 minutes"))
  .count();

这表示基础状态存储区应保持每个deviceIDeventDate的状态10分钟,并保留额外的10 minutes(每个withWatermark的状态以延迟事件。换句话说,一旦事件在流式查询开始后eventDate 20分钟后,您就会看到结果出来。

withWatermark用于后期事件,因此即使groupBy会产生结果,也只有在超过水印阈值时才会发出结果。

并且每10分钟(加上10分钟的水印)和5分钟的窗口幻灯片执行相同的程序。

groupBywindow运算符一起考虑为多列聚合。

  

我还要检查上一个事件的事件状态,并根据一些计算(例如5分钟未收到事件),我想更新状态。

这听起来像是KeyValueGroupedDataset.flatMapGroupsWithState运算符的用例(又名任意有状态流聚合)。请咨询Arbitrary Stateful Operations

也可能只需要众多aggregation standard functionsuser-defined aggregation function (UDAF)之一。