我们计划实现一个Spark结构的流应用程序,它将消耗连续的数据流:度量值随时间的演变。此流应用程序将使用7天的窗口大小(和滑动窗口),以便频繁地计算过去7天的度量值的平均值。
1- Spark是否会保留所有7天的数据(对消耗的内存有很大影响),或者Spark会不断计算和更新平均请求(然后删除已处理的数据),因此不会影响消耗的内存(不会保留7天的数据)?
2-如果第一个问题的答案是这7天的数据被保留,水印的使用是否会阻止这种保留?假设我们有一个1小时的水印;Spark中将只保留1小时的数据,还是7天仍然保留在spark内存中,水印只是为了忽略新的数据,其中的datatimestamp早于1小时?
发布于 2020-10-05 21:51:47
窗口大小7绝对是一个重要的大小,但它也取决于传入的流数据量/记录。诀窍在于如何使用窗口持续时间、更新间隔、输出模式以及水印(如果业务规则不受影响)
1-如果流配置为翻滚窗口大小(即窗口持续时间与更新持续时间相同),则在完全模式下,最终可能会导致完整数据在内存中保留7天。但是,如果您将窗口持续时间配置为7天,每x分钟更新一次,则将每x分钟计算一次聚合,并且只将结果数据保留在内存中。因此,请查看window API参数并配置获取结果的方法。
2-水印带来了不同的行为,它忽略水印持续时间之前的记录,并在每个微批次超过水印时间后更新结果表。如果您的业务规则可以包含水印计算,那么也可以使用它。
在enter link description here上详细介绍应用程序接口、输出模式和水印使用情况是很好的,这将有助于选择正确的组合。
https://stackoverflow.com/questions/64204477
复制相似问题