维护传入流数据的时间戳序列

Posted

技术标签:

【中文标题】维护传入流数据的时间戳序列【英文标题】:Maintaining timestamp sequence of incoming streaming data 【发布时间】:2020-02-18 07:16:33 【问题描述】:

所以我使用结构化流将一些 json 数据从 kafka 推送到 Spark。数据,以字典的形式,有一个字段“时间戳”。在解析 json 并为每个键获取单独的列之后,我注意到时间戳字段不在它被推送到 kafka 集群的顺序中,即

+----------+
| Timestamp|
+----------+
|     1    |
|     2    |
|     6    |  <--
|     4    |
|     5    |
|     7    |  <--
+----------+

有什么方法可以确保数据保持顺序?我能想到的一件事是在带有 output_mode="complete" 的时间戳上使用 orderby。还有其他有效的替代方案吗? 谢谢。

【问题讨论】:

Kafka 不按时间排序,仅在分区内...您的主题有多少个分区?您是否在这里一次查看多个分区?你唯一的选择是在 Spark 中订购,假设你真的需要 不知道有多少个分区,但它保留在默认配置中。能否请您指导我在 python 结构化流中排序的任何 Spark 示例? 我可以将你链接到 pyspark sql orderby 函数,但我相信你可以自己找到 【参考方案1】:

Kafka 仅保证分区内的消息顺序。如果您想在 Kafka 中进行严格的排序 - 每个主题保留一个分区并保证在交付时排序。您可能希望实现“排序服务”,它从传入队列中读取消息并将消息写入只有一个分区的另一个队列。可以在各种博客文章中找到很好的解释和示例:here 或 here 等等。

在 Spark 中排序消息是最简单的选择。您应该考虑将有序结果保存或缓存到存储中以供重复使用。

【讨论】:

如果我在 spark 中订购,我需要使用什么输出模式?此外,orderby 将处理整个数据(包括缓存)还是仅处理收到的批次? 这真的取决于你在接收器之后对数据做了什么。我可能会选择将有序数据存储到存储中的架构(假设每分钟或每小时一次),然后以分钟或小时的有序块与另一个作​​业一起流式传输

以上是关于维护传入流数据的时间戳序列的主要内容,如果未能解决你的问题,请参考以下文章

Spark结构化流 - 使用模式从文件中读取时间戳

时间戳作为 mongodb 中的键作为时间序列数据库

来自 CSV 数据的时间序列(时间戳和事件)

总结来自不同流的图,但时间戳略有不同

在流分析中将时间戳拆分为单独的列,以便在 Power BI 中进行进一步筛选

来自 CSV 数据(时间戳和事件)的时间序列图:x-label 常量