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 inclui os pacotes pré-instalados. Nesta página, mostramos 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 as 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 seja necessário usar a automação se você quiser criar clusters com uma imagem personalizada específica por um período superior a 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 podem ser compatíveis em futuras versões do Serviço Gerenciado para Apache Spark.

  • Imagens de base compatíveis:as builds de imagens personalizadas precisam começar com 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.

* Usando componentes opcionais:

  • Imagens de base 2.2 e anteriores: por padrão, todos os componentes opcionais do Serviço Gerenciado para Apache Spark (pacotes e configurações do SO) são instalados na imagem personalizada. É possível personalizar as versões e configurações do pacote do SO.

  • Imagens de base 2.3 e mais recentes: somente os componentes opcionais selecionados são instalados na imagem personalizada. Consulte a flag generate_custom_image.py --optional-components.

    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 ao criar o cluster, o componente opcional, incluindo pacotes e configurações personalizados do SO, será excluído.

  • Usar imagens personalizadas hospedadas:se você usar 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 precisará ter a permissão compute.images.get na imagem no projeto host. Para conceder essa permissão, atribua 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 projeto. Consulte 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: é necessário 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 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 sua imagem personalizada.

Antes de começar

Configure seu 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 Cloudagora, crie uma conta para avaliar o desempenho dos 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, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    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, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. Instale o Python 3.11 ou uma 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 serã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 do objeto, clique na caixa de seleção Controle de versões do objeto (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 e um período de armazenamento para a retenção.
      • 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 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 temporária de VM do Compute Engine com a imagem de base especificada do Serviço Gerenciado para Apache Spark e executa o script de customização dentro da instância de VM para instalar pacotes personalizados e/ou atualizar configurações. Depois que o script de personalização termina, ele encerra a instância de VM e cria uma imagem personalizada do Serviço gerenciado para Apache Spark no disco da instância de VM. 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

Faça um fork ou clone os arquivos no GitHub em 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 sua 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 fazer outras personalizações. Esse script é executado como um script de inicialização do Linux somente na VM temporária usada para criar a imagem personalizada. É possível especificar um script de inicialização diferente para outras ações de inicialização que você quer realizar 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 armazenadas 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 usar na criação da sua imagem personalizada.

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

Flags opcionais

  • --family: a família de imagens 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 rápido cria um cluster de teste do Serviço Gerenciado para Apache Spark com a imagem recém-criada, executa um job pequeno e exclui o cluster no final do teste. O teste de fumaça é executado por padrão 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 de imagens personalizadas, mas não é recomendável.
  • --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 e 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 conferir uma lista das 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 aparece 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 personalizados de versão de imagem (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ê usar 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 da seguinte forma:

  1. Extraia o rótulo goog-dataproc-version da imagem 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. Uma imagem personalizada é salva em Imagens do Cloud Compute e é válida para criar um cluster do Serviço Gerenciado para Apache Spark por 365 dias a partir da data de criação. Consulte Criar um cluster com uma imagem personalizada expirada para usar uma imagem personalizada após a data de expiração de 365 dias.

URI de imagem personalizada

Você transmite 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 comando a seguir para listar o URI (selfLink) dela.

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 doGoogle Cloud

  1. Abra a página Compute Engine→Imagens no console do Google Cloud e clique no nome da imagem. Você pode inserir uma consulta no campo filter images para limitar o número de imagens mostradas.
  2. A página Detalhes das imagens é 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 Dataproc ou o console doGoogle Cloud .

Console doGoogle Cloud

  1. Abra a página Criar cluster.
  2. Na seção Defina seu cluster, clique em Tipo e versão da imagem, selecione Imagem personalizada e confirme ou mude o projeto e selecione uma imagem personalizada disponível.

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 da imagem personalizada no campo InstanceGroupConfig.imageUri no objeto masterConfig, workerConfig e, se aplicável, secondaryWorkerConfig incluído 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"
    }
  }
}
  

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

É possível usar imagens personalizadas para substituir as propriedades do cluster definidas durante a criação dele. 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 substituir duas propriedades do 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 365 dias após a data de criação. É possível criar um cluster com uma imagem personalizada expirada seguindo estas etapas.

  1. Tentar criar um cluster do Serviço Gerenciado para Apache Spark com uma imagem personalizada expirada ou que vai expirar em até 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 o cluster do Serviço Gerenciado para Apache Spark novamente, adicionando o TOKEN_VALUE copiado como uma propriedade do 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.