2014-06-25 13 views
16

Questa è una domanda relativa al funzionamento della bocca di massima in tempesta. Al momento ho uno spout che legge un file ed emette una tupla per ogni riga nel file (so che storm non è la soluzione migliore per gestire i file ma non ho scelta per questo problema). Ho impostato il becco massimo in sospeso a 50k per limitare il numero di tuple che entrano nella topologia da elaborare. Tuttavia, vedo che questo numero non ha alcun effetto nella topologia. Vedo tutti i record in un file che vengono emessi ogni volta. La mia ipotesi è che questo potrebbe essere dovuto a un ciclo che ho nel metodo nextTuple che emette tutti i record in un file. Quindi la mia domanda è: tempesta basta smettere di chiamare la tupla successiva per l'attività di spout quando viene raggiunto il limite massimo di beccheggio? Questo significa che dovrei solo emettere una tupla ogni volta che si chiama nextTuple?Tempesta di erogazione massima in attesa

risposta

18

Esattamente! Storm può limitare il beccuccio solo al comando successivo, quindi se trasmetti tutto quando ricevi il primo, non c'è modo per Storm di rallentare il beccuccio.

Gli sviluppatori Storm raccomandano di emettere una singola tupla con un singolo comando successivo. Il framework Storm quindi ridurrà il beccuccio secondo necessità per soddisfare il requisito di "massimo beccuccio in sospeso". Se stai emettendo un numero elevato di tuple, puoi mettere in batch le tue emittioni al massimo un decimo del becco massimo in sospeso, per dare a Storm la possibilità di accelerare.

+0

puoi aiutare su questo stackoverflow.com/questions/34327617/...? il topology.max.spout.pending 50000000 è in presenza di un problema? – user5520049

14

Le topologie di temporali hanno un limite massimo di beccheggio. Il valore massimo del beccheggio in attesa di una topologia può essere configurato tramite l'impostazione "topology.max.spout.pending" nella topologia file yaml di configurazione. Questo valore pone un limite al numero di tuple che possono essere in volo, ovvero non sono ancora state registrate o non sono riuscite, in una topologia Storm in qualsiasi momento. La necessità di questo parametro deriva dal fatto che Storm utilizza ZeroMQ per inviare tuple da un'attività a un'altra attività. Se il lato utente di ZeroMQ non è in grado di tenere il passo con la velocità di tuple, allora la coda ZeroMQ inizia a crescere. Alla fine tuples timeout nello spreato e viene riprodotto nella topologia aggiungendo così più pressione alle code. Per evitare questo caso di errore patologico, Storm consente all'utente di porre un limite al numero di tuple che si trovano nel volo nella topologia. Questo limite ha effetto su una attività per spout e non su un livello di topologia. Per i casi in cui gli erogatori sono inaffidabili, ovvero non emettono un id messaggio nelle loro tuple, questo valore non ha alcun effetto. Uno dei problemi che gli utenti di Storm devono continuamente affrontare è che raggiunge il valore corretto per questo becco massimo in attesa del parametro . Un valore molto piccolo può facilmente affamare la topologia e un valore sufficientemente grande può sovraccaricare la topologia con un enorme numero di tuple fino al punto di causare errori e replay. Gli utenti devono passare attraverso diverse iterazioni di topologia con le distribuzioni con diversi valori di beccheggio massimo in sospeso per trovare il valore che funziona meglio per loro.

+0

puoi aiutare in questo http://stackoverflow.com/questions/34327617/supervsior-still-hasnt-start? il topology.max.spout.pending \t 50000000 c'è un problema? –

0

Una soluzione è creare la coda di input al di fuori del metodo nextTuple e l'unica cosa da fare in nextTuple è il polling della coda e l'emissione. Se si elaborano più file, il metodo nextTuple dovrebbe anche verificare se il risultato del polling della coda è nullo e, in caso affermativo, reimpostare atomicamente il file di origine che sta compilando la coda.