2016-04-05 23 views
14

Nello sparkming, ogni intervallo batch di dati genera sempre un solo RDD, perché si utilizza foreachRDD() per foreach RDD? RDD è solo uno, non è necessario foreach. Nel mio test, non ho mai visto RDD più di uno.Qual è il significato della funzione DStream.foreachRDD?

+0

Hai effettivamente capito la risposta alla fine? – thebluephantom

+0

http://asyncified.io/2017/02/10/why-you-might-be-misusing-sparks-streaming-api/ – thebluephantom

risposta

25

Un "flusso discretizzato" è un'astrazione che interrompe un flusso continuo di dati in piccoli blocchi. Questo è chiamato "microbatching". Ogni microbatch diventa un RDD che viene dato a Spark per un'ulteriore elaborazione. C'è un solo RDD prodotto per ogni DStream a ogni intervallo di batch.

Un RDD è una raccolta distribuita di dati. Consideralo come un insieme di indicatori a cui i dati effettivi si trovano in un cluster.

DStream.foreachRDD è un "operatore di output" in Spark Streaming. Permette di accedere agli RDD sottostanti del DStream per eseguire azioni che facciano qualcosa di pratico con i dati. Ad esempio, utilizzando foreachRDD è possibile scrivere dati in un database.

La piccola svolta mentale qui è capire che un DStream è una collezione con limiti di tempo. Mi permetta di contrastare questo con una collezione classica: Prendere un elenco di utenti e applicare un foreach ad esso:

val userList: List[User] = ??? 
userList.foreach{user => doSomeSideEffect(user)} 

Ciò si applica la funzione side-effettuando doSomeSideEffect ad ogni elemento della collezione userList.

Ora, diciamo che non conosciamo tutti gli utenti ora, quindi non possiamo creare un elenco di essi. Invece, abbiamo un flusso di utenti, come le persone che arrivano in un negozio di caffè durante punta del mattino:

val userDStream: DStream[User] = ??? 
userDstream.foreachRDD{usersRDD => 
    usersRDD.foreach{user => serveCoffee(user)} 
} 

Nota che:

  • il DStream.foreachRDD ti dà una RDD[User], non un singolo utente. Tornando al nostro esempio di caffè, è la collezione di utenti che è arrivata durante un certo intervallo di tempo.
  • per accedere a singoli elementi della raccolta, è necessario operare ulteriormente sull'RDD. In questo caso, sto utilizzando uno rdd.foreach per servire il caffè a ciascun utente.

Per pensare all'esecuzione: potremmo avere un gruppo di baristi che fanno il caffè. Questi sono i nostri esecutori. Spark Streaming si occupa di creare un piccolo gruppo di utenti (o ordini) e Spark distribuirà il lavoro attraverso i baristi, in modo da poter parallelizzare la preparazione del caffè e accelerare il servizio del caffè.

+0

@guo vedere anche la mia presentazione su Spark Streaming. Ha una spiegazione animata di come funziona: https://www.youtube.com/watch?v=mgvYg-0OXkU – maasg

+1

Grazie per la correzione relativa alla partizione/RDD. Non ne ero consapevole. –

+0

Ciò che sembra strano è che l'astrazione fornisce un 'Iterator [RDD [T]]'. C'è un caso in cui più di un DStream sarà disponibile durante tale iterazione? –

Problemi correlati