Criar uma imagem personalizada do Dataproc

Os clusters do Dataproc podem ser provisionados com uma imagem personalizada que inclui os pacotes pré-instalados de um usuário. Nas etapas a seguir, saiba como criar e instalar uma imagem personalizada em um cluster do Dataproc.

Observações:

  • As instruções neste documento aplicam-se apenas aos sistemas operacionais Linux. Outros sistemas operacionais poderão ser compatíveis com versões futuras do Dataproc.
  • As criações de imagens personalizadas exigem a partir de uma imagem de base do Dataproc. As imagens de base do Debian, do Rocky Linux e do Ubuntu são compatíveis.
  • Como usar componentes opcionais: por padrão, as imagens personalizadas herdam todas as Componentes opcionais do Dataproc (Pacotes e configs do SO) com base nas imagens de base, é possível personalizar as versões e configs do pacote do SO padrão, mas você precisa especificar o nome do componente opcional ao criar o cluster (por exemplo, executando o comando gcloud dataproc clusters create --optional-components=COMPONENT_NAME: consulte Como adicionar componentes opcionais. Se o nome do componente não for especificado quando você criar o cluster, o componente (incluindo configurações e pacotes personalizados do SO) será excluído.

Antes de começar

Crie o projeto

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Dataproc API, Compute Engine API, and Cloud Storage.

    Ative as APIs

  5. Instale a CLI do Google Cloud.
  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  8. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  9. Ative as APIs Dataproc API, Compute Engine API, and Cloud Storage.

    Ative as APIs

  10. Instale a CLI do Google Cloud.
  11. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  12. Instale o Python 3.11+
  13. Prepare um script de personalização que instale pacotes personalizados e/ou atualize configurações, por exemplo:
      #! /usr/bin/bash
      apt-get -y update
      apt-get install python-dev
      apt-get install python-pip
      pip install numpy
      

Criar um bucket do Cloud Storage no projeto

  1. No console do Cloud, acesse a página Buckets do Cloud Storage.

    Acessar a página "Buckets"

  2. Clique em Criar bucket.
  3. Na página Criar um bucket, insira as informações do seu bucket. Para ir à próxima etapa, clique em Continuar.
  4. Clique em Criar.

Gerar uma imagem personalizada

Você usará generate_custom_image.py, um programa Python para criar uma imagem personalizada do Dataproc.

Como funciona

O programa generate_custom_image.py lança uma instância de VM temporária do Compute Engine com a imagem de base do Dataproc especificada e executa o script de personalização dentro da instância de VM para instalar pacotes personalizados e/ou atualizar configurações. Depois da conclusão da instalação, o script de personalização encerra a instância de VM e cria uma imagem personalizada do Dataproc a partir do disco da instância. Depois da criação da imagem personalizada, a VM temporária é excluída. A imagem personalizada é salva e pode ser usada para criar clusters do Dataproc.

O programa generate_custom_image.py usa a CLI gcloud para executar fluxos de trabalho de várias etapas no Compute Engine.

Executar o código

Para bifurcar ou clonar arquivos nas Imagens personalizadas do Dataproc. Em seguida, execute o programa generate_custom_image.py para que o Dataproc gere e salve sua imagem personalizada.

python3 generate_custom_image.py \
    --image-name=CUSTOM_IMAGE_NAME \
    [--family=CUSTOM_IMAGE_FAMILY_NAME] \
    --dataproc-version=IMAGE_VERSION \
    --customization-script=LOCAL_PATH \
    --zone=ZONE \
    --gcs-bucket=gs://BUCKET_NAME \
    [--no-smoke-test]

Sinalizadores obrigatórios

  • --image-name: o nome da saída da imagem personalizada. Observação: o nome da imagem precisa corresponder à regex [a-z](?:[-a-z0-9]{0,61}[a-z0-9]). Por exemplo, sem sublinhados ou espaços, com menos de 64 caracteres.
  • --dataproc-version: a versão da imagem do Dataproc a ser usada na imagem personalizada. Especifique a versão no formato "x.y.z-os" ou "x.y.z-rc-os", por exemplo, "2.0.69-debian10".
  • --customization-script: um caminho local para o script que a ferramenta executará para instalar seus pacotes personalizados ou executar outras personalizações. Observe que esse script é executado apenas na VM temporária usada para criar a imagem personalizada. Especifique um script de inicialização diferente para qualquer outra ação de inicialização que quiser executar ao criar um cluster com sua imagem personalizada.
  • --zone: a zona do Compute Engine em que generate_custom_image.py criará uma VM temporária a ser usada para criar a imagem personalizada.
  • --gcs-bucket: um URI, no formato gs://BUCKET_NAME, que aponta para o bucket do Cloud Storage criado em Criar um bucket do Cloud Storage no projeto. generate_custom_image.py gravará arquivos de registro nesse bucket.

Sinalizações opcionais

  • --family: a família da imagem. As famílias de imagens são usadas para agrupar imagens semelhantes e podem ser usadas ao criar um cluster como um ponteiro para a imagem mais recente na família. Por exemplo, "custom-1-5-debian10".
  • --no-smoke-test: esta é uma sinalização opcional que desativa o teste de fumaça da imagem personalizada recém-criada. Ele cria um cluster de teste do Dataproc com a imagem recém-criada, executa um pequeno job e exclui o cluster no final do teste. Por padrão, ele é executado para verificar se a imagem personalizada recém-criada pode criar um cluster funcional do Dataproc. Desativar essa etapa usando a sinalização --no-smoke-test agilizará o processo de criação da imagem personalizada, mas o uso dela não é recomendado.
  • --subnet: a sub-rede a ser usada para criar a VM que cria a imagem personalizada do Dataproc. Se o projeto fizer parte de uma VPC compartilhada, especifique o URL completo da sub-rede no seguinte formato: projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET.

Para uma lista de outras sinalizações opcionais, consulte Argumentos opcionais (link em inglês) no GitHub.

Se generate_custom_image.py for bem-sucedido, o imageURI da imagem personalizada será listado na saída da janela do terminal (o imageUri completo é mostrado abaixo em negrito):

...
managedCluster:
    clusterName: verify-image-20180614213641-8308a4cd
    config:
      gceClusterConfig:
        zoneUri: ZONE
      masterConfig:
        imageUri: https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
...

INFO:__main__:Successfully built Dataproc custom image: CUSTOM_IMAGE_NAME
INFO:__main__:

#####################################################################
  WARNING: DATAPROC CUSTOM IMAGE 'CUSTOM_IMAGE_NAME'
           WILL EXPIRE ON 2018-07-14 21:35:44.133000.
#####################################################################

Rótulos de versão de imagem personalizados para usuários avançados

Ao usar a ferramenta de imagem personalizada padrão do Dataproc, ela define automaticamente um rótulo goog-dataproc-version obrigatório na imagem personalizada criada. O rótulo reflete os recursos e protocolos de recursos usados pelo Dataproc para gerenciar o software na imagem.

Os usuários avançados que usam o próprio processo para criar uma imagem personalizada do Dataproc precisam adicionar o rótulo manualmente a ela, conforme mostrado a seguir:

  1. Extraia o rótulo goog-dataproc-version da imagem base do Dataproc usada para criar a imagem personalizada.

    gcloud compute images describe ${BASE_DATAPROC_IMAGE} \
        --project cloud-dataproc \
        --format="value(labels.goog-dataproc-version)"
    

  2. Defina o rótulo da imagem personalizada.

    gcloud compute images add-labels IMAGE_NAME --labels=[KEY=VALUE,...]
    

Usar uma imagem personalizada

Você especifica a imagem personalizada ao criar um cluster do Dataproc. Uma imagem personalizada é salva em Imagens do Cloud Compute e é válida para criar um cluster do Dataproc por 365 dias a partir da data de criação. Consulte Como criar um cluster com uma imagem personalizada expirada para usar uma imagem personalizada após a data de validade de 365 dias.

URI de imagem personalizada

É possível transferir o imageUri da imagem personalizada para a operação de criação do cluster. Esse URI pode ser especificado de três maneiras:

  1. URI completo:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/`gs://`BUCKET_NAME`
  2. URI parcial: projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
  3. Nome curto: CUSTOM_IMAGE_NAME

As imagens personalizadas também podem ser especificadas pelo URI da família, que sempre escolhe a imagem mais recente dentro da família de imagens.

  1. URI completo:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/family/CUSTOM_IMAGE_FAMILY_NAME/var>
  2. URI parcial: projects/PROJECT_ID/global/images/family/CUSTOM_IMAGE_FAMILY_NAME

Como encontrar o URI da imagem personalizada

Comando gcloud

Execute o seguinte comando gcloud para listar os nomes das suas imagens personalizadas:

gcloud compute images list

Transmita o nome da imagem personalizada para o seguinte comando gcloud para listar o URI (selfLink) da imagem personalizada:

gcloud compute images describe custom-image-name
...
name: CUSTOM_IMAGE_NAME
selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
...

Console

  1. Abra a página Compute Engine → Imagens no console do Google Cloud e clique no nome da imagem. Para limitar o número de imagens exibidas, insira uma consulta na caixa de texto do filtro de imagens
  2. Abra a página "Detalhes de imagem". Clique em REST equivalente.
  3. A resposta REST lista outras informações sobre a imagem, incluindo selfLink, que é o URI da imagem.
    {
      ...
      "name": "my-custom-image",
      "selfLink": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME",
      "sourceDisk": ...,
      ...
    }
    

Criar um cluster com uma imagem personalizada

É possível criar um cluster com nós mestres e de trabalho que usam uma imagem personalizada com a ferramenta de linha de comando gcloud, a API Dataproc ou o console do Google Cloud.

Comando gcloud

É possível criar um cluster do Dataproc com uma imagem personalizada usando o comando dataproc clusters create com a sinalização --image. Exemplo:
gcloud dataproc clusters create CLUSTER-NAME \
    --image=CUSTOM_IMAGE_URI \
    --region=REGION \
    ... other flags ...

API REST

Crie um cluster com uma imagem personalizada especificando o URI da imagem personalizada no campo InstanceGroupConfig.imageUri e os objetos masterConfig e workerConfig e, se aplicável, o objeto secondaryWorkerConfig incluído em uma solicitação de API cluster.create.

Exemplo: solicitação REST para criar um cluster padrão do Dataproc (um mestre e dois nós de trabalho) com uma imagem personalizada.

POST /v1/projects/PROJECT_ID/regions/REGION/clusters/
{
  "clusterName": "CLUSTER_NAME",
  "config": {
    "masterConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    },
    "workerConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    }
  }
}
  

Console

  1. No console do Google Cloud, abra a página Criar um cluster do Dataproc. O painel "Configurar cluster" está selecionado.
  2. Na seção "Controle de versão", clique em "ALTERAR". Selecione a guia "IMAGEM PERSONALIZADA", escolha a imagem personalizada a ser usada no cluster do Dataproc e clique em "SELECIONAR".

Ao enviar o formulário Criar um cluster, as VMs do cluster são provisionadas com a imagem personalizada selecionada.

Substituir as propriedades do cluster do Dataproc com uma imagem personalizada

É possível usar imagens personalizadas para substituir qualquer propriedade de cluster definida durante a criação do cluster. Se um usuário criar um cluster com sua imagem personalizada, mas definir propriedades de cluster diferentes daquelas definidas com a imagem personalizada, as configurações de propriedade do cluster de imagem personalizada terão precedência.

Para definir as propriedades do cluster com sua imagem personalizada:

  1. No script de personalização de imagens personalizadas, crie um arquivo dataproc.custom.properties em /etc/google-dataproc e defina os valores da propriedade do cluster no arquivo.
    • Exemplo de conteúdo de arquivo dataproc.custom.properties:
      dataproc.conscrypt.provider.enable=VALUE
      dataproc.logging.stackdriver.enable=VALUE
      

Exemplo de snippet de criação de arquivo de script de personalização para modificar duas propriedades de cluster:

     cat <<EOF >/etc/google-dataproc/dataproc.custom.properties
     dataproc.conscrypt.provider.enable=true
     dataproc.logging.stackdriver.enable=false
     EOF

Como criar um cluster com uma imagem personalizada expirada

Por padrão, as imagens personalizadas expiram 365 dias após a data de criação. É possível criar um cluster com uma imagem personalizada expirada seguindo estas etapas.

  1. Tente criar um cluster do Dataproc com uma imagem personalizada expirada ou uma imagem personalizada que expira em 10 dias.

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --region=REGION \
        ... other flags ...
    

  2. A CLI gcloud emitirá uma mensagem de erro que inclui o nome da propriedade dataproc:dataproc.custom.image.expiration.token e o valor do token do cluster.

    dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE
    
    Copie a string "valor do token" para a área de transferência.

  3. Use a CLI gcloud para criar o cluster do Dataproc novamente, adicionando o "valor do token" copiado como uma propriedade de cluster.

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --properties=dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE \
        --region=REGION \
        ... other flags ...
    

É necessário que a criação do cluster, com a imagem personalizada, seja bem-sucedida.