我是数据流编程模型的新手,我对数据流在窗口化流媒体流程中存储中间状态的方式有几个疑问。假设我在白天开窗,然后进行聚合。当新事件进入时,它需要访问该窗口和组中的所有数据。
这些数据是存储在内存,磁盘,GCS还是完全不同的地方?
中间数据量是否影响数量 工作所需的机器?
窗口关闭时数据会发生什么变化?
如果我执行的求和操作(不需要将所有数据存储在中间状态),有没有办法告诉数据流只存储上次更新的结果?
答案 0 :(得分:1)
在Dataflow的当前实现中,它存储在永久磁盘上(以防止机器故障)并在机会中缓存在内存中。
计算机数量会影响缓存性能和可用磁盘IOps数,从而影响每台计算机的吞吐量。中间数据也可能需要在机器之间进行混洗,从而增加了CPU的需求
窗户可能会发生两件事;它在触发器触发时触发,当水印通过窗口结束并允许延迟时关闭(并且是垃圾收集)。
当窗口触发时,行为取决于正在使用的window accumulation mode。对于.accumulatingFiredPanes
,数据会一直保留到.withAllowedLateness
中的值为止。对于.discardingFiredPanes
,每次触发后都会丢弃数据。
当窗口关闭时,所有剩余数据(增量或总值)将发送到下一个变换,并清除窗口的所有数据。如果您使用的是默认触发器且0允许延迟(也是默认值),则两者都会立即发生。
是的!如果使用关联操作(称为Combiner),则中间结果将以紧凑格式存储。