2016-09-06 4 views
9

Ich habe meine benutzerdefinierte Metrik Source/Sink für meine Spark-Streaming-App geschrieben, und ich versuche, sie aus metrics.properties zu initialisieren - aber das funktioniert nicht von Executoren. Ich habe keine Kontrolle über die Maschinen im Spark-Cluster, daher kann ich die Eigenschaftendatei in $ SPARK_HOME/conf/im Cluster nicht kopieren. Ich habe es im Fettglas, in dem meine App lebt, aber zu dem Zeitpunkt, zu dem mein Fettglas auf Arbeiterknoten im Cluster heruntergeladen wird, sind die Executoren bereits gestartet und ihr Metrics-System ist bereits initialisiert - also nicht meine Datei mit angepasster Quellkonfiguration .Benutzerdefinierte Quellen-/Senke-Konfigurationen werden nicht erkannt

Nach dieser post, ich habe angegeben ‚spark.files = metrics.properties‘ und ‚spark.metrics.conf = metrics.properties‘ sondern durch die Zeit ‚metrics.properties‘ zu Vollstreckern ausgeliefert, deren metrische System bereits initialisiert.

Wenn ich mein eigenes Metriksystem initialisiere, wird es meine Datei aufnehmen, aber dann fehlen Metrik/Eigenschaften auf der Master-/Executor-Ebene (zB. Executor.sink.mySink.propName = myProp - kann 'propName' nicht lesen von 'mySink'), da sie initialized von Sparks metrischem System sind.

Gibt es einen (programmatischen) Weg, der vorsieht, dass 'metrics.properties' vor den Executoren initialize ihrem Metrikensystem ausgeliefert wird?

Update1: Ich versuche, diese auf Stand-alone-Spark-2.0.0-Cluster

Update2: Gedanken von Hacks auf dieses Ziel zu erreichen - vor Ihrem 'tatsächlichen' Funken Job starten, starten Sie einen Dummy-Job metrics.properties kopieren auf jeden Arbeiter. Starten Sie dann Ihren eigentlichen Job mit dem bekannten Dateispeicherort. Nachteile - Wenn ein Arbeiter stirbt und ein anderer Arbeiter seinen Platz einnimmt, hat er diese Datei nicht auf dem vorbekannten Pfad. Lösungsalternative: Wenn ein neuer Arbeitscomputer gestartet wird, ruft er auch metrics.properties von Ihrem git-repo ab und speichert ihn in einem vorbekannten Pfad. Obwohl es funktioniert, ist es furchtbar hacky und eine bevorzugte Lösung ist, dass Spark es intern unterstützt.

Antwort

1

sehen Spark metrics on wordcount example Grundsätzlich glaube ich, Sie brauchen --files hinzufügen, um die metrics.properties für alle Arbeitnehmer

+0

Ich habe das versucht. 2 Probleme - 1) Es kopiert nicht die "metrics.properties" auf den Treiber-Rechner - da es Dateien nur im Executor-Arbeitsverzeichnis kopieren soll. 2) Zu dem Zeitpunkt, als es diese Dateien auf Executoren kopiert, hätte das Metrics-System versucht zu initialisieren und ist fehlgeschlagen - wegen fehlender Dateien. –

1

SparkConf only load local system properties if they start with the prefix spark., tun Sie Fach Ihre Eigenschaften laden Funken Hinzufügen zu senden haben?

+0

Ich folge nicht ganz, was bedeutet das im Zusammenhang mit der Frage? –

+0

'private val masterMetricsSystem = MetricsSystem.createMetricsSystem (" master ", conf, securityMgr)' Dieser conf-Wert ist ein SparkConf, also wenn Sie in diese conf Ihre Eigenschaften einfügen können, können Sie Ihr metricsSystem mit Ihren benutzerdefinierten Eigenschaften erstellen, in deinem Beispiel spark.executor.sink.mySink.propName = myProp und lies es dann in deiner Senke. Ich habe noch nie versucht, irgendetwas mit dem metricSystem zu tun, also weiß ich nicht, ob Sie das verwenden könnten, aber ich habe die Eigenschaften eines Executors geändert, indem ich --conf zu sparkSubmit hinzugefügt habe, also hoffe ich, dass es für Sie nützlich sein wird – jlopezmat

+0

Ich habe diesen Code auch gesehen und die Eigenschaften der Metrik werden wie folgt angegeben: executor.source.mysource.class = MyClass. Danke für die Antwort, aber es funktioniert nicht. –

Verwandte Themen