Criar uma imagem personalizada do Managed Service for Apache Spark

É possível criar um cluster do Serviço Gerenciado para Apache Spark com uma imagem personalizada que inclua seus pacotes pré-instalados. Esta página mostra como criar uma imagem personalizada e instalá-la em um cluster do Serviço Gerenciado para Apache Spark.

Considerações e limitações de uso

  • Ciclo de vida da imagem personalizada:para garantir que os clusters recebam as atualizações de serviço e correções de bugs mais recentes, a criação de clusters com uma imagem personalizada é limitada a 365 dias a partir da data de criação da imagem personalizada. Os clusters criados com uma imagem personalizada podem ser executados indefinidamente.

    Talvez você precise usar a automação se quiser criar clusters com uma imagem personalizada específica por um período maior que 365 dias. Para mais informações, consulte Criar um cluster com uma imagem personalizada expirada.

  • Somente Linux:as instruções neste documento se aplicam apenas a sistemas operacionais Linux. Outros sistemas operacionais poderão ser compatíveis com versões futuras do Serviço Gerenciado para Apache Spark.

  • Imagens de base compatíveis:as criações de imagens personalizadas exigem uma imagem de base do Serviço gerenciado para Apache Spark. As seguintes imagens de base são compatíveis: Debian, Rocky Linux e Ubuntu.

  • Usar componentes opcionais:

    Independente da imagem de base usada para sua imagem personalizada, ao criar o cluster, você precisa listar ou selecionar componentes opcionais.

    Exemplo: comando de criação de cluster da Google Cloud CLI:

    gcloud dataproc clusters create CLUSTER_NAME
        --image=CUSTOM_IMAGE_URI  \
        --optional-components=COMPONENT_NAME \
        ... other flags
    

    Se o nome do componente não for especificado quando você criar o cluster, o componente opcional, incluindo configurações e pacotes personalizados do SO, será excluído.

  • Como usar imagens personalizadas hospedadas:se você usa uma imagem personalizada hospedada em outro projeto, a conta de serviço do agente de serviço do Serviço Gerenciado para Apache Spark no seu projeto precisa ter a permissão compute.images.get na imagem no projeto host. Para isso, conceda o papel roles/compute.imageUser na imagem hospedada à conta de serviço do agente de serviço do Serviço Gerenciado para Apache Spark do seu projeto. Consulte Como compartilhar imagens personalizadas em uma organização.

  • Usar segredos de MOK (chave do proprietário da máquina) de inicialização segura:para ativar a inicialização segura com sua imagem personalizada do Serviço Gerenciado para Apache Spark, faça o seguinte:

    1. Ative a API Secret Manager (secretmanager.googleapis.com. O Serviço Gerenciado para Apache Spark gera e gerencia um par de chaves usando o serviço Secret Manager.

    2. Adicione a flag --service-account="SERVICE_ACCOUNT" ao comando generate_custom_image.py ao gerar uma imagem personalizada. Observação: é preciso conceder à conta de serviço o papel de Leitor do Secret Manager (roles/secretmanager.viewer) no projeto e o papel de Acessador do Secret Manager (roles/secretmanager.secretAccessor) nos secrets públicos e privados.

      Para mais informações com exemplos, consulte o README.md e outros arquivos no diretório examples/secure-boot do repositório GoogleCloudDataproc/custom-images no GitHub.

      Para desativar a inicialização segura:por padrão, os scripts de imagem personalizada do Serviço Gerenciado para Apache Spark geram e gerenciam um par de chaves usando o Secret Manager quando executados em um cluster do Serviço Gerenciado para Apache Spark. Se você não quiser usar a inicialização segura com sua imagem personalizada, inclua --trusted-cert="" (valor de flag vazio) no comando generate_custom_image.py ao gerar a imagem personalizada.

Antes de começar

Configure o projeto antes de gerar a imagem personalizada.

Criar o projeto

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Dataproc API, Compute Engine API, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Instale a CLI do Google Cloud.

  6. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Dataproc API, Compute Engine API, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Instale a CLI do Google Cloud.

  12. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  14. Instale o Python 3.11 ou versão mais recente
  15. 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
      

crie um bucket do Cloud Storage no seu projeto

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

    Acessar buckets

  2. Clique em Criar.
  3. Na página Criar um bucket, insira as informações do seu bucket. Para ir à próxima etapa, clique em Continuar.
    1. Na seção Começar, faça o seguinte:
    2. Na seção Escolha onde armazenar seus dados, faça o seguinte:
      1. Selecione um tipo de local.
      2. Escolha um local onde os dados do bucket são armazenados permanentemente no menu suspenso Tipo de local.
      3. Para configurar a replicação entre buckets, selecione Adicionar replicação entre buckets usando o Serviço de transferência do Cloud Storage e siga estas etapas:

        Configurar a replicação entre buckets

        1. No menu Bucket, selecione um bucket.
        2. Na seção Configurações de replicação, clique em Configurar para definir as configurações do job de replicação.

          O painel Configurar a replicação entre buckets aparece.

          • Para filtrar objetos a serem replicados por prefixo de nome de objeto, insira um prefixo com que você quer incluir ou excluir objetos e clique em Adicionar um prefixo.
          • Para definir uma classe de armazenamento para os objetos replicados, selecione uma classe de armazenamento no menu Classe de armazenamento. Se você pular esta etapa, os objetos replicados vão usar a classe de armazenamento do bucket de destino por padrão.
          • Clique em Concluído.
    3. Na seção Escolha como armazenar seus dados, faça o seguinte:
      1. Selecione uma classe de armazenamento padrão para o bucket ou Classe automática para gerenciamento automático da classe de armazenamento dos dados do bucket.
      2. Para ativar o namespace hierárquico, na seção Otimizar o armazenamento para cargas de trabalho com uso intensivo de dados, selecione Ativar namespace hierárquico neste bucket.
    4. Na seção Escolha como controlar o acesso a objetos, selecione se o bucket aplica ou não a prevenção de acesso público e selecione um método de controle de acesso para os objetos do bucket.
    5. Na seção Escolha como proteger os dados do objeto, faça o seguinte:
      • Selecione qualquer uma das opções em Proteção de dados que você quer definir para o bucket.
        • Para ativar a exclusão reversível, clique na caixa de seleção Política de exclusão reversível (para recuperação de dados) e especifique o número de dias que você quer reter os objetos após a exclusão.
        • Para definir o controle de versões de objetos, clique na caixa de seleção Controle de versões de objetos (para controle de versões) e especifique o número máximo de versões por objeto e o número de dias após os quais as versões não atuais expiram.
        • Para ativar a política de retenção em objetos e buckets, clique na caixa de seleção Retenção (para compliance) e faça o seguinte:
          • Para ativar o bloqueio de retenção de objetos, clique na caixa de seleção Ativar retenção de objetos.
          • Para ativar o Bloqueio de bucket, clique na caixa de seleção Definir política de retenção de bucket e escolha uma unidade de tempo e um período de armazenamento para o seu período de armazenamento.
      • Para escolher como os dados do objeto serão criptografados, expanda a seção Criptografia de dados () e selecione um método de Criptografia de dados.
  4. Clique em Criar.

Gerar uma imagem personalizada

Você usa generate_custom_image.py, um programa em Python, para criar uma imagem personalizada do Serviço Gerenciado para Apache Spark.

Como funciona

O programa generate_custom_image.py inicia uma instância de VM temporária do Compute Engine com a imagem de base do Serviço Gerenciado para Apache Spark especificada e executa o script de customizaçã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 Serviço gerenciado para Apache Spark 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 Serviço Gerenciado para Apache Spark.

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 no GitHub, acesse Imagens personalizadas do Serviço Gerenciado para Apache Spark.

Em seguida, execute o script generate_custom_image.py para que o Serviço Gerenciado para Apache Spark 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.

  • --dataproc-version: a versão da imagem do Serviço Gerenciado para Apache Spark 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 vai executar para instalar seus pacotes personalizados ou realizar outras personalizações. Esse script é executado como um script de inicialização do Linux apenas na VM temporária usada para criar a imagem personalizada. Especifique um script de inicialização diferente para outras ações de inicialização que você quer executar ao criar um cluster com sua imagem personalizada.

    Imagens entre projetos:se a imagem personalizada for usada para criar clusters em projetos diferentes, poderá ocorrer um erro devido ao cache de comandos gcloud ou gsutil armazenado na imagem. Para evitar esse problema, inclua o comando a seguir no script de personalização para limpar as credenciais em cache.

    rm -r /root/.gsutil /root/.config/gcloud
    
  • --zone: a zona do Compute Engine em que generate_custom_image.py vai criar uma VM temporária para ser usada na criação da imagem personalizada.

  • --gcs-bucket: um URI, no formato gs://BUCKET_NAME, que aponta para seu bucket do Cloud Storage. generate_custom_image.py grava arquivos de registro nesse bucket.

Flags opcionais

  • --family: a família da imagem personalizada. 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-2-2-debian12.
  • --no-smoke-test: esta é uma sinalização opcional que desativa o teste de fumaça da imagem personalizada recém-criada. O teste preliminar cria um cluster de teste do Serviço Gerenciado para Apache Spark 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 Serviço Gerenciado para Apache Spark. Desativar essa etapa usando a flag --no-smoke-test acelera o processo de build 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 serviço gerenciado para Apache Spark. 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.
  • --optional-components: essa flag só está disponível ao usar versões 2.3 ou mais recentes da imagem de base. Uma lista de componentes opcionais, como SOLR, RANGER, TRINO, DOCKER, FLINK, HIVE_WEBHCAT, ZEPPELIN, HUDI, ICEBERG e PIG (disponível como um componente opcional nas versões de imagem 2.3 e mais recentes), para instalar na imagem.

    Exemplo: comando de criação de cluster da Google Cloud CLI:

    gcloud dataproc clusters create CLUSTER_NAME
        --image=CUSTOM_IMAGE_URI  \
        --optional-components=COMPONENT_NAME \
        ... other flags
    

Para ver uma lista de flags opcionais disponíveis, consulte Argumentos opcionais no GitHub.

Se generate_custom_image.py for bem-sucedido, o imageURI da imagem personalizada será mostrado 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 (uso avançado)

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

Uso avançado: se você usa seu próprio processo para criar uma imagem personalizada do Serviço Gerenciado para Apache Spark, adicione o rótulo goog-dataproc-version manualmente à imagem personalizada, conforme mostrado a seguir:

  1. Extraia o rótulo goog-dataproc-version da imagem de base do Serviço Gerenciado para Apache Spark 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,...]
    

