2015-09-29 29 views
8

Sto lavorando a un programma Spark Streaming che recupera un flusso Kafka, esegue una trasformazione di base nello stream e quindi inserisce i dati in un DB (voltdb se pertinente). Sto provando a misurare la velocità con cui inserisco le righe nel DB. Penso che metrics possa essere utile (usando JMX). Tuttavia non riesco a trovare come aggiungere metriche personalizzate a Spark. Ho guardato il codice sorgente di Spark e ho anche trovato this thread tuttavia non funziona per me. Ho anche abilitato il sink JMX nel file conf.metrics. Cosa non funziona è che non vedo le mie metriche personalizzate con JConsole.Metriche personalizzate di streaming Spark

Qualcuno potrebbe spiegare come aggiungere metriche personalizzate (preferibilmente tramite JMX) per generare lo streaming? O in alternativa come misurare la mia velocità di inserimento sul mio DB (in particolare VoltDB)? Sto usando la scintilla con Java 8.

risposta

13

Ok dopo aver scavato attraverso la source code ho trovato come aggiungere le mie proprie metriche personalizzate. Richiede 3 elementi:

  1. Creare la mia personalizzata source. Un po 'come this
  2. Abilita il sink Jmx nel file sparktics.properties. La linea specifica che ho usato è: *.sink.jmx.class=org.apache.spark.metrics.sink.JmxSink che abilita JmxSink per tutte le istanze
  3. Registrare la mia sorgente personalizzata nel sistema di metriche SparkEnv. Un esempio di come fare può essere visto here - Ho visto in realtà questo link prima, ma perso la parte di registrazione che mi ha impedito di vedere realmente le mie metriche personalizzate nel jvisualvm

Sto ancora lottando con il modo di contare in realtà il numero di inserzioni in VoltDB perché il codice viene eseguito sugli esecutori ma questo è un argomento per un argomento diverso :)

Spero che questo aiuterà gli altri

+0

Hai capito come contare qualsiasi cosa dagli esecutori? Ho un usecase simile in cui scrivo all'endpoint HTTP e voglio contare un sacco di cose dagli esecutori, ma i contatori non si sposteranno. –

+0

Questo è stato in realtà molto tempo fa ma, per quanto ricordo, ho inviato le mie metriche dagli esecutori usando le metriche di codahale e hanno un reporter di grafite e ho appena riassunto tutto in grafite – Gideon

+0

Ah ok, grazie per la risposta. Il mio caso d'uso è un po 'diverso, scrivendo la mia fonte e provando a inviare gli eventi allo strumento di metrica interna. –

2

Ecco un eccellente tutorial che copre tutti i setps necessari per configurare Spark's MetricsSystem con Graphite. Questo dovrebbe fare il trucco:

http://www.hammerlab.org/2015/02/27/monitoring-spark-with-graphite-and-grafana/

+0

Grazie Erik per la vostra risposta, è abbastanza utile! ma ti è capitato di aggiungere le tue metriche nel codice dell'applicazione? Non sto parlando di cose che sono già monitorate dalla scintilla ma altre cose come il tasso di inserimento di righe in VoltDB all'interno di ogni partizione? (o altre metriche personalizzate nel codice). Sto lottando con l'implementazione di misure personalizzate nella mia applicazione – Gideon

3

per inserire le righe in base a inserti da VoltDB, utilizzare accumulatori - e poi dal tuo autista puoi creare un listener - forse qualcosa del genere per iniziare

sparkContext.addSparkListener(new SparkListener() { 
    override def onStageCompleted(stageCompleted: SparkListenerStageCompleted) { 
    stageCompleted.stageInfo.accumulables.foreach { case (_, acc) => { 

qui si ha accesso a tali file accumulatori combinati e quindi è possibile inviare al vostro lavandino ..

+0

Alla fine sono andato con la raccolta di metriche per ogni esecutore e l'invio a Graphana e la somma di tutte le informazioni lì. L'ascoltatore è una buona idea :) :) – Gideon

+0

@Gideon puoi ampliarlo? Dici di aver abbandonato le normali metriche e hai fatto il lavoro da solo o le hai fatte funzionare? –

+0

Non ho eliminato le normali metriche. Ho aggiunto alcune delle mie metriche personalizzate agli esecutori di Spark. Il problema è che per queste metriche personalizzate avevo bisogno di risultati aggregati (sostanzialmente sommando gli accumulatori dai diversi esecutori) quindi quello che ho fatto è inviare i dati da ciascun esecutore Spark a Graphana e aggregare i risultati lì – Gideon

3

Groupon hanno una libreria chiamata spark-metrics che consente di utilizzare una semplice (Codahale-like) API sul tuo esecutori e ottenere i risultati fascicolati nel driver e registrati automaticamente nel registro delle metriche esistente di Spark. Questi vengono automaticamente esportati insieme alle metriche incorporate di Spark quando si configura un sink metrico come da Spark docs.

+0

Ovviamente non sono bloccato su questo problema più ma ancora, bello sapere che ci sono alcune librerie utili per quel tipo di cose. Grazie per il consiglio :) – Gideon