Tutorial: Einrichten eines Jupyter Notebooks in JupyterLab zum Testen und Debuggen von ETL-Skripts - AWS Glue

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Tutorial: Einrichten eines Jupyter Notebooks in JupyterLab zum Testen und Debuggen von ETL-Skripts

In diesem Tutorial wird gezeigt, wie Sie ein Jupyter Notebook mit einem Entwicklungsendpunkt verbinden, wenn JupyterLab auf Ihrem lokalen Computer ausgeführt wird. So können Sie AWS Glue-ETL-Skripts (Extract, Transform and Load) interaktiv ausführen, debuggen und testen. In diesem Tutorial wird die Secure-Shell-Portweiterleitung (SSH) verwendet, um Ihren lokalen Computer mit einem AWS Glue-Entwicklungsendpunkt zu verbinden. Weitere Informationen finden Sie unter Portweiterleitung bei Wikipedia.

Schritt 1: Installieren von JupyterLab und SparkMagic

Sie können JupyterLab mit conda oder pip installieren. conda ist ein Open-Source-Paket- und Umgebungsverwaltungssystem, das unter Windows, macOS und Linux ausgeführt werden kann. pip ist das Paketinstallationsprogramm für Python.

Unter macOS muss Xcode installiert sein, bevor Sie SparkMagic installieren können.

  1. Installieren Sie JupyterLab, SparkMagic und die zugehörigen Erweiterungen.

    $ conda install -c conda-forge jupyterlab $ pip install sparkmagic $ jupyter nbextension enable --py --sys-prefix widgetsnbextension $ jupyter labextension install @jupyter-widgets/jupyterlab-manager
  2. Überprüfen Sie das sparkmagic-Verzeichnis am Location.

    $ pip show sparkmagic | grep Location Location: /Users/username/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages
  3. Ändern Sie das Verzeichnis zu dem, das für Location zurückgegeben wurde, und installieren Sie die Kernel für Scala und PySpark.

    $ cd /Users/username/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages $ jupyter-kernelspec install sparkmagic/kernels/sparkkernel $ jupyter-kernelspec install sparkmagic/kernels/pysparkkernel
  4. Laden Sie eine einzelne config-Beispieldatei herunter.

    $ curl -o ~/.sparkmagic/config.json https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json

    In dieser Konfigurationsdatei können Sie Spark-bezogene Parameter wie driverMemory und executorCores festlegen.

Schritt 2: Starten von JupyterLab

Wenn Sie JupyterLab starten, wird automatisch Ihr Standard-Webbrowser geöffnet und die URL http://localhost:8888/lab/workspaces/{workspace_name} wird angezeigt.

$ jupyter lab

Schritt 3: Initiieren der SSH-Portweiterleitung zur Verbindung mit Ihrem Entwicklungsendpunkt

Anschließend verwenden Sie die lokale SSH-Portweiterleitung, um einen lokalen Port (in diesem Fall 8998) an das Remote-Ziel weiterzuleiten, das durch AWS Glue (169.254.76.1:8998) definiert wird.

  1. Öffnen Sie ein separates Terminalfenster, das Ihnen Zugriff auf SSH gibt. Unter Microsoft Windows können Sie die von Git for Windows bereitgestellte BASH-Shell verwenden oder Cygwin installieren.

  2. Führen Sie den folgenden SSH-Befehl aus, folgendermaßen abgeändert:

    • Ersetzen Sie private-key-file-path durch einen Pfad zu der .pem-Datei, die den privaten Schlüssel enthält, der dem öffentlichen Schlüssel entspricht, die Sie verwendet haben, um Ihren Entwicklungsendpunkt zu erstellen.

    • Wenn Sie einen anderen Port als 8998 weiterleiten, ersetzen Sie 8998 durch die Portnummer, die Sie tatsächlich lokal verwenden. Die Adresse 169.254.76.1:8998 ist der Remote-Port und wird von Ihnen nicht geändert.

    • Ersetzen Sie dev-endpoint-public-dns durch die öffentliche DNS-Adresse Ihres Entwicklungsendpunkts. Um diese Adresse zu finden, navigieren Sie zu Ihrem Entwicklungsendpunkt in der AWS Glue-Konsole, wählen den Namen aus und kopieren die öffentliche Adresse unter Public address, die auf der Seite Endpoint details (Endpunktdetails) aufgelistet ist.

    ssh -i private-key-file-path -NTL 8998:169.254.76.1:8998 glue@dev-endpoint-public-dns

    Es wird wahrscheinlich eine Warnmeldung angezeigt, die wie folgt aussieht:

    The authenticity of host 'ec2-xx-xxx-xxx-xx.us-west-2.compute.amazonaws.com (xx.xxx.xxx.xx)' can't be established. ECDSA key fingerprint is SHA256:4e97875Brt+1wKzRko+JflSnp21X7aTP3BcFnHYLEts. Are you sure you want to continue connecting (yes/no)?

    Geben Sie yes ein und lassen Sie das Terminalfenster geöffnet, während Sie JupyterLab verwenden.

  3. Überprüfen Sie, ob die SSH-Portweiterleitung mit dem Entwicklungsendpunkt korrekt funktioniert.

    $ curl localhost:8998/sessions {"from":0,"total":0,"sessions":[]}

