2012-12-13 6 views
10

Ich habe mehr als 200 Jobs, die ich an und sge Cluster senden muss. Ich werde sie in zwei Fragen einreichen. Einer der Fragen hat eine Maschine, an die ich keine Jobs schicken will. Wie kann ich diese Maschine ausschließen? Das einzige, was ich fand, dass hilfreich sein könnte, wird (unter der Annahme, drei gültige Knoten zur Verfügung zu q1 und alle verfügbaren Knoten für q2 sind gültig):ohne Knoten von QSub-Befehl unter sge

qsub -q [email protected] [email protected] [email protected] q2.q 

Antwort

-1

Es gibt einen schönen Bypass zu diesem.

generieren eine einfache Bash-Datei:

#!/bin/bash 
sleep 6000 #replace 6000 with any long period of time that will be enough to submit your jobs 

übermitteln diese Jobs an den Knoten, den Sie ausschließen möchten, bis sie es vollständig besetzen.

Wuala, Ihr Knoten ist auszuschließen.

+0

Dies ist ein Hack, aber die einzige Lösung, die für mich funktioniert (+1). Ich versuchte ein Dutzend qsub-Varianten, aber sie machen entweder keinen Unterschied oder führen zu einem Fehler .... – DaveFar

2

Der beste Weg, den ich gefunden habe, ist eine benutzerdefinierte Ressource auf den Knoten einzurichten, für die Sie die Ausführung zulassen möchten, und dann diese Ressource benötigen, wenn Sie den Auftrag senden.

In qmon, gehen Sie zur "komplexen" Konfiguration und fügen Sie ein neues Attribut hinzu. Setzen Sie den Namen auf etwas wie "my_allowed" und die Verknüpfung zu etwas wie "m_a", den Typ zu BOOL, die Beziehung zu ==, anforderbar zu Ja, Verbrauchsmaterial zu Nein und "Hinzufügen". Übernehmen Sie Ihre Änderungen an den komplexen Konfigurationen.

Der nächste Schritt ist wahrscheinlich einfacher über die Befehlszeile auszuführen, aber Sie können es auch in qmon tun. Sie müssen Ihr Verbrauchsmaterial jedem Host hinzufügen, auf dem der Job ausgeführt werden soll. In qmon können Sie zur Hostkonfiguration wechseln, den Ausführungshost auswählen und jeden Host der Reihe nach öffnen, indem Sie auf die Registerkarte Verbrauchsmaterialien/feste Attribute klicken und den oben konfigurierten neuen Komplex mit "True" als Wert hinzufügen. Über die Befehlszeile können Sie eine Liste Ihrer Ausführungshosts mit "qconf -sel" abrufen. Diese Liste eignet sich zum Übergeben an eine Schleife und zum Auskreuzen der Hosts, die nicht enthalten sein sollen. Tun Sie etwas wie folgt aus:

qconf -sel | grep -v host_to_exclude | while read host; do 
    EDITOR="ed" qconf -me $h <<EOL 
/complex_values/s/$/,my_test=True/ 
w 
q 
EOL 
done 

Auf diese Weise können Sie programmatisch den Host bearbeiten (normalerweise nicht von qconf erlaubt, wie es will Editor für Sie starten). Dazu müssen Sie den Editor auf "ed" setzen (Sie müssen sicherstellen, dass der Ed-Editor installiert ist ... versuchen Sie es zuerst mit der Hand auszuführen ... geben Sie "q" ein, um auszusteigen). ed nimmt die Liste der Editierbefehle auf seiner stdin, also geben wir drei Befehle. Der erste bearbeitet die Zeile mit den complex_values, um den Wert my_test einzubeziehen. Die zweite schreibt die temporäre Datei aus und die dritte beendet ed.

Sobald Sie dies getan haben, Ihre Aufträge mit einem Limit Option einreichen, die Ihren neuen Komplex erfordert:

qsub -q whatever -l my_test=True my_prog.sh 

Die Option -l setzt eine Grenze und die my_test = True sagt der Job nur auf laufen Hosts, die den Komplex my_test mit dem Wert True aufweisen. Da der Komplex nicht konsumierbar ist, kann er immer noch so viele Jobs auf jedem Host ausführen, wie er möchte (bis zum Slot-Limit für die Hosts), aber er vermeidet Hosts, bei denen der my_test-Komplex nicht auf True gesetzt ist .

15

Angenommen, Sie möchten es nicht ausführen heißt n4 dann Hinzufügen des folgenden zu Ihrem Skript sollte funktionieren.

#$ -l h=!n4 
+2

Ich bekomme "qsub: submit error (Unbekannter Ressourcentyp Resource_List.h)" – dranxo

+0

Danke.Wie kannst du das mit zwei Hostnamen machen? '# $ -l h =! n4 h! = n5' oder' # $ -l h! = n4, n5' funktioniert nicht – Arman

+0

h =! h4 &! h5 oder h =! (h4 | h5) sollten es tun. –