大窗口大小的Spark结构化流:内存消耗

时间:2020-10-05 07:51:14

标签: apache-spark spark-structured-streaming

我们计划实现一个Spark结构化流应用程序,该应用程序将消耗连续的数据流:度量值随时间的演变。 此流应用程序将使用7天的窗口大小(和一个滑动窗口),以便经常计算过去7天的指标值的平均值。

1- Spark将保留这7天的所有数据(影响很多内存消耗),或者Spark连续计算并更新所请求的平均值(然后清除已处理的数据),因此不会影响这么多的内存消耗(不保留7天的数据)?

2-如果第一个问题的答案是保留了那7天的数据,使用水印是否会阻止这种保留? 假设我们的水印为1小时;会在Spark中仅保留1个小时的数据,还是在Spark内存中保留7天,而这里的水印仅用于忽略数据时间戳超过1小时的新数据?

1 个答案:

答案 0 :(得分:0)

窗口大小7绝对是一个重要的值,但它还取决于流进的数据量/记录。技巧在于如何使用窗口持续时间,更新间隔,输出模式以及必要时使用水印(如果业务规则不受影响)

1-如果将流配置为具有滚动窗口大小(即,窗口持续时间与更新持续时间相同),则在完整模式下,您可能会将全部数据保存在内存中7天。但是,如果将窗口持续时间配置为7天,每x分钟更新一次,则将每x分钟计算一次汇总,并且仅将结果数据保存在内存中。因此,请查看窗口API参数并配置获取结果的方式。

2-水印带来了不同的行为,它忽略了水印持续时间之前的记录,并在每个微型批处理超过水印时间之后更新结果表。如果您的业务规则可以包含水印计算,也可以使用它。

最好在enter link description here仔细查看API,输出模式和水印使用情况 这将有助于选择正确的组合。