我正在尝试使用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
它看起来与
类似我的代码
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();
}