问题: 在开始连接步骤之前,Spark是否必须完成reduceByKey步骤中的所有条目的处理?
我认为答案是肯定的。我认为每个分区/任务都必须完成reduceByKey任务才能继续进行连接。
详细信息: 在下面的示例中,我通过键userId减少RDD,并将具有相同用户ID的所有值嵌套到列表中。
然后我将(userid,listOfEvents)的RDD加入另一个(userid,otherEvent)的RDD。
请注意,在此示例中,reduceByKey和join之间的分区器是相同的(userId上的默认HashParitioner),这是否会改变reduceByKey是否必须在加入之前完全处理所有数据?
在这个例子中,List(eventA,eventB)与没有eventC的事件K连接的场景永远不会发生,对吗?
但是,List(eventA,eventB,eventC)可能与事件K连接,但事件D和事件F没有减少但可能发生?
Impression Events
userId Event
1 eventA
1 eventB
1 eventC
2 eventD
2 eventF
Conversion Events
userId Event
1 eventK
2 eventL
// The Reduce Step
final JavaPairRDD<Long, ObjectArrayList<Event>> impressionRDD = loadImpressionEvents()
.mapToPair(event -> {
final ObjectArrayList<Event> list = new ObjectArrayList();
list.add(new Event(event.getTimestamp(),
event.getCampaignIdentifier(), event.getSiteIdentifier()));
return new Tuple2<>(
event.getUserId(),
list
);
})
.reduceByKey((event1, event2) -> {
// Combine impression events with the same user id
event1.addAll(event2);
return event1;
});
// The Join Step
final JavaPairRDD<Long, Tuple2<ConversionEvent, Event>> conversionImpressions = loadConversionEvents()
.mapToPair(event -> new Tuple2<>(
event.getUserId(),
event
))
.leftOuterJoin(impressionRDD);
答案 0 :(得分:1)
Spark必须先完成shuffle才能启动cogroup和flatten,因此在reduceByKey正在进行时无法启动连接。