带有GroupByKey的Apache Beam PubSubIO

时间:2017-11-08 15:14:00

标签: google-cloud-dataflow apache-beam google-cloud-pubsub

我正在尝试使用Apache Beam 2.1.0从google PubSub中使用简单数据(密钥,值)并按键分组以便能够处理批量数据。

默认触发“GroupByKey”之后的代码永远不会触发(我等了30分钟)。 如果我定义了自定义触发器,则会执行代码,但我想了解为什么默认触发器永远不会被触发。我尝试使用“withTimestampLabel”来定义自己的时间戳,但同样的问题。我试图改变窗口的持续时间,但同样的问题(1秒,10秒,30秒等)。

我使用命令行进行此测试以插入数据

gcloud beta pubsub topics publish test A,1
gcloud beta pubsub topics publish test A,2
gcloud beta pubsub topics publish test B,1
gcloud beta pubsub topics publish test B,2

从文档中可以看出我们可以做一个或另一个但不一定

  

如果您使用的是无界PCollections,则必须使用其中之一   非全局窗口 OR 聚合触发器,以便执行   GroupByKey或CoGroupByKey

它看起来与

类似
  1. Consuming unbounded data in windows with default trigger
  2. Scio: groupByKey doesn't work when using Pub/Sub as collection source
  3. 我的代码

    static class Compute extends DoFn<KV<String, Iterable<Integer>>, Void> {
        @ProcessElement
        public void processElement(ProcessContext c) {
            // Code never fires
            System.out.println("KEY:" + c.element().getKey());
            System.out.println("NB:" + c.element().getValue().spliterator().getExactSizeIfKnown());
        }
    }
    
    public static void main(String[] args) {
        Pipeline p = Pipeline.create(PipelineOptionsFactory.create());
    
        p.apply(PubsubIO.readStrings().fromSubscription("projects/" + args[0] + "/subscriptions/test"))
         .apply(Window.into(FixedWindows.of(Duration.standardMinutes(1))))
         .apply(
            MapElements
                .into(TypeDescriptors.kvs(TypeDescriptors.strings(), TypeDescriptors.integers()))
                .via((String row) -> {
                    String[] parts = row.split(",");
                    System.out.println(Arrays.toString(parts)); // Code fires
                    return KV.of(parts[0], Integer.parseInt(parts[1]));
                })
         )
        .apply(GroupByKey.create())
        .apply(ParDo.of(new Compute()));
    
        p.run();
    }
    

0 个答案:

没有答案