Schritt 4: Ausführen eines einfachen Skriptfragments in einem Abschnitt des Notebooks

Jetzt sollte Ihr Notebook in JupyterLab mit Ihrem Entwicklungsendpunkt funktionieren. Geben Sie das folgende Skriptfragment in Ihr Notebook ein und führen Sie es aus.

  1. Überprüfen Sie, ob Spark erfolgreich ausgeführt wird. Der folgende Befehl weist Spark an, 1 zu berechnen und anschließend den Wert zu drucken.

    spark.sql("select 1").show()
  2. Überprüfen Sie, ob die AWS Glue Data Catalog-Integration funktioniert. Im folgenden Befehl werden die Tabellen im Data Catalog aufgelistet.

    spark.sql("show tables").show()
  3. Überprüfen Sie, ob ein einfaches Skriptfragment, das AWS Glue-Bibliotheken verwendet, funktioniert.

    Das folgende Skript verwendet die persons_json-Tabellenmetadaten im AWS Glue Data Catalog, um einen DynamicFrame aus Ihren Beispieldaten zu erstellen. Es druckt dann die Elementzahlen und das Schema dieser Daten aus.

import sys from pyspark.context import SparkContext from awsglue.context import GlueContext # Create a Glue context glueContext = GlueContext(SparkContext.getOrCreate()) # Create a DynamicFrame using the 'persons_json' table persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json") # Print out information about *this* data print("Count: ", persons_DyF.count()) persons_DyF.printSchema()

Die Ausgabe des Skripts sieht folgendermaßen aus.

Count: 1961 root |-- family_name: string |-- name: string |-- links: array | |-- element: struct | | |-- note: string | | |-- url: string |-- gender: string |-- image: string |-- identifiers: array | |-- element: struct | | |-- scheme: string | | |-- identifier: string |-- other_names: array | |-- element: struct | | |-- note: string | | |-- name: string | | |-- lang: string |-- sort_name: string |-- images: array | |-- element: struct | | |-- url: string |-- given_name: string |-- birth_date: string |-- id: string |-- contact_details: array | |-- element: struct | | |-- type: string | | |-- value: string |-- death_date: string

Fehlerbehebung

  • Wenn sich Ihr Computer hinter einem Unternehmens-Proxy oder einer Firewall befindet, können während der Installation von JupyterLab aufgrund von benutzerdefinierten Sicherheitsprofilen, die von IT-Abteilungen verwaltet werden, HTTP- und SSL-Fehler auftreten.

    Im Folgenden finden Sie ein Beispiel für einen häufig auftretenden Fehler, wenn conda keine Verbindung zu den eigenen Repositorys herstellen kann:

    CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>

    Dies kann passieren, weil Ihr Unternehmen Verbindungen zu weit verbreiteten Repositorys in Python- und JavaScript-Communitys sperren kann. Weitere Informationen finden Sie unter Installation Problems (Installationsprobleme) auf der JupyterLab-Website.

  • Wenn bei der Verbindung mit Ihrem Entwicklungsendpunkt der Fehler connection refused (Verbindung abgelehnt) auftritt, ist Ihr Entwicklungsendpunkt möglicherweise nicht mehr auf dem neuesten Stand. Versuchen Sie, einen neuen Entwicklungsendpunkt zu erstellen und erneut eine Verbindung herzustellen.