Java Apache梁流在两个无界PCollection上通过键连接

Java Apache梁流在两个无界PCollection上通过键连接,java,google-cloud-dataflow,apache-beam,Java,Google Cloud Dataflow,Apache Beam,我有两个无界的dKafKaio PCollection,我对其应用基于标记的CoGroupByKey,固定窗口为1分钟,但是在加入时,大部分时间集合似乎错过了一些具有相同键的测试数据的一个标记数据。请查找下面的代码片段 KafkaIO.readevent1=; 读事件2=。。。; PCollection event1Data=p.applyevent1.without元数据 .applyValues.create .applymaplements.via新的SimpleFunction{ @覆盖

我有两个无界的dKafKaio PCollection,我对其应用基于标记的CoGroupByKey,固定窗口为1分钟,但是在加入时,大部分时间集合似乎错过了一些具有相同键的测试数据的一个标记数据。请查找下面的代码片段

KafkaIO.readevent1=; 读事件2=。。。; PCollection event1Data=p.applyevent1.without元数据 .applyValues.create .applymaplements.via新的SimpleFunction{ @覆盖公共KV applyString输入{ 日志信息提取; ..//一些处理 返回KV.ofrecord.getmyKey,record.getmyValue; } } .applyWindow.into 固定窗口。持续时间。标准分钟1; PCollection event2Data=p.applyevent2.without元数据 .applyValues.create .applymaplements.via新的SimpleFunction{ @覆盖公共KV applyString输入{ 日志信息提取; ..//一些处理 返回KV.ofrecord.getmyKey,record.getmyValue; } } .applyWindow.into 固定窗口。持续时间。标准分钟1; 最终TupleTag event1Tag=新TupleTag; 最终TupleTag event2Tag=新TupleTag; PCollection kvpCollection=KeyedPCollectionTuple .ofevent1标签,event1数据 .andevent2Tag,event2Data .applyCoGroupByKey.create; PCollection finalResultCollection= kvpCollection.applyJoin,ParDo.of 新DoFn{ @过程元素 公共void processElementProcessContext c引发IOException{ KV e=c元件; Iterable event1Values=e.getValue.getAllevent1Tag; Iterable event2Values=e.getValue.getAllevent2Tag; 如果event1.iterator.hasNext&&event2.iterator.hasNext{ //处理event1和event2数据并写入c输出 }否则{ System.out.PrintLn无法加入event1和event2; } } };
对于上面的代码,当我开始为两个卡夫卡主题使用一个公共密钥泵送数据时,它永远不会加入,即无法加入event1和event2,如果我做错了什么,请告诉我,或者有没有更好的方法在一个公共密钥上加入两个无限的PCollection。

我想我多少解决了这个问题,CoGroupByKey上的两个无界源触发了默认触发器,因此当新事件到达两个源时,它试图立即应用联接操作,因为没有为我的steam联接管道配置数据驱动触发器。我将所需的触发丢弃FiredPanes(带有Allowedlateness属性)配置到我的窗口函数中,该函数解决了我的流连接用例。

我最近遇到了类似的问题。根据beam文档,要在无界PCollections键值PCollection上使用CoGroupByKey transfrom,具体来说,所有PCollection都应该具有相同的窗口和触发策略。因此,由于您使用的是流式/无界集合,因此必须使用触发器在特定时间间隔后根据触发策略触发并发出窗口输出。此触发器应连续触发,因为您在此处处理流数据,即永远重复使用触发器。您还需要在带窗口的PCollection上应用累加/丢弃选项,以告诉beam在触发触发器后应该做什么,即累加丢弃窗格的结果。使用此窗口、触发器和累加策略后,应使用CoGroupByKey变换使用公共键对多个无界PCollection进行分组

大概是这样的:

PCollection<KV<String, Employee>> windowedCollection1
                    = collection1.apply(Window.<KV<String, DeliveryTimeWindow>>into(FixedWindows.of(Duration.standardMinutes(5)))
                    .triggering(Repeatedly.forever(AfterPane.elementCountAtLeast(1)))
                    .withAllowedLateness(Duration.ZERO).accumulatingFiredPanes());


PCollection<KV<String, Department>> windowedCollection2
                    = collection2.apply(Window.<KV<String, DeliveryTimeWindow>>into(FixedWindows.of(Duration.standardMinutes(5)))
                    .triggering(Repeatedly.forever(AfterPane.elementCountAtLeast(1)))
                    .withAllowedLateness(Duration.ZERO).accumulatingFiredPanes());
然后使用CoGroupByKey:

final TupleTag<Employee> t1 = new TupleTag<>();
final TupleTag<Department> t2 = new TupleTag<>();

PCollection<KV<String, CoGbkResult>> groupByKeyResult =
                    KeyedPCollectionTuple.of(t1,windowedCollection1)
.and(t2,windowedCollection2) 
                            .apply("Join Streams", CoGroupByKey.create());
现在可以在ParDo变换中处理分组的PCollection


希望这有帮助

您能否分享修复程序的代码片段,因为它可能会帮助其他人。您能否更具体地说明为使事情正常运行所做的更改?您使用了哪种触发类型的固定会话?我也有同样的问题。不管你使用哪个窗口,如果你只添加触发器,它只会具体化一次,这对有界数据很好,对于无界数据,我做了类似的事情,反复触发。永远你的触发器