Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud dataflow 对流管道中的不同值进行计数_Google Cloud Dataflow_Dataflow - Fatal编程技术网

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))
在第一次输出后将关闭窗口,丢弃该键的其余输入。