Use uma imagem personalizada

Você especifica a imagem personalizada ao criar um cluster do Serviço Gerenciado para Apache Spark. A imagem personalizada é salva em Imagens do Cloud Compute e é válida por 365 dias para a criação de um cluster do Serviço gerenciado para Apache Spark. Para informações sobre como usar uma imagem após a data de validade, consulte 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/`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

Encontrar o URI da imagem personalizada

CLI do Google Cloud

Execute o comando a seguir para listar os nomes das suas imagens personalizadas.

gcloud compute images list

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

gcloud compute images describe custom-image-name

Snippet de saída:

...
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. Insira uma consulta no campo filter images para limitar o número de imagens exibidas.
  2. A página Detalhes da imagem é aberta. Clique em REST equivalente.
  3. A resposta REST lista informações adicionais sobre a imagem, incluindo o 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

Crie um cluster usando a CLI gcloud, a API do Serviço Gerenciado para Apache Spark ou o consoleGoogle Cloud .

CLI da gcloud

Crie um cluster do Serviço Gerenciado para Apache Spark com uma imagem personalizada usando o comando dataproc clusters create com a flag --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 dela no campo InstanceGroupConfig.imageUri com os objetos masterConfig, workerConfig e, se aplicável, secondaryWorkerConfig incluídos em uma solicitação de API cluster.create.

Exemplo:solicitação REST para criar um cluster padrão do Serviço Gerenciado para Apache Spark (um mestre, 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. Abra a página do Serviço Gerenciado para Apache Spark Criar um cluster. O painel Configurar cluster está selecionado.
  2. Na seção Controle de versões, clique em Mudar. Selecione a guia Imagem personalizada, escolha a imagem personalizada a ser usada no cluster do Serviço gerenciado para Apache Spark e clique em Selecionar. As VMs do cluster serão provisionadas com a imagem personalizada selecionada.

Substituir propriedades do cluster do Serviço Gerenciado para Apache Spark por uma imagem personalizada

É possível usar imagens personalizadas para substituir propriedades de cluster definidas durante a criação do cluster. Se você criar um cluster com uma imagem personalizada, e a operação de criação do cluster definir propriedades com valores diferentes daqueles definidos pela imagem personalizada, os valores de propriedade definidos pela 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.

    • Arquivo dataproc.custom.properties de amostra:
    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-managed-spark/dataproc.custom.properties
    dataproc.conscrypt.provider.enable=true
    dataproc.logging.stackdriver.enable=false
    EOF
    

Criar um cluster com uma imagem personalizada expirada

Por padrão, as imagens personalizadas expiram em 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 Serviço Gerenciado para Apache Spark com uma imagem personalizada expirada ou uma imagem personalizada que expire em 10 dias.

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --region=REGION \
        ... other flags
    
  2. A CLI gcloud vai emitir uma mensagem de erro que inclui o nome da propriedade dataproc:dataproc.custom.image.expiration.token do cluster e o valor do token.

dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE

Copie a string TOKEN_VALUE para a área de transferência.

  1. Use a CLI gcloud para criar outro cluster do Serviço Gerenciado para Apache Spark, adicionando o TOKEN_VALUE 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.