Google cloud dataflow 对流管道中的不同值进行计数
我有一条管道看起来像Google cloud dataflow 对流管道中的不同值进行计数,google-cloud-dataflow,dataflow,Google Cloud Dataflow,Dataflow,我有一条管道看起来像 pipeline.apply(PubsubIO.read.subscription("some subscription")) .apply(Window.into(SlidingWindow.of(10 mins).every(20 seconds) .triggering(AfterProcessingTime.pastFirstElementInPane()
pipeline.apply(PubsubIO.read.subscription("some subscription"))
.apply(Window.into(SlidingWindow.of(10 mins).every(20 seconds)
.triggering(AfterProcessingTime.pastFirstElementInPane()
.plusDelayOf(20 seconds))
.withAllowedLateness(Duration.ZERO)
.accumulatingFiredPanes()))
.apply(RemoveDuplicates.create())
.apply(Window.discardingFiredPanes()) // this is suggested in the warnings under https://cloud.google.com/dataflow/model/triggers#window-accumulation-modes
.apply(Count.<String>globally().withoutDefaults())
pipeline.apply(PubsubIO.read.subscription(“一些订阅”))
.每(20秒)应用(窗口)到(滑动窗口)(10分钟)
.触发(后处理time.pastFirstElementInPane()
.plusDelayOf(20秒))
.允许延迟(持续时间为零)
.累积FiredPanes())
.apply(RemovedUpplicates.create())
.apply(Window.discardingFiredPanes())//下面的警告中建议这样做https://cloud.google.com/dataflow/model/triggers#window-积累模式
.apply(Count.globally().withoutDefaults())
这条管道显著地计算了不同的值(20倍于正常值)。起初,我怀疑默认触发器可能导致了这个问题。我已经调整使用触发器,允许不迟到/丢弃已发射的窗格/使用处理时间,所有这些都有类似的过计数问题
我还尝试了ApproximateUnique.globally
:它在管道构造期间失败,因为出现了如下异常
如果输出PCollection未被GlobalWindows打开窗口,则Combine.global()中不支持默认值。似乎无法在没有默认值的情况下将添加到它(就像我们使用Count.global
)
在数据流/波束流管道中,是否有推荐的方法以合理的精度进行计数(不同)
另外,我正在使用Java Dataflow SDK 1.9.0。您的代码看起来不错;它不应该计算过多。请注意,您正在将每个元素放置到30个窗口中,因此如果您有一个窗口(相当于折叠所有滑动窗口),您将期望的元素数量正好是30倍。如果您可以展示更多的管道或如何观察计数,这可能会有所帮助 除此之外,我还有一些关于管道的建议:
- 我建议将
移除副本的触发器更改为
;这将在较低的延迟下获得相同的结果,因为稍后到达的元素不会产生任何影响。此触发器和您当前的触发器永远不会重复触发。因此,实际上设置后窗格。元素计数至少(1)
还是累积FiredPanes()
并不重要。这很好,因为这两种方法都无法处理管道的其余部分丢弃FiredPanes()
- 我会在
计数之前安装一个新触发器。原因有点技术性,但我将尝试描述一下:
- 在您当前的管道中,安装在那里的触发器(RemovedUpplicates的触发器的“continuation trigger”)记录第一个元素的到达时间,并等待直到它接收到在该处理时间或之前生成的所有元素(由上游工人测量)。有一些不确定性,因为它双关本地处理时间和其他工人的处理时间
- 如果您听从我的建议,将触发器切换为
,则继续触发器将是RemovedUpplicates
,因此它将始终尽快发出计数,然后丢弃进一步的数据,这是非常错误的AfterPane.ElementCount至少(1)
AfterPane.elementcount至少(1)
downcount?鉴于此触发器将在至少有一个元素时发出窗口,因此RemoveDuplicate
在大多数情况下只会有一个元素?如果您反复使用。forever(AfterPane.elementcountatlast(1))
,则您将收到多个输出,其中大部分只包含一个元素。但是只使用AfterPane.elementCountAtlast(1))
在第一次输出后将关闭窗口,丢弃该键的其余输入。