Neste tutorial, você cria um pipeline que usa contêineres personalizados com bibliotecas C++ para executar um fluxo de trabalho altamente paralelo do HPC do Dataflow. Use este tutorial para aprender a usar o Dataflow e o Apache Beam para executar aplicativos de computação em grade que exigem a distribuição de dados para funções em execução em vários núcleos.
Neste tutorial, mostramos como executar o pipeline usando o executor direto e depois o executor do Dataflow. Ao executar o pipeline localmente, é possível testá-lo antes de implantá-lo.
Este exemplo usa vinculações e funções do Cython da biblioteca do GMP (links em inglês). Independentemente da biblioteca ou da ferramenta de vinculação usada, é possível aplicar os mesmos princípios ao pipeline.
O código está disponível no GitHub.
Objetivos
Crie um pipeline que use contêineres personalizados com bibliotecas C++.
Crie uma imagem de contêiner do Docker usando um Dockerfile.
Empacote o código e as dependências em um contêiner do Docker.
Execute o pipeline localmente para testá-lo.
Execute o pipeline em um ambiente distribuído.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
- Artifact Registry
- Cloud Build
- Cloud Storage
- Compute Engine
- Dataflow
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Antes de começar
- 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
Criar uma conta de serviço do worker gerenciada pelo usuário para o novo pipeline e conceder os papéis necessários à conta de serviço.
Para criar a conta de serviço, execute o comando
gcloud iam service-accounts create
.gcloud iam service-accounts create parallelpipeline \ --description="Highly parallel pipeline worker service account" \ --display-name="Highly parallel data pipeline access"
Conceda papéis à conta de serviço. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM:
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
Substitua
SERVICE_ACCOUNT_ROLE
por cada papel individual.Conceda à sua Conta do Google uma função que permita criar tokens de acesso para a conta de serviço:
gcloud iam service-accounts add-iam-policy-binding parallelpipeline@PROJECT_ID.iam.gserviceaccount.com --member="user:EMAIL_ADDRESS" --role=roles/iam.serviceAccountTokenCreator
Fazer o download do exemplo de código e mudar os diretórios.
Faça o download do exemplo de código e mude os diretórios. As amostras de código no repositório do GitHub fornecem todo o código necessário para executar esse pipeline. Quando você estiver pronto para criar seu próprio pipeline, poderá usar esse código de amostra como modelo.
Clone o repositório beam-cpp-example.
Use o comando
git clone
para clonar o repositório do GitHub:git clone https://github.com/GoogleCloudPlatform/dataflow-sample-applications.git
Alterne para o diretório do aplicativo:
cd dataflow-sample-applications/beam-cpp-example
Código do pipeline:
É possível personalizar o código do pipeline deste tutorial. Esse pipeline conclui as seguintes tarefas:
- Produz dinamicamente todos os números inteiros em um intervalo de entrada.
- Executa os números inteiros por meio de uma função C++ e filtra valores inválidos.
- Grava os valores inválidos em um canal lateral.
- Conta a ocorrência de cada horário de parada e normaliza os resultados.
- Imprime a saída, formatando e gravando os resultados em um arquivo de texto.
- Cria um
PCollection
com um único elemento. - Processa o único elemento com uma função
map
e transmite a frequênciaPCollection
como uma entrada secundária. - Processa
PCollection
e produz uma única saída.
O arquivo inicial tem a seguinte aparência:
configure o ambiente de desenvolvimento
Use o SDK do Apache Beam para Python.
Instale a biblioteca do GMP:
apt-get install libgmp3-dev
Para instalar as dependências, use o arquivo
requirements.txt
.pip install -r requirements.txt
Para criar as vinculações do Python, execute o seguinte comando.
python setup.py build_ext --inplace
É possível personalizar o arquivo requirements.txt
deste tutorial. O arquivo inicial inclui as seguintes dependências:
Execute o pipeline localmente
Executar o pipeline localmente é útil para testes. Ao executar o pipeline localmente, é possível confirmar se ele é executado e se comporta conforme o esperado antes de implantá-lo em um ambiente distribuído.
É possível executar o pipeline localmente usando o comando a seguir.
Esse comando gera uma imagem chamada out.png
.
python pipeline.py
Criar os recursos do Google Cloud
Esta seção explica como criar os seguintes recursos:
- Um bucket do Cloud Storage a ser usado como um local de armazenamento temporário e um local de saída.
- Um contêiner do Docker para empacotar o código e as dependências do pipeline.
Crie um bucket do Cloud Storage
Comece criando um bucket do Cloud Storage usando a Google Cloud CLI. Esse bucket é usado como um local de armazenamento temporário pelo pipeline do Dataflow.
Para criar o bucket, use o comando gcloud storage buckets create
:
gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
Substitua:
- BUCKET_NAME: um nome para o bucket do Cloud Storage que atende aos requisitos de nomenclatura de bucket. Os nomes dos intervalos do Cloud Storage precisam ser globalmente exclusivos.
- LOCATION: o local do bucket.
Criar e fazer o build de uma imagem de contêiner
É possível personalizar o Dockerfile deste tutorial. O arquivo inicial tem a seguinte aparência:
Esse Dockerfile contém os comandos FROM
, COPY
e RUN
. Veja mais informações sobre eles na
referência do Dockerfile.
Para fazer upload de artefatos, crie um repositório do Artifact Registry. Cada repositório pode conter artefatos para um único formato compatível.
Todo o conteúdo do repositório é criptografado usando chaves de propriedade do Google e gerenciadas pelo Google ou chaves de criptografia gerenciadas pelo cliente. O Artifact Registry usa chaves de propriedade e gerenciadas pelo Google por padrão, e nenhuma configuração é necessária para essa opção.
É preciso ter pelo menos o acesso "Gravador do Artifact Registry" no repositório.
Execute o comando abaixo para criar um novo repositório. O comando usa a sinalização
--async
e retorna imediatamente, sem aguardar a conclusão da operação.gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=LOCATION \ --async
Substitua
REPOSITORY
por um nome para o repositório. Para cada local de repositório em um projeto, os nomes dos repositórios precisam ser exclusivos.Criar o Dockerfile
Para que os pacotes façam parte do contêiner do Beam, especifique-os como parte do arquivo
requirements.txt
. Não especifiqueapache-beam
como parte do arquivorequirements.txt
. O contêiner do Apache Beam já temapache-beam
.Antes de enviar ou extrair imagens, configure o Docker para autenticar solicitações para o Artifact Registry. Para configurar a autenticação nos repositórios do Docker, execute o seguinte comando:
gcloud auth configure-docker LOCATION-docker.pkg.dev
O comando atualiza a configuração do Docker. Agora é possível se conectar ao Artifact Registry no seu projeto do Google Cloud para enviar imagens.
Crie a imagem do Docker usando um
Dockerfile
com o Cloud Build.Atualize o caminho no comando a seguir para corresponder ao Dockerfile que você criou. Esse comando cria o arquivo e o envia para o repositório do Artifact Registry.
gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/dataflow/cpp_beam_container:latest .
Empacotar o código e as dependências em um contêiner do Docker
Para executar esse pipeline em um ambiente distribuído, empacote o código e as dependências em um contêiner do Docker.
docker build . -t cpp_beam_container
Depois de empacotar o código e as dependências, será possível executar o pipeline localmente para testá-lo.
python pipeline.py \ --runner=PortableRunner \ --job_endpoint=embed \ --environment_type=DOCKER \ --environment_config="docker.io/library/cpp_beam_container"
Esse comando grava a saída na imagem do Docker. Para ver a saída, execute o pipeline com
--output
e grave a saída em um bucket do Cloud Storage. Por exemplo, execute o seguinte comando.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
execute o pipeline
Agora é possível executar o pipeline do Apache Beam no Dataflow consultando o arquivo com o código do pipeline e transmitindo os parâmetros exigidos pelo pipeline.
No shell ou terminal, execute o pipeline com o executor do Dataflow.
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
Depois de executar o comando para executar o modelo flexível, o Dataflow retorna um ID de job com o status Na fila. Pode levar alguns minutos até que o status do job atinja Em execução e você possa acessar o gráfico de jobs.
Ver os resultados
Veja os dados gravados no bucket do Cloud Storage. Use o comando gcloud storage ls
para listar o conteúdo no nível superior do bucket:
gcloud storage ls gs://BUCKET_NAME
Se o comando estiver correto, ele retornará uma mensagem como esta:
gs://BUCKET_NAME/out.png
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Excluir o projeto
A maneira mais fácil de eliminar o faturamento é excluir o projeto do Google Cloud que você criou para o tutorial.
- 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.
Excluir recursos individuais
Se você quiser reutilizar o projeto, exclua os recursos criados para o tutorial.
Limpar recursos do projeto do Google Cloud
Exclua o repositório do Artifact Registry.
gcloud artifacts repositories delete REPOSITORY \ --location=LOCATION --async
Exclua o bucket do Cloud Storage. O bucket sozinho não gera cobranças.
gcloud storage rm gs://BUCKET_NAME --recursive
Revogar credenciais
Revogue os papéis concedidos à conta de serviço do worker gerenciada pelo usuário. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM:
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
A seguir
- Veja o aplicativo de exemplo no GitHub.
- Usar contêineres personalizados no Dataflow
- Saiba mais sobre o uso de ambientes de contêiner com o Apache Beam.
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.