z. Ich brauche eine Liste aller verfügbaren Executoren und ihrer jeweiligen Multithreading-Kapazität (NICHT die gesamte Multithreading-Kapazität, sc.defaultParallelism behandelt das schon).
Da dieser Parameter implementierungsabhängig ist (YARN und spark-standalone haben unterschiedliche Strategien für die Zuweisung von Kernen) und situationsbedingt (er kann aufgrund der dynamischen Zuweisung und des langfristigen Joblaufs schwanken). Ich kann keine andere Methode verwenden, um dies zu schätzen. Gibt es eine Möglichkeit, diese Informationen mithilfe der Spark-API in einer verteilten Umwandlung abzurufen? (Z. B. TaskContext, SparkEnv)
UPDATE Wie für Spark 1.6 habe ich die folgenden Methoden versucht:
1) Führen Sie einen 1-stufigen Job mit vielen Partitionen (& gt; & gt; defaultParallelism) aus und zählen Sie die Anzahl der eindeutigen threadIDs für jede executorID:
%Vor%Dies führt jedoch zu einer höheren Schätzung als die tatsächliche Multithreading-Kapazität, da jeder Spark-Executor einen überproportionalen Thread-Pool verwendet.
2) Ähnlich wie 1, außer dass n = defaultParallesim ist, und in jeder Aufgabe eine Verzögerung hinzugefügt wird, um zu verhindern, dass Resource Negotiator unausgewogenes Sharding durchführt (ein schneller Knoten erledigt seine Aufgabe und fragt nach mehr, bevor langsame Knoten starten können):
%Vor%es funktioniert die meiste Zeit, aber ist viel langsamer als notwendig und kann durch sehr unausgeglichene Cluster- oder Aufgabenspekulation gebrochen werden.
3) Ich habe es nicht versucht: Verwenden Sie Java Reflection, um BlockManager.numUsableCores zu lesen, dies ist offensichtlich keine stabile Lösung, die interne Implementierung kann sich jederzeit ändern.
Bitte sagen Sie mir, ob Sie etwas Besseres gefunden haben.
Es ist ziemlich einfach mit Spark Rest API. Sie müssen die Anwendungs-ID erhalten:
%Vor%URL:
%Vor%und Abfrage:
%Vor%Mit Apache HTTP-Bibliothek (bereits in Spark-Abhängigkeiten, angepasst von Ссылка ) ):
%Vor%und json4s:
%Vor%Solange Sie die Anwendungs-ID und die ui-URL zur Hand haben und den ui-Port für externe Verbindungen öffnen, können Sie von jeder Aufgabe dasselbe tun.
Ich würde versuchen, SparkListener
ähnlich wie bei der Web-UI zu implementieren. Dieser Code < a> könnte als Beispiel hilfreich sein.
Tags und Links scala multithreading distributed-computing apache-spark