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 mithilfe von Conda-bezogenen Clusterattributen Ihre eigene conda
-Umgebung auf dem Cluster 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 standardmäßige Python3-Interpreter befindet sich auf der VM-Instanz unter /opt/conda/default/bin
. Auf den folgenden Seiten finden Sie die Python-Version, die in Dataproc-Image-Versionen enthalten ist:
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.
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.packages
unddataproc:pip.packages
, um derconda
-base
-Umgebungconda
auf 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 in eineenvironment.yaml
-Datei wie unten gezeigt 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...
. Wennconda
keine Konflikte mit vorhandenen Paketen in der Basisumgebung lösen kann, werden die in Konflikt stehenden Pakete nicht installiert.Hinweise:
Die Clusterattribute
dataproc:conda.packages
unddataproc:pip.packages
können nicht mit dem Clusterattributdataproc:conda.env.config.uri
verwendet 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.packages
zu ü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, im Formatpkg1==v1,pkg2==v2...
. Pip aktualisiert vorhandene Abhängigkeiten nur, wenn dies erforderlich ist. Konflikte können dazu führen, dass die Umgebung inkonsistent ist.Hinweise:
Die Clusterattribute
dataproc:pip.packages
unddataproc:conda.packages
können nicht mit dem Clusterattributdataproc:conda.env.config.uri
verwendet 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.packages
zu ü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.packages
als auchdataproc:pip.packages
verwenden.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 ...