Der ipython-Cluster wird lokal gestartet, sobald ipyparallel installiert ist. Dies ist jedoch nicht interessant. Daher habe ich das Verteilungsziel in AWS festgelegt. Memorandum.
Nutzer --Client (lokaler Computer)
Cluster
Controller/Hub (EC2)
Engine (EC2)
Die hier erklärte Geschichte ist eine solche Komposition. Da jeder Host über SSH verbunden ist, müssen alle Verbindungsinformationen im Voraus eingerichtet werden. Eigentlich wäre es einfacher, wenn Sie die Mühe hätten, ein AMI vorzubereiten, das als Knoten für Engine fungiert, indem Sie es einfach starten.
Erstellen Sie gegebenenfalls eine Instanz unter Amazon Linux.
Hier habe ich "Amazon Linux AMI 2015.09 (HVM)" verwendet und es mit t2.micro in der Region Tokio erstellt.
Nach der Installation installieren Sie "ipython" und "ipyparallel".
sudo yum groupinstall -y 'Development Tools'
sudo pip install ipython ipyparallel
Hier wird die Engine über SSH gestartet. Stellen Sie daher sicher, dass Sie mit ec2-user ohne Kennwort vom Controller zum Engine-Server ssh können.
ipython profile create --parallel --profile=myprofile
Dadurch wird eine Datei wie die folgende generiert.
tree .ipython/profile_myprofile/
~/.ipython/profile_myprofile/
├── ipcluster_config.py
├── ipcontroller_config.py
├── ipengine_config.py
├── ipython_config.py
├── ipython_kernel_config.py
├── log
├── pid
├── security
└── startup
└── README
Wir werden Einstellungen für den Clusterbetrieb vornehmen.
ipcluster_config.py
Fügen wir am Anfang den folgenden Code hinzu.
ipcluster_config.py
c = get_config()
c.IPClusterEngines.engine_launcher_class = 'SSHEngineSetLauncher'
c.SSHEngineSetLauncher.engines = {
'<ENGINE_HOST1>' : 3,
'<ENGINE_HOST2>' : 3
}
ipcontroller_config.py
Suchen Sie den auskommentierten Teil im Inneren und schreiben Sie den entsprechenden Teil neu.
ipcontroller_config.py
...Unterlassung...
c.IPControllerApp.reuse_files = True
...Unterlassung...
c.RegistrationFactory.ip = u'*'
...
Wenn reuse_files auf True gesetzt ist, werden die Dateien unter .ipython / profile_ <PROFILE_NANE> / security / wiederverwendet. Wenn es wiederverwendet wird, wird der Clusterschlüssel nicht neu generiert, sodass Sie die Konfigurationsdatei nicht jedes Mal aktualisieren müssen, wenn Sie den Controller neu starten.
Führen Sie den folgenden Befehl auf dem Server des Controllers aus.
ipcluster start --profile=myprofile
Wenn Sie eine detailliertere Ausgabe wünschen, verwenden Sie die Option "--debug". Außerdem lautet die Protokolldatei ".ipython / profile_myprofile / log /".
Wenn alles gut geht, sehen Sie nach dem Start des Controllers ein Protokoll, das aussieht, als hätten Sie "ipcontroller-client.json" und "ipcontroller-engine.json" auf jeden Knoten übertragen. Wenn der Controller nicht gestartet werden kann, werden die "ipcontroller- *" -bezogenen Dateien nicht generiert. (Wenn der Controller nicht gestartet werden kann, wird eine Meldung ausgegeben, dass der Controller beiläufig gestoppt wurde, und es wird angezeigt, dass ipcontroller-client.json nicht auf jeden Engine-Knoten übertragen werden kann. Dies ist unfreundlich.)
2015-10-04 11:15:21.568 [IPClusterStart] Engines appear to have started successfully
Wenn ein solches Protokoll angezeigt wird, ist der Startvorgang abgeschlossen.
Wenn Sie es zu einem Daemon machen möchten, fügen Sie die Option "--daemonize" hinzu.
Von nun an werde ich es von der lokalen Maschine aus tun.
Diese Datei wird beim Starten des Controllers erstellt.
Legen Sie diese Datei mit scp oder etwas lokal auf dem Client ab.
scp ec2-user@<CONTROLLER_HOST>:./.ipython/profile_myprofile/security/ipcontroller-client.json ./
Hier habe ich das folgende Bestätigungsskript vorbereitet, während ich mich auf verschiedene Dinge bezog.
cluster_check.py
from ipyparallel import Client
rc = Client("ipcontroller-client.json", sshserver="ec2-user@<CONTROLLER_HOST>")
print rc.ids
dview = rc[:]
@dview.remote(block=True)
def gethostname():
import socket
return socket.getfqdn()
print gethostname()
Wenn Sie es damit ausführen, sollte es so aussehen.
$ python cluster_check.py
[0, 1, 2, 3, 4, 5]
[<HOSTNAME>, <HOSTNAME>, <HOSTNAME>, <HOSTNAME2>, <HOSTNAME2>, <HOSTNAME2>]
Wenn Sie die obigen Einstellungen befolgen, sollten Sie jeweils 3 Hosts booten.
Jetzt kann ipython cluster die Verarbeitung auf mehrere Knoten verteilen.
Wie der obige Code für die Operationsprüfung müssen Sie den erforderlichen Import usw. in den Code ausführen, der auf mehreren Knoten ausgeführt wird.
Verwenden Sie die Dekoratoren @ require
und @ abhäng
, um Code auszuführen, der auf diesem Knoten ordnungsgemäß ausgeführt werden kann. (Bitte beziehen Sie sich auf diesen Bereich)
Verwenden Sie LoadBalancedView, wenn Sie Aufgaben nacheinander auf mehreren Knoten verarbeiten möchten.
In [1]: from ipyparallel import Client
In [3]: a = Client("ipcontroller-client.json", sshserver="ec2-user@<CONTROLLER_HOST>")
In [4]: views = a.load_balanced_view()
In [5]: result = views.map_async(lambda x: x*x , (x for x in xrange(10000)))
In [6]: result
Out[6]: <AsyncMapResult: <lambda>>
Dieses Beispiel ist verschwenderisch, da es einen Wert an einen anderen Controller überträgt, den Lambda-Ausdruck überträgt, ihn jeder Engine separat zuordnet, das Ergebnis für alle Listenelemente berechnet und empfängt. Es ist ein guter Ort, aber es ist nur ein Beispiel.
In [8]: result.progress
Out[8]: 8617
In [9]: result.progress
Out[9]: 9557
In [11]: result.progress
Out[11]: 10000
In [12]: result.ready()
Out[12]: True
In [13]: result
Out[13]: <AsyncMapResult: finished>
In [14]: len(result.result)
Out[14]: 10000
In [15]: type(result.result)
Out[15]: list
Bitte beachten Sie, dass wenn Sie unachtsam auf ".result" zugreifen, es gesperrt wird, bis die verteilte Verarbeitung abgeschlossen ist.
So ist es jetzt möglich, Cluster zu erstellen und eine verteilte Verarbeitung durchzuführen.
Ich dachte, Ipython sei nur eine "praktische Repl-Umgebung", aber das ist erstaunlich.
Es scheint schwierig zu sein, Knoten dynamisch zu sichern oder die Anzahl der Cluster entsprechend der Last zu erhöhen oder zu verringern, aber vor allem ist es ein Traum, dass der durch die Lokalisierung des Verteilungsziels erstellte Code auf eine groß angelegte Verteilung übertragen werden kann. Macht es im Gegenteil Spaß, Code ausführen zu können, der in einer umfangreichen Distribution wie im lokalen Modus funktioniert? Mit zunehmender Größe wird das Cluster-Management wahrscheinlich eine weitere Herausforderung darstellen.
Ich habe es sehr oft als Referenz benutzt.
http://qiita.com/chokkan/items/750cc12fb19314636eb7
Recommended Posts