2015-04-16 11 views
15

Quando si esegue in un cluster, se accade qualcosa di sbagliato, un lavoratore muore generalmente (arresto JVM). Può essere causato da molti fattori, la maggior parte delle volte è una sfida (la più grande difficoltà con la tempesta?) Per scoprire cosa causa l'incidente.Monitoraggio del lavoratore in caso di tempesta apache

Ovviamente, il supervisore di tempesta riavvia i lavoratori morti e la vivacità è piuttosto buona all'interno di un cluster di temporali, tuttavia un incidente di lavoro è un disastro che dovremmo evitare in quanto aggiunge sovraccarico, latenza (può essere molto lungo finché non viene trovato un lavoratore morto e rigenerato) e perdita di dati se non hai progettato la topologia per impedirlo.

Esiste un modo semplice/strumento/metodologia per verificare quando e perché un operatore tempesta si blocca? Non sono mostrati in storm-ui (mentre i supervisori sono mostrati), e tutto ha bisogno di un monitoraggio manuale (con jstack + JVM opta per esempio) con molta cura.

Qui ci sono alcuni casi che possono accadere:

  • timeout e molte possibili ragioni: lento di raccolta dei rifiuti java, cattivo di rete, cattivo dimensionamento in configurazione timeout. L'unico risultato che otteniamo nativamente dai registri supervisore è "stato: timeout" o "stato: non consentito" che è scadente. Inoltre, quando un lavoratore muore, le statistiche su storm-ui vengono riavviate. Man mano che ti spaventerai dei timeout, finirai per utilizzare quelli lunghi che non sembrano essere una buona soluzione per l'elaborazione in tempo reale.
  • alta contropressione con comportamento inaspettato, battiti del cuore affamati e induzione di un timeout, ad esempio. Acking sembra essere l'unico modo per affrontare la contropressione e richiede una buona preparazione dei bulloni in base al carico. Il non tacere sembra essere un no-go in quanto, in effetti, farebbe schiantare i lavoratori e ottenere risultati negativi alla fine (anche meno dati elaborati rispetto a una topologia acking sotto pressione?).
  • eccezioni di runtime del codice, a volte non mostrate in storm-ui che richiedono il controllo manuale dei registri delle applicazioni (il caso più semplice).
  • perdite di memoria che possono essere rilevate con i dump JVM.
+0

I timeout e la contropressione non sembrano crash di JVM, sono comportamenti dell'applicazione. Avete bisogno di un monitoraggio generale per tutte le macchine virtuali nella vostra rete o state provando a diagnosticare un problema specifico in modo approfondito? – the8472

+0

@ the8472 si hai ragione, questo è legato alla tempesta. Un worker è un processo java con una sua istanza JVM gestita da una tempesta. La cosa cattiva è che fallisce sempre silenziosamente (quasi nulla nei registri dei lavoratori). Viene generato e/o ucciso da un altro processo java chiamato "storm-supervisor" che non registra troppo. Ho fatto questa domanda, quindi forse possiamo definire qui un metodo corretto per monitorare i crash dei lavoratori e rendere più facili le attività di debug. – zenbeni

+1

Immagino che il primo passo sarebbe capire se i lavoratori vengono spenti dal supervisore o uscire impuri a causa di condizioni di errore all'interno del processo. Diverse potenziali cause probabilmente devono essere attaccate in modo diverso. – the8472

risposta

1

I registri supervisore tempesta si riavviano entro il timeout. è possibile monitorare il registro supervisore, inoltre è possibile monitorare le prestazioni del metodo di esecuzione (tupla) del bullone.

Per quanto riguarda la perdita di memoria, dal momento che il supervisore della tempesta uccide -9 l'operatore, è probabile che il dump dell'heap sia corrotto, quindi utilizzerei strumenti che monitorano l'heap in modo dinamico o uccidono il supervisore per produrre i dump dell'heap tramite jmap. Inoltre, prova a monitorare i log gc.

Raccomando ancora di aumentare i timeout predefiniti.

Problemi correlati