2016-07-06 15 views
1

問題: 在開始加入步驟之前,Spark是否必須完成處理reduceByKey步驟中的所有條目?在啓動加入步驟之前,Spark是否必須完成reduceByKey步驟中的所有條目的處理?這取決於reduceByKey的結果嗎?

我認爲答案是否定的。我認爲每個分區/任務在移動到聯接之前必須完成reduceByKey任務。

詳情: 在下面的例子中,我減少關鍵用戶id的RDD,和鳥巢都具有相同的用戶ID到列表中的值。

然後,我將(userid,listOfEvents)的此RDD與另一個RDD(userid,otherEvent)結合在一起。

請注意,在此示例中,reduceByKey和join之間的分區程序是相同的(userId上的默認HashParitioner),那麼reduceByKey是否必須在聯接之前完全處理所有數據纔會發生此變化?

在這個例子中,List(eventA,eventB)與EventK沒有eventC連接的場景永遠不會發生,對嗎?

但是,List(eventA,eventB,eventC)可能與Event K結合在一起,但EventD和Event 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

星火具有協同組之前完成洗牌和扁平可以啓動,因此無法啓動加入而reduceByKey正在進行中。

+0

是的,它會...... – 2016-07-06 21:39:31

相關問題