Google cloud dataflow 与TestPipeline一起使用时滑动窗口的奇怪行为

Google cloud dataflow 与TestPipeline一起使用时滑动窗口的奇怪行为,google-cloud-dataflow,sliding-window,Google Cloud Dataflow,Sliding Window,我有一个简单的测试,演示了当与TestPipeline一起使用时滑动窗口的一种奇怪行为。基本上,一组字符串被输入,然后它们在滑动窗口中累积,然后应用总和聚合来计算重复项,最后记录聚合函数的输出。由于滑动窗口的持续时间为10分钟,持续时间为5分钟,我希望只有一个窗口用于存储所有元素(因为新窗口在第一个窗口之后的5分钟内启动) 公共类滑动窗口测试{ 私有静态PipelineOptions=PipelineOptionsFactory.create(); 私有静态最终记录器LOG=LoggerFact

我有一个简单的测试,演示了当与TestPipeline一起使用时滑动窗口的一种奇怪行为。基本上,一组字符串被输入,然后它们在滑动窗口中累积,然后应用总和聚合来计算重复项,最后记录聚合函数的输出。由于滑动窗口的持续时间为10分钟,持续时间为5分钟,我希望只有一个窗口用于存储所有元素(因为新窗口在第一个窗口之后的5分钟内启动)

公共类滑动窗口测试{
私有静态PipelineOptions=PipelineOptionsFactory.create();
私有静态最终记录器LOG=LoggerFactory.getLogger(SlidingWindowTest.class);
私有静态类IdentityDoFn扩展了DoFn
实现DoFn.RequiresWindowAccess{
@凌驾
public void processElement(ProcessContext ProcessContext)引发异常{
KV item=processContext.element();
LOG.info(“~~~~~~~~~~~>{}=>{}”,item.getKey(),item.getValue());
LOG.info(“~~~~~~~~~{}”,processContext.window());
processContext.output(项);
}
}
@试验
public void WhatsErrorWithSlidingWindow(){
Pipeline p=TestPipeline.create(选项);
p、 应用(创建(“cab”、“abc”、“a1b2c3”、“abc”、“a1b2c3”))
.应用(MapElements.via((串项目)->KV.of(项目1))
.withOutputType(新类型描述符(){}))
.apply(Window.into(滑动窗口)of(持续时间.标准分钟(10))
.每(持续时间.标准分钟(5)))
.apply(Sum.integersPerKey())
.应用(新标识的第()部分);
p、 run();
}
}
但是我被解雇了8扇窗户。TestPipeline或者我对滑动窗口工作原理的理解是否有问题

12:19:04.566 [main] DEBUG c.g.c.d.sdk.coders.CoderRegistry - Default coder for com.google.cloud.dataflow.sdk.values.KV<java.lang.String, java.lang.Integer>: KvCoder(StringUtf8Coder, VarIntCoder)
12:19:04.566 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~> abc => 2
12:19:04.567 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~~ [-290308-12-21T19:50:00.000Z..-290308-12-21T20:00:00.000Z)
12:19:04.567 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~> abc => 2
12:19:04.567 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~~ [-290308-12-21T19:55:00.000Z..-290308-12-21T20:05:00.000Z)
12:19:04.567 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~> a1b2c3 => 2
12:19:04.567 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~~ [-290308-12-21T20:00:00.000Z..-290308-12-21T20:10:00.000Z)
12:19:04.567 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~> cab => 1
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~~ [-290308-12-21T19:50:00.000Z..-290308-12-21T20:00:00.000Z)
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~> a1b2c3 => 2
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~~ [-290308-12-21T19:50:00.000Z..-290308-12-21T20:00:00.000Z)
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~> cab => 1
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~~ [-290308-12-21T19:55:00.000Z..-290308-12-21T20:05:00.000Z)
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~> abc => 2
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~~ [-290308-12-21T20:00:00.000Z..-290308-12-21T20:10:00.000Z)
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~> cab => 1
12:19:04.568 [main] INFO  c.q.m.core.SlidingWindowTest - ~~~~~~~~~~~ [-290308-12-21T20:00:00.000Z..-290308-12-21T20:10:00.000Z)
12:19:04.566[main]调试c.g.c.d.sdk.coders.CoderRegistry-com.google.cloud.dataflow.sdk.values.KV的默认编码器:KvCoder(StringUtf8Coder,VarIntCoder)
12:19:04.566[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~>abc=>2
12:19:04.567[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~[-290308-12-21T19:50:00.000Z..-290308-12-21T20:00:00.000Z)
12:19:04.567[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~>abc=>2
12:19:04.567[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~[-290308-12-21T19:55:00.000Z..-290308-12-21T20:05:00.000Z)
12:19:04.567[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~>a1b2c3=>2
12:19:04.567[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~[-290308-12-21T20:00:00.000Z..-290308-12-21T20:10:00.000Z)
12:19:04.567[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~>cab=>1
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~[-290308-12-21T19:50:00.000Z..-290308-12-21T20:00:00.000Z)
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~>a1b2c3=>2
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~[-290308-12-21T19:50:00.000Z..-290308-12-21T20:00:00.000Z)
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~>cab=>1
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~[-290308-12-21T19:55:00.000Z..-290308-12-21T20:05:00.000Z)
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~>abc=>2
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~[-290308-12-21T20:00:00.000Z..-290308-12-21T20:10:00.000Z)
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~>cab=>1
12:19:04.568[主]信息c.q.m.core.SlidingWindowTest-~~~~~~~~~~~~~[-290308-12-21T20:00:00.000Z..-290308-12-21T20:10:00.000Z)

p/S:Dataflow sdk版本:1.8.0

预期行为与您观察到的不同,但也与您预期的不同:

  • 首先,您有三个不同的键,因此,如果它们都落在一个窗口中,那么您将需要三个输出
  • 对于具有5分钟周期的10分钟滑动窗口,每个元素必须分为两个窗口。如果一个元素到达分钟
    1
    ,它将分为从
    0
    10
    的两个窗口,以及从
    -5
    5
    的窗口。因此,您应该期望六个输出值,两个将windows视为随着管道运行而更新的东西是一个常见的陷阱,而实际上它们只是输入数据的计算属性,而不是其到达时间或管道执行的属性
  • Create
    转换将输出时间戳为
    BoundedWindow.timestamp\u MIN\u VALUE
    的所有值,因此它们都应落在相同的两个窗口中
您的示例似乎表明了一个真正的错误。
“a1b2c3”
不可能位于它所处的两个不相交的窗口中,
“abc”
也不可能位于其中两个不相交的三个窗口中


顺便说一句,您可以通过签出(现在在Beam中称为)以一致和交叉的方式测试
PCollection
的内容来获益。

预期的行为与您观察到的不同,但也与您预期的不同:

  • 首先,您有三个不同的键,因此,如果它们都落在一个窗口中,那么您将需要三个输出
  • 对于具有5分钟周期的10分钟滑动窗口,每个元素必须分为两个窗口。如果一个元素到达分钟
    1
    ,它将分为从
    0
    10
    的两个窗口,以及从
    -5
    5
    的窗口。因此,您应该期望六个输出值,两个将windows视为管道运行时更新的东西是一个常见的陷阱