在开始依赖于reduceByKey结果的连接步骤之前,Spark是否必须完成reduceByKey步骤中所有条目的处理?

时间:2016-07-06 19:44:20

标签: apache-spark

问题: 在开始连接步骤之前,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);

1 个答案:

答案 0 :(得分:1)

Spark必须先完成shuffle才能启动cogroup和flatten,因此在reduceByKey正在进行时无法启动连接。