EMR und Jupyter Notebooks auf dem iPad

Elastic Map Reduce ist eine sehr effektive Art, Spark-Cluster ad hoc und On-Demand zu betreiben. Mit etwas Hilfe des AWS SDKs für Python, SSHTunnel und Juno ist die Nutzung sogar mit dem iPad möglich. Doch der Reihe nach. Wie in meinem Blogeintrag über Amazon Rekognition beschrieben, lässt sich das AWS SDK für Python mit Namen boto3 auch mit Hilfe von Pythonista ausführen. Damit lässt sich auf die Eleastic Map Reduce API zugreifen welche wiederum benötigt wird um vollautomatische, parametrisierte Hadoop und Spark-Cluster beliebiger Größe zu starten.

Über Bootstrap-Actions lassen sich mit Hilfe einfacher Bash-Scripte, lassen sich auf den zu startenden Workern und dem Master des Clusters,  noch zusätzliche Software installieren. Das Script selber kann man einfach innerhalb eines entsprechenden S3-Buckets ablegen. Die Entwicklung eines solchen Scripts ist zeitaufwendig, da der kleinste Fehler zu einem Abbruch der Cluster-Initialisierung führen kann (welche mitunter mehrere Minuten in Anspruch nehmen kann). Ich habe ein etwas aufwändigeres Bootstrap-Script auf GitHub abgelegt, welches sich an dem Script von Nicola anlehnt. Es installiert auf dem Master mit Miniconda den Packetmanager von Anaconda. Damit werden dann im nächsten Schritt Python-Pakete wie matplotlib, plotly, scikit-learn und Jupyter Notebook installiert. Damit die Notebooks nach Beendigung des Clusters nicht weg sind, wird s3fs-fuse genutzt um diese in S3 zu schreiben. Das Bootstrap-Script hängt das entsprechende Bucket so in das Dateisystem des Masters ein, dass dieser ganz normal darauf zugreifen kann. 

Die Initalisierung des Clusters dauert gern um die 15 Minuten. Schuld daran ist zum großen Teil die Installation der Software auf dem Master. Ein EMR-Cluster lässt sich in zwei Modi betreiben: Entweder mann startet eine Analyse-Pipeline oder man startet das Cluster einfach um damit iterativ zu arbeiten. Pipelines, welche im EMR-Kontext „job flows“ heißen, werden dazu genutzt in regelmäßigen Abständen, ein oderer mehrere MapReduce-, Hive-, Impala-, Presto- oder Spark-Jobs auszuführen. Um mit Jupyter Notebooks zu arbeiten zu können, wird nur ein Job-Flow-Element benötigt. Dieses wartet nach seinem Start einfach, statt das Cluster nach getaner Arbeit wieder zu terminieren. Diese Eigenschaft von EMR machen wir uns zu nutze.

Um nach dem Start des Jupyter Dienstes auf die Notebooks zugreifen zu können, muss den Master ein entsprechender SSH-Tunnel auf das etabliert werden. Auf dem Mac oder Linux würde man dies über die Kommanzozeile mit
ssh -N -L localhost:8889:localhost:8889 hadoop@ec2-XX-XXX-XX-XXX.eu-west-1.compute.amazonaws.com -i ~/.ssh/key.pem
bewerkstelligen um auf dem lokalen Port 8889 einen Verbindung zum entfernten Port 8889 (2. Parameter) aufzubauen. Auf dem iPad funktioniert das nicht so ohne weiteres. Hier kommt die App SSH Tunnel ins Spiel, welche sowohl einen direktes als auch ein dynamisches Portforwarding unterstützt. Diese App ist leider nicht kostenlos aber jeden Eurocent wert, wenn man viel mit Cloud-Anwendungen in geschützten Umgebungen arbeitet. In den Verbindungseinstellungen lassen sich die nötigen Parameter einstellen und auch der private Schlüssel für den SSH-Zugriff kann via Zwischenablage genutzt werden. Als Standardnutzer wird hadoop von EMR genutzt. Sind alle Parameter konfiguriert, kann die Verbindung aufgebaut werden. SSH Tunnel hält die Verbindung auch nach Wechsel in eine andere App offen.

Im Bootstrap-Script habe ich Port 8889 für Jupyter Notebook konfiguriert und ein Passwort für die Anmeldung vergeben. Steht der Tunnel, kann ich über den Jupyter Notebook Client Juno auf den Master zugreifen und mich einloggen. Praktisch dabei: Juno zeigt schon bei der Verbindungskonfiguration an, ob der entfernte Host erreichbar ist.

Da ich ein Passwort für den Jupyter Notebook-Login gewählt habe, muss ich dieses auch in Juno eingeben.

Danach steht die Nutzung von Jupyter Notebooks auf EMR mit Speicherung im S3 nichts mehr im Wege.

Nach erfolgreicher Arbeit kann das Cluster mit Hilfe von boto3 auch wieder runtergefahren werden. Dazu speichert man seine Notebooks und wechselt wieder nach Pythonista um das entsprechende Stop-Script zu starten. Dieses nutzt die terminate_job_flow() um alle aktiven Cluster anzuzeigen und alle zu terminieren.

Quellen:

  • https://aws.amazon.com/de/blogs/big-data/running-jupyter-notebook-and-jupyterhub-on-amazon-emr/
  • https://bytes.babbel.com/en/articles/2017-07-04-spark-with-jupyter-inside-vpc.html
  • http://blog.yantrajaal.com/2017/04/emr-cluster.html

Schreibe einen Kommentar


(required)

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.