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 versões de imagem personalizadas requerem a partir de uma imagem de base do Dataproc. As imagens de base Debian, Rocky Linux e 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 2.7 ou versão posterior.
  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 o gcloud (padrão) para executar fluxos de trabalho de várias etapas no Compute Engine.

Como 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.

python generate_custom_image.py \
    --image-name custom_image_name \
    [--family custom_image_family_name] \
    --dataproc-version Dataproc version (example: "1.5.10-debian10") \
    --customization-script local path to your custom script \
    --zone Compute Engine zone to use for the location of the temporary VM \
    --gcs-bucket URI (gs://bucket-name) of a Cloud Storage bucket in your project \
    [--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 "xyz-rc-os". Por exemplo, "1.5.35-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.

Para uma lista de outras sinalizações opcionais, consulte Argumentos opcionais no GitHub.

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

...
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 na 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. A imagem personalizada será salva em Imagens do Cloud Compute e poderá criar um cluster do Dataproc por até 60 dias a partir da data de criação dela. Para informações sobre como usar uma imagem após a data de validade, consulte Como criar um cluster com uma imagem personalizada expirada.

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/custom-image-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
  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 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/my-project-id/global/images/my-custom-image",
      "sourceDisk": ...,
      ...
    }
    

Como 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

É possível criar um cluster com uma imagem personalizada especificando URI de imagem personalizado no campo InstanceGroupConfig.imageUri em masterConfig, workerConfig e, se aplicável, no 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, dois nós de trabalho) com uma imagem personalizada.

POST /v1/projects/project-id/regions/global/clusters/
{
  "clusterName": "custom-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 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.

Como substituir propriedades do cluster do Dataproc por 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 em 60 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 "token value&quot, copiado acima 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.