In dieser Anleitung erstellen Sie eine Pipeline, die benutzerdefinierte Container mit C++-Bibliotheken verwendet, um einen hochparallelen Dataflow-HPC-Workflow auszuführen. In dieser Anleitung erfahren Sie, wie Sie mit Dataflow und Apache Beam Grid-Computing-Anwendungen ausführen, bei denen Daten an Funktionen verteilt werden müssen, die auf vielen Kernen ausgeführt werden.
In dieser Anleitung wird gezeigt, wie Sie die Pipeline zuerst mit der Methode Direct Runner und dann mithilfe der Funktion Dataflow-Runner ausführen. Wenn Sie die Pipeline lokal ausführen, können Sie sie vor der Bereitstellung testen.
In diesem Beispiel werden Cython-Bindungen und -Funktionen aus der GMP-Bibliothek verwendet. Unabhängig von der verwendeten Bibliothek oder dem Bindungstool können Sie auf Ihre Pipeline dieselben Prinzipien anwenden.
Der Beispielcode ist auf GitHub verfügbar.
Ziele
Eine Pipeline erstellen, die benutzerdefinierte Container mit C++-Bibliotheken verwendet.
Erstellen Sie ein Docker-Container-Image mit einem Dockerfile.
Verpacken Sie den Code und die Abhängigkeiten in einen Docker-Container.
Führen Sie die Pipeline lokal aus, um sie zu testen
Führen Sie die Pipeline in einer verteilten Umgebung aus.
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
- Artifact Registry
- Cloud Build
- Cloud Storage
- Compute Engine
- Dataflow
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweise
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Storage, Cloud Storage JSON, Compute Engine, Dataflow, Resource Manager, Artifact Registry, and Cloud Build APIs:
gcloud services enable compute.googleapis.com
dataflow.googleapis.com storage_component storage_api cloudresourcemanager.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com -
Create local authentication credentials for your user account:
gcloud auth application-default login
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Storage, Cloud Storage JSON, Compute Engine, Dataflow, Resource Manager, Artifact Registry, and Cloud Build APIs:
gcloud services enable compute.googleapis.com
dataflow.googleapis.com storage_component storage_api cloudresourcemanager.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com -
Create local authentication credentials for your user account:
gcloud auth application-default login
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
Erstellen Sie ein nutzerverwaltetes Worker-Dienstkonto für Ihre neue Pipeline und weisen Sie dem Dienstkonto die erforderlichen Rollen zu.
Führen Sie den Befehl
gcloud iam service-accounts create
aus, um das Dienstkonto zu erstellen.gcloud iam service-accounts create parallelpipeline \ --description="Highly parallel pipeline worker service account" \ --display-name="Highly parallel data pipeline access"
Weisen Sie dem Dienstkonto Rollen zu. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus:
roles/dataflow.admin
roles/dataflow.worker
roles/storage.objectAdmin
roles/artifactregistry.reader
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:parallelpipeline@PROJECT_ID.iam.gserviceaccount.com" --role=SERVICE_ACCOUNT_ROLE
Ersetzen Sie
SERVICE_ACCOUNT_ROLE
durch jede einzelne Rolle.Gewähren Sie Ihrem Google-Konto eine Rolle, mit der Sie Zugriffstokens für das Dienstkonto erstellen können:
gcloud iam service-accounts add-iam-policy-binding parallelpipeline@PROJECT_ID.iam.gserviceaccount.com --member="user:EMAIL_ADDRESS" --role=roles/iam.serviceAccountTokenCreator
Codebeispiel herunterladen und Verzeichnis wechseln
Laden Sie das Codebeispiel herunter und wechseln Sie dann das Verzeichnis. Die Codebeispiele im GitHub-Repository enthalten den gesamten Code, den Sie zum Ausführen dieser Pipeline benötigen. Wenn Sie Ihre eigene Pipeline erstellen möchten, können Sie diesen Beispielcode als Vorlage verwenden.
Klonen Sie das Repository beam-cpp-example.
Klonen Sie das GitHub-Repository mit dem Befehl
git clone
:git clone https://github.com/GoogleCloudPlatform/dataflow-sample-applications.git
Wechseln Sie in das Anwendungsverzeichnis:
cd dataflow-sample-applications/beam-cpp-example
Pipelinecode
Sie können den Pipelinecode aus dieser Anleitung anpassen. Diese Pipeline führt die folgenden Aufgaben aus:
- Erzeugt alle Ganzzahlen in einem Eingabebereich dynamisch.
- Führt die Ganzzahlen über eine C++-Funktion aus und filtert fehlerhafte Werte.
- Schreibt fehlerhafte Werte in einen Nebenkanal.
- Zählt das Vorkommen jeder Stoppzeit und normalisiert die Ergebnisse.
- Druckt die Ausgabe, formatiert und schreibt die Ergebnisse in eine Textdatei.
- Erstellt eine
PCollection
mit einem einzelnen Element. - Verarbeitet das einzelne Element mit einer
map
-Funktion und übergibt die HäufigkeitPCollection
als Nebeneingabe. - Verarbeitet den
PCollection
und erzeugt eine einzige Ausgabe.
Die Startdatei sieht so aus:
Entwicklungsumgebung einrichten
Verwenden Sie das Apache Beam SDK für Python.
Installieren Sie die GMP-Bibliothek:
apt-get install libgmp3-dev
Verwenden Sie die Datei
requirements.txt
, um die Abhängigkeiten zu installieren.pip install -r requirements.txt
Führen Sie den folgenden Befehl aus, um die Python-Bindungen zu erstellen.
python setup.py build_ext --inplace
Sie können die requirements.txt
-Datei aus dieser Anleitung anpassen. Die Startdatei enthält die folgenden Abhängigkeiten:
Pipeline lokal ausführen
Die lokale Ausführung der Pipeline ist zu Testzwecken nützlich. Durch lokale Ausführung der Pipeline können Sie prüfen, ob die Pipeline ausgeführt wird und sich wie erwartet verhält, bevor Sie die Pipeline in einer verteilten Umgebung bereitstellen.
Mit dem folgenden Befehl können Sie die Pipeline lokal ausführen.
Dieser Befehl gibt ein Image mit dem Namen out.png
aus.
python pipeline.py
Google Cloud-Ressourcen erstellen
In diesem Abschnitt werden die folgenden Ressourcen erstellt:
- Ein Cloud Storage-Bucket, der als temporärer Speicherort und als Ausgabespeicherort verwendet werden soll.
- Einen Docker-Container zum Verpacken des Pipelinecodes und der Abhängigkeiten.
Cloud Storage-Bucket erstellen
Erstellen Sie zuerst einen Cloud Storage-Bucket mit der Google Cloud CLI. Dieser Bucket wird von der Dataflow-Pipeline als temporärer Speicherort verwendet.
Verwenden Sie den Befehl gcloud storage buckets create
, um den Bucket zu erstellen:
gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
Ersetzen Sie dabei Folgendes:
- BUCKET_NAME: Ein Name für Ihren Cloud Storage-Bucket, der den Anforderungen für Bucket-Namen entspricht. Cloud Storage-Bucket-Namen müssen global einmalig sein.
- LOCATION: der Speicherort für den Bucket.
Container-Image erstellen
Sie können das Dockerfile aus dieser Anleitung anpassen. Die Startdatei sieht so aus:
Dieses Dockerfile enthält die Befehle FROM
, COPY
und RUN
. Informationen dazu finden Sie in der
Dockerfile-Referenz.
Erstellen Sie ein Artifact Registry-Repository, um Artefakte hochzuladen. Jedes Repository kann Artefakte für ein einzelnes unterstütztes Format enthalten.
Alle Repository-Inhalte werden entweder mit Schlüsseln verschlüsselt, die Google gehören oder von Google verwaltet werden, oder mit vom Kunden verwaltete Verschlüsselungsschlüssel. Artifact Registry verwendet Schlüssel, die Google gehören und von Google verwaltet werden, sind standardmäßig und keine Konfiguration erforderlich für diese Option.
Sie müssen für das Repository mindestens Zugriff als Artifact Registry-Autor haben.
Führen Sie den folgenden Befehl aus, um ein neues Repository zu erstellen: Der Befehl verwendet das Flag
--async
und kehrt sofort zurück, ohne auf den Abschluss des Vorgangs zu warten.gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=LOCATION \ --async
Ersetzen Sie
REPOSITORY
durch einen Namen für das Repository. Repository-Namen können für jeden Repository-Speicherort in einem Projekt nur einmal vorkommen.Erstellen Sie das Dockerfile.
Pakete, die Teil des Apache Beam-Containers sein sollen, müssen als Teil der Datei
requirements.txt
angegeben werden. Achten Sie darauf, nichtapache-beam
als Teil der Dateirequirements.txt
anzugeben. Der Apache Beam-Container hat bereitsapache-beam
.Um Images per Push oder Pull übertragen zu können, konfigurieren Sie Docker für die Authentifizierung von Anfragen für Artifact Registry. Führen Sie den folgenden Befehl aus, um die Authentifizierung bei Docker-Repositories einzurichten:
gcloud auth configure-docker LOCATION-docker.pkg.dev
Mit dem Befehl wird die Docker-Konfiguration aktualisiert. Sie können jetzt eine Verbindung zu Artifact Registry in Ihrem Google Cloud-Projekt herstellen, um Images per Push zu übertragen.
Erstellen Sie mit Cloud Build das Docker mithilfe eines
Dockerfile
Aktualisieren Sie den Pfad im folgenden Befehl, damit er dem von Ihnen erstellten Dockerfile entspricht. Mit diesem Befehl wird die Datei erstellt und in Ihr Artifact Registry-Repository übertragen.
gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/dataflow/cpp_beam_container:latest .
Code und Abhängigkeiten in einem Docker-Container verpacken
Packen Sie den Code und die Abhängigkeiten in einen Docker-Container, um diese Pipeline in einer verteilten Umgebung auszuführen.
docker build . -t cpp_beam_container
Nachdem Sie den Code und die Abhängigkeiten gepackt haben, können Sie die Pipeline lokal ausführen um es zu testen.
python pipeline.py \ --runner=PortableRunner \ --job_endpoint=embed \ --environment_type=DOCKER \ --environment_config="docker.io/library/cpp_beam_container"
Mit diesem Befehl wird die Ausgabe in das Docker-Image geschrieben. Führen Sie die Pipeline mit
--output
aus, um die Ausgabe aufzurufen, und schreiben Sie die Ausgabe in einen Cloud Storage-Bucket. Führen Sie dazu beispielsweise den folgenden Befehl aus:python pipeline.py \ --runner=PortableRunner \ --job_endpoint=embed \ --environment_type=DOCKER \ --environment_config="docker.io/library/cpp_beam_container" \ --output=gs://BUCKET_NAME/out.png
Pipeline ausführen
Sie können die Apache Beam-Pipeline nun in Dataflow ausführen. Verweisen Sie dazu auf die Datei mit dem Pipelinecode und übergeben Sie die für die Pipeline erforderlichen Parameter.
Führen Sie die Pipeline in Ihrer Shell oder im Terminal mit dem Dataflow-Runner aus.
python pipeline.py \
--runner=DataflowRunner \
--project=PROJECT_ID \
--region=REGION \
--temp_location=gs://BUCKET_NAME/tmp \
--sdk_container_image="LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/dataflow/cpp_beam_container:latest" \
--experiment=use_runner_v2 \
--output=gs://BUCKET_NAME/out.png
Nachdem Sie den Befehl zum Ausführen der Pipeline ausgeführt haben, gibt Dataflow eine Job-ID mit dem Auftragsstatus In der Warteschlange zurück. Es kann einige Minuten dauern, bis der Jobstatus Läuft erreicht und Sie auf die Jobgrafik zugreifen können.
Ergebnisse ansehen
Sehen Sie sich die Daten an, die in Ihren Cloud Storage-Bucket geschrieben wurden. Verwenden Sie den Befehl gcloud storage ls
, um den Inhalt auf oberster Ebene des Buckets aufzulisten:
gcloud storage ls gs://BUCKET_NAME
Wenn der Vorgang erfolgreich durchgeführt wurde, wird eine Meldung folgender Art angezeigt:
gs://BUCKET_NAME/out.png
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Projekt löschen
Am einfachsten können Sie weitere Kosten vermeiden, wenn Sie das Google Cloud-Projekt löschen, das Sie für die Anleitung erstellt haben.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Einzelne Ressourcen löschen
Wenn Sie das Projekt wiederverwenden möchten, löschen Sie die für die Anleitung erstellten Ressourcen.
Google Cloud-Projektressourcen bereinigen
Löschen Sie das Artifact Registry-Repository.
gcloud artifacts repositories delete REPOSITORY \ --location=LOCATION --async
Löschen Sie den Cloud Storage-Bucket. Für den Bucket fallen keine Gebühren an.
gcloud storage rm gs://BUCKET_NAME --recursive
Anmeldedaten entfernen
Widerrufen Sie die Rollen, die Sie dem nutzerverwalteten Worker-Dienstkonto zugewiesen haben. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus:
roles/dataflow.admin
roles/dataflow.worker
roles/storage.objectAdmin
roles/artifactregistry.reader
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member=serviceAccount:parallelpipeline@PROJECT_ID.iam.gserviceaccount.com \ --role=SERVICE_ACCOUNT_ROLE
-
Optional: Revoke the authentication credentials that you created, and delete the local credential file.
gcloud auth application-default revoke
-
Optional: Revoke credentials from the gcloud CLI.
gcloud auth revoke
Nächste Schritte
- Beispielanwendung auf GitHub ansehen
- Benutzerdefinierte Container in Dataflow verwenden
- Weitere Informationen zur Verwendung von Containerumgebungen mit Apache Beam.
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center