Dataproc-Python-Umgebung konfigurieren

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 Dataproc-Cluster mit 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

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:

  1. Verwenden Sie das Clusterattribut dataproc:conda.env.config.uri, um eine neue Conda-Umgebung im Cluster zu erstellen und zu aktivieren. oder

  2. Verwenden Sie die Clusterattribute dataproc:conda.packages und dataproc:pip.packages, um der conda-base-Umgebung conda auf dem Cluster conda- und pip-Pakete hinzuzufügen.

  • 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:

    1. 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 eine environment.yaml-Datei wie unten gezeigt exportieren.

      conda env export --name=env-name > environment.yaml
      

    2. Kopieren Sie die Konfigurationsdatei in Ihren Cloud Storage-Bucket.

      gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
      

    3. 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 conda 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 und dataproc:pip.packages können nicht mit dem Clusterattribut dataproc: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 von pip-Paketen mit bestimmten Versionen, die in der Basisumgebung installiert werden sollen, im Format pkg1==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 und dataproc:conda.packages können nicht mit dem Clusterattribut dataproc: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 auch dataproc: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 ...