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. oder
- Verwenden Sie die Clusterattribute - dataproc:conda.packagesund- dataproc:pip.packages, um der- conda-Umgebung- baseauf dem Cluster- conda- und- pip-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 neuen- conda-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 eine- environment.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 von- conda-Paketen mit bestimmten Versionen, die in der Basisumgebung installiert werden sollen, formatiert als- pkg1==v1,pkg2==v2.... Wenn- condakeine Konflikte mit vorhandenen Paketen in der Basisumgebung lösen kann, werden die in Konflikt stehenden Pakete nicht installiert.- Hinweise: - Die Clusterattribute - dataproc:conda.packagesund- dataproc:pip.packageskönnen nicht mit dem Clusterattribut- dataproc: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 von- pip-Paketen mit bestimmten Versionen, die in der Basisumgebung installiert werden sollen, formatiert als- pkg1==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.packagesund- dataproc:conda.packageskönnen nicht mit dem Clusterattribut- dataproc: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 auch- dataproc: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 ...