维护传入流数据的时间戳序列
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 将处理整个数据(包括缓存)还是仅处理收到的批次? 这真的取决于你在接收器之后对数据做了什么。我可能会选择将有序数据存储到存储中的架构(假设每分钟或每小时一次),然后以分钟或小时的有序块与另一个作业一起流式传输以上是关于维护传入流数据的时间戳序列的主要内容,如果未能解决你的问题,请参考以下文章