PySpark-Jobs auf Dataproc werden von einem Python-Interpreter auf dem Cluster ausgeführt. Der Jobcode muss zur Laufzeit mit der Version und den Abhängigkeiten des Python-Interpreters kompatibel sein.
Interpreter-Version und -Module prüfen
Das folgende Beispielprogramm check_python_env.py prüft den Linux-Nutzer, der den Job ausführt, den Python-Interpreter und die verfügbaren Module.
import getpass import sys import imp print('This job is running as "{}".'.format(getpass.getuser())) print(sys.executable, sys.version_info) for package in sys.argv[1:]: print(imp.find_module(package))
Programm starten
REGION=region gcloud dataproc jobs submit pyspark check_python_env.py \ --cluster=my-cluster \ --region=${REGION} \ -- pandas scipy
Beispielausgabe:
This job is running as "root".
('/usr/bin/python', sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0))
(None, '/usr/local/lib/python2.7/dist-packages/pandas', ('', '', 5))
(None, '/usr/local/lib/python2.7/dist-packages/scipy', ('', '', 5))
Dataproc-Image-Python-Umgebungen
In den folgenden Abschnitten werden die Python-Umgebungen für verschiedene Cluster mit Dataproc-Imageversionen beschrieben.
Dataproc-Image-Version 1.5
Miniconda3 ist auf Dataproc-Clustern der Version 1.5 installiert.
Der Standard-Interpreter ist Python 3.7, der sich auf der VM-Instanz unter /opt/conda/miniconda3/bin/python3.7 befindet. Python 2.7 ist auch unter /usr/bin/python2.7 verfügbar.
Sie können conda- und pip-Pakete in der base-Umgebung installieren oder Ihre eigene conda-Umgebung auf dem Cluster mit Conda-bezogenen Clusterattributen einrichten.
Wenn Sie Python 2.7 als Standard-Interpreter in einem 1.5-Cluster verwenden möchten, verwenden Sie beim Erstellen des Clusters nicht die optionale Anaconda-Komponente. Verwenden Sie stattdessen die Initialisierungsaktion conda, um Miniconda2 zu installieren, und Conda-bezogene Clusterattribute, um conda- und pip-Pakete in der base-Umgebung zu installieren, oder richten Sie Ihre eigene conda-Umgebung auf dem Cluster ein.
Beispiel
REGION=region gcloud dataproc clusters create my-cluster \ --image-version=1.5 \ --region=${REGION} \ --metadata='MINICONDA_VARIANT=2' \ --metadata='MINICONDA_VERSION=latest' \ --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh \ --properties=^#^dataproc:conda.packages='pytorch==1.0.1,visions==0.7.1'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'
Dataproc-Image-Version 2.x
conda ist auf Dataproc-Clustern der Version 2.x installiert. Der Standard-Python3-Interpreter befindet sich auf der VM-Instanz unter /opt/conda/default/bin. Auf den folgenden Seiten wird die in Dataproc-Image-Versionen enthaltene Python-Version aufgeführt:
Der nicht standardmäßige Python-Interpreter des Betriebssystems ist unter /usr/bin/ verfügbar.
Sie können conda- und pip-Pakete in der base-Umgebung installieren oder Ihre eigene conda-Umgebung auf dem Cluster mit Conda-bezogenen Clusterattributen einrichten.
Beispiel
REGION=region gcloud dataproc clusters create my-cluster \ --image-version=2.0 \ --region=${REGION} \ --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'
Hinweis: Anaconda ist für Dataproc 2.0-Cluster nicht verfügbar.
Probleme beim Herunterladen von Paketen vermeiden
Dataproc-Clusterknoten laden Pakete aus externen öffentlichen Python-Repositories herunter, wenn benutzerdefinierte conda- und pip-Pakete installiert werden (siehe Conda-bezogene Clusterattribute).
Um Fehler bei der Clustererstellung aufgrund der Nichtverfügbarkeit öffentlicher Python-Repositories zu vermeiden, sollten Sie ein benutzerdefiniertes Dataproc-Image erstellen oder die Abhängigkeiten in einen Cloud Storage-Bucket hochladen (siehe Abhängigkeiten mit Clustern nur mit interner IP herunterladen).
Python-Interpreter für einen Job auswählen
Wenn in Ihrem Cluster mehrere Python-Interpreter installiert sind, führt das System /etc/profile.d/effective-python.sh aus. Dabei wird die Umgebungsvariable PYSPARK_PYTHON exportiert, um den Standard-Python-Interpreter für Ihre PySpark-Jobs auszuwählen. Wenn Sie für einen PySpark-Job einen nicht standardmäßigen Python-Interpreter benötigen, legen Sie beim Senden des Jobs an den Cluster die Attribute spark.pyspark.python und spark.pyspark.driver.python auf die erforderliche Python-Versionsnummer fest (zum Beispiel "python2.7" oder "python3.6").
Beispiel
REGION=region gcloud dataproc jobs submit pyspark check_python_env.py \ --cluster=my-cluster \ --region=${REGION} \ --properties="spark.pyspark.python=python2.7,spark.pyspark.driver.python=python2.7"
Python mit Sudo
Wenn Sie eine SSH-Verbindung zu einem Clusterknoten herstellen, auf dem Miniconda oder Anaconda installiert ist, und sudo python --version ausführen, kann sich die angezeigte Python-Version von python --version unterscheiden.
Dieser Versionsunterschied kann auftreten, weil sudo das Standardsystem Python /usr/bin/python verwendet und /etc/profile.d/effective-python.sh nicht ausführt, um die Python-Umgebung zu initialisieren.
Wenn Sie sudo verwenden möchten, suchen Sie nach dem Python-Pfad, der in /etc/profile.d/effective-python.sh festgelegt ist. Führen Sie dann den Befehl env aus, um PATH auf diesen Python-Pfad festzulegen. Hier ist ein Beispiel für einen Cluster mit 1.5:
sudo env PATH=/opt/conda/default/bin:${PATH} python --version
Conda-bezogene Clusterattribute verwenden
Sie können die conda-Umgebung während der Clustererstellung mit Conda-bezogenen Clusterattributen anpassen.
Es gibt zwei gegenseitige exklusive Möglichkeiten, die Conda-Umgebung anzupassen, wenn Sie einen Dataproc-Cluster erstellen:
Verwenden Sie das Clusterattribut
dataproc:conda.env.config.uri, um eine neue Conda-Umgebung im Cluster zu erstellen und zu aktivieren. oderVerwenden Sie die Clusterattribute
dataproc:conda.packagesunddataproc:pip.packages, um derconda-Umgebungbaseauf dem Clusterconda- undpip-Pakete hinzuzufügen.
Conda-bezogene Clusterattribute
dataproc:conda.env.config.uri:Der absolute Pfad zu einer YAML-Konfigurationsdatei für die Conda-Umgebung, die sich in Cloud Storage befindet. Diese Datei wird zum Erstellen und Aktivieren einer neuenconda-Umgebung im Cluster verwendet.Beispiel:
Rufen Sie eine Conda-
environment.yaml-Konfigurationsdatei ab oder erstellen Sie sie. Sie können die Datei manuell erstellen, eine vorhandene Datei verwenden oder eine vorhandene Conda-Umgebung mit dem folgenden Befehl in eineenvironment.yaml-Datei exportieren:conda env export --name=env-name > environment.yaml
Kopieren Sie die Konfigurationsdatei in Ihren Cloud Storage-Bucket.
gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
Erstellen Sie den Cluster und verweisen Sie auf die Konfigurationsdatei der Umgebung in Cloud Storage.
REGION=region gcloud dataproc clusters create cluster-name \ --region=${REGION} \ --properties='dataproc:conda.env.config.uri=gs://bucket-name/environment.yaml' \ ... other flags ...
dataproc:conda.packages:Eine Liste vonconda-Paketen mit bestimmten Versionen, die in der Basisumgebung installiert werden sollen, formatiert alspkg1==v1,pkg2==v2.... Wenncondakeine Konflikte mit vorhandenen Paketen in der Basisumgebung lösen kann, werden die in Konflikt stehenden Pakete nicht installiert.Hinweise:
Die Clusterattribute
dataproc:conda.packagesunddataproc:pip.packageskönnen nicht mit dem Clusterattributdataproc:conda.env.config.uriverwendet werden.Wenn Sie mehrere Pakete angeben (durch ein Komma getrennt), müssen Sie ein alternatives Trennzeichen angeben (siehe Clusterattribut Formatierung). Im folgenden Beispiel wird "#" als Trennzeichen angegeben, um mehrere durch Kommas getrennte Paketnamen an das Attribut
dataproc:conda.packageszu übergeben.
Beispiel:
REGION=region gcloud dataproc clusters create cluster-name \ --region=${REGION} \ --properties='^#^dataproc:conda.packages=pytorch==1.7.1,coverage==5.5' \ ... other flags ...
dataproc:pip.packages:Eine Liste vonpip-Paketen mit bestimmten Versionen, die in der Basisumgebung installiert werden sollen, formatiert alspkg1==v1,pkg2==v2.... `pip will upgrade existing dependencies only if required. Konflikte können dazu führen, dass die Umgebung inkonsistent ist.Hinweise:
Die Clusterattribute
dataproc:pip.packagesunddataproc:conda.packageskönnen nicht mit dem Clusterattributdataproc:conda.env.config.uriverwendet werden.Wenn Sie mehrere Pakete angeben (durch ein Komma getrennt), müssen Sie ein alternatives Trennzeichen angeben (siehe Clusterattribut Formatierung). Im folgenden Beispiel wird "#" als Trennzeichen angegeben, um mehrere durch Kommas getrennte Paketnamen an das Attribut
dataproc:pip.packageszu übergeben.
Example:
REGION=region gcloud dataproc clusters create cluster-name \ --region=${REGION} \ --properties='^#^dataproc:pip.packages=tokenizers==0.10.1,datasets==1.4.1' \ ... other flags ...
Sie können beim Erstellen eines Clusters sowohl
dataproc:conda.packagesals auchdataproc:pip.packagesverwenden.Example:
REGION=region gcloud dataproc clusters create cluster-name \ --region=${REGION} \ --image-version=1.5 \ --metadata='MINICONDA_VARIANT=2' \ --metadata='MINICONDA_VERSION=latest' \ --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.4.1' \ ... other flags ...