2015-11-24 22 views

risposta

5

Se Flink esegue programmi iterativi, il grafico del flusso di dati non è un DAG ma consente cicli. Tuttavia, questi cicli non sono arbitrari e devono seguire un certo schema per consentire a Flink di controllare questo flusso ciclico in qualche modo.

Spesso non esiste un motivo tecnico rigoroso in altri sistemi per non supportare i cicli. Consentire i cicli in modo generico è solitamente proibito perché potrebbe generare un ciclo infinito (cioè, che una tupla gira il ciclo per sempre e il programma non termina).

Flink traccia il ciclo contando il numero di iterazione. In questo modo, Flink può tenere traccia di quale tupla appartiene a quale iterazione e può ad esempio evitare che le tuple della nuova iterazione "prendano il sopravvento" sulle tuple di una volta. Inoltre, consente a Flink di rilevare se il risultato dell'iterazione n e n+1 sono uguali o meno. Un risultato uguale indica un calcolo finito che consente a Flink di interrompere il ciclo infinito e di terminare (ciò vale per le cosiddette iterazioni del punto fisso).

Per uno sguardo lettura dettagliata a questo documento di ricerca: https://dl.acm.org/citation.cfm?id=2350245

L'utilizzo di iterazione nel vostro programma è descritto qui: https://ci.apache.org/projects/flink/flink-docs-release-0.10/apis/programming_guide.html#iteration-operators

+1

Tecnicamente, Flink non assegnare un contatore di iterazione per ogni tupla. Esegue invece ogni iterazione e quindi attende che tutti gli elementi siano stati elaborati per questa iterazione. Solo allora, viene avviata la prossima iterazione. –

+1

Aggiornato la mia risposta. Il downvote è abbastanza difficile ... :) –