关于存储在数据流中的中间状态的问题

时间:2016-06-30 19:30:48

标签: google-cloud-dataflow dataflow

我是数据流编程模型的新手,我对数据流在窗口化流媒体流程中存储中间状态的方式有几个疑问。假设我在白天开窗,然后进行聚合。当新事件进入时,它需要访问该窗口和组中的所有数据。

  1. 这些数据是存储在内存,磁盘,GCS还是完全不同的地方?

  2. 中间数据量是否影响数量 工作所需的机器?

  3. 窗口关闭时数据会发生什么变化?

  4. 如果我执行的求和操作(不需要将所有数据存储在中间状态),有没有办法告诉数据流只存储上次更新的结果?

1 个答案:

答案 0 :(得分:1)

  1. 在Dataflow的当前实现中,它存储在永久磁盘上(以防止机器故障)并在机会中缓存在内存中。

  2. 计算机数量会影响缓存性能和可用磁盘IOps数,从而影响每台计算机的吞吐量。中间数据也可能需要在机器之间进行混洗,从而增加了CPU的需求

  3. 窗户可能会发生两件事;它在触发器触发时触发,当水印通过窗口结束并允许延迟时关闭(并且是垃圾收集)。

    当窗口触发时,行为取决于正在使用的window accumulation mode。对于.accumulatingFiredPanes,数据会一直保留到.withAllowedLateness中的值为止。对于.discardingFiredPanes,每次触发后都会丢弃数据。

    当窗口关闭时,所有剩余数据(增量或总值)将发送到下一个变换,并清除窗口的所有数据。如果您使用的是默认触发器且0允许延迟(也是默认值),则两者都会立即发生。

  4. 是的!如果使用关联操作(称为Combiner),则中间结果将以紧凑格式存储。