提问者:小点点

Apache光束无界流水线窗口化


我有一个在Dataflow中运行的无界Apache Beam管道,它执行一组非常简单的指令:

  1. 它读取一个pubsub消息(PubsubIO)
  2. 它从消息中提取时间戳,从BigQuery中提取数据,将结果解析为KV值(DoFn)
  3. Windows将数据放入3秒的固定窗口(Window PTransform)
  4. 按键分组(预转换)
  5. 一个名为SplitterLogicFn(DoFn)的DoFn

我希望看到的是,当第2步开始产生数据时,每个KV都会在当前3秒的固定窗口中被标记在一起,这样它就可以在第4步中与第2步中定义的键一起批处理。然而,我看到的是数据没有流过GroupByKey步骤(见下图),这对我来说意味着我没有正确设置窗口。

p.apply("Reading input",
        PubsubIO.readMessages()
            .fromSubscription(INPUT_SUBSCRIPTION)
            .withDeadLetterTopic(DL_TOPIC))
        .apply("Reading data",
            ParDo.of(new ReadPlanFromBqFn()))
        .apply(Window.into(FixedWindows.of(Duration.standardSeconds(3))))
        .apply(GroupByKey.create())
        .apply("Splitting store/item combinations",
            ParDo.of(new SplitItemCombos()))

我错过了什么?

更新:

以下是我尝试过的其他事情的列表:

  • 分组为批次:
.apply(GroupIntoBatches.<Integer, FieldValueList>ofSize(100)
            .withMaxBufferingDuration(Duration.standardSeconds(1)))
  • 添加触发器:
.apply(Window.<FieldValueList>into(FixedWindows.of(Duration.standardSeconds(1)))
            .triggering(Repeatedly.forever(AfterWatermark.pastEndOfWindow()))
                .withAllowedLateness(Duration.standardSeconds(3))
                .discardingFiredPanes()
            )


共1个答案

匿名用户

我认为这里缺少触发器,它将告诉Beam窗口何时真正触发,而不仅仅是它们将如何组合在一起(窗口)。

看看https://beam.apache.org/documentation/programming-guide/#setting-a-trigger.