Apache spark Spark Streaming-ReduceByKey不会批量删除同一密钥的重复项

Apache spark Spark Streaming-ReduceByKey不会批量删除同一密钥的重复项,apache-spark,mapreduce,java-8,apache-kafka,spark-streaming,Apache Spark,Mapreduce,Java 8,Apache Kafka,Spark Streaming,我的Spark流媒体应用程序(AWS EMR纱线集群上的Spark 2.0)侦听基于实时库存源的活动,批量持续时间为5秒。应用程序使用Kafka DirectStream,根据提要源,有三个流。正如代码片段中所给出的那样,我正在进行三个流的联合,并尝试根据客户和活动ID删除使用reduceByKey接收的重复活动。我可以看到在同一批中针对同一密钥发送了大量重复的电子邮件。我希望reduceByKey能够根据客户和活动ID在一批中删除重复的活动。在日志中,我甚至打印了密钥,在发送电子邮件之前的批处

我的Spark流媒体应用程序(AWS EMR纱线集群上的Spark 2.0)侦听基于实时库存源的活动,批量持续时间为5秒。应用程序使用Kafka DirectStream,根据提要源,有三个流。正如代码片段中所给出的那样,我正在进行三个流的联合,并尝试根据客户和活动ID删除使用reduceByKey接收的重复活动。我可以看到在同一批中针对同一密钥发送了大量重复的电子邮件。我希望reduceByKey能够根据客户和活动ID在一批中删除重复的活动。在日志中,我甚至打印了密钥,在发送电子邮件之前的批处理时间,我可以清楚地看到副本。我可以看到在reduceByKey函数中添加log后删除了一些重复项,但它并没有完全消除

JavaDStream<Campaign> matchedCampaigns = stream1.transform(CmpManager::getMatchedCampaigns)
            .union(stream2).union(stream3).cache();

JavaPairDStream<String, Campaign> uniqueCampaigns = matchedCampaigns.mapToPair(campaign->{
        String key=campaign.getCustomer()+"_"+campaign.getId();
        return new Tuple2<String, Campaigns>(key, campaign);
    })
.reduceByKey((campaign1, campaign2)->{return campaign1;});

uniqueCampaigns.foreachRDD(CmpManager::sendEmail);
JavaDStream matchedCampaigns=stream1.transform(CmpManager::getMatchedCampaigns)
.union(stream2.union(stream3.cache());
JavaPairDStream uniqueCampages=matchedCampages.mapToPair(活动->{
String key=campaign.getCustomer();
返回新的Tuple2(键、活动);
})
.reduceByKey((活动1,活动2)->{return-campait1;});
uniqueCampaigns.foreachRDD(CmpManager::sendmail);
我不知道我在这里哪里出错了。请帮我解决这个奇怪的问题。以前我们使用createStream来监听Kafka队列(分区数为1),在这里我们没有遇到这个问题。但是当我们转到directStream(分区数为100)时,我们可以在高负载下轻松地重现这个问题


注意:我甚至尝试了reduceByKey和Window,持续时间为5秒,而不是reduceByKey操作,但即使这样也无济于事

我认为问题在于,您希望删除未定义的多集中的重复项(因为您没有像窗口那样设置边界)。实际上,您需要的是一个滑动窗口(时间或元组),您可以在其中删除重复项:
uniquecampaiments.reduceByAndWindow((c1,c2)=>c1,Seconds(10),Seconds(1))
但是,由于Spark无法处理事件时间,此操作的结果仍然是不确定的,因此即使流中的事件发生在使用的窗口长度内,您仍然会得到重复的结果。您所说的“多集”是什么意思?我尝试了uniqueCampaigns.reduceByKeyAndWindow((c1,c2)=>c1,秒(5),秒(5))。它不起作用。我有没有办法只用Spark来删除复制品?