Executar um job do Spark no Dataproc no Google Kubernetes Engine

Este documento começa listando alternativas para executar jobs do Spark em um cluster do Dataproc no Google Kubernetes Engine. Em seguida, mostramos como criar um cluster virtual do Dataproc no GKE e executar um job do Spark nele.

Visão geral das opções

Embora o Dataproc no GKE ofereça um controle eficiente para ambientes em contêineres, oGoogle Cloud também oferece opções totalmente gerenciadas e sem servidor que podem simplificar as operações e acelerar o desenvolvimento.

  • Dataproc no Compute Engine:para uma experiência familiar baseada em VM com controle máximo sobre o ambiente de cluster, o Dataproc no Compute Engine é ideal para migrar cargas de trabalho atuais do Hadoop e do Spark.

  • Google Cloud Serverless para Apache Spark:para uma experiência de operação zero com escalonamento automático, o Serverless para Apache Spark permite que você se concentre no seu código. Ele também é ideal para novos pipelines e análises interativas.

Para uma comparação das opções de implantação do Spark, consulte Decidir qual é o melhor serviço do Spark.

Antes de começar

  1. 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.
  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. Verifique se você tem as permissões necessárias para concluir este guia.

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

  5. Enable the Dataproc API.

    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 API

  6. Install the Google Cloud CLI.

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

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

    gcloud init
  9. 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

  10. Verifique se você tem as permissões necessárias para concluir este guia.

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

  12. Enable the Dataproc API.

    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 API

  13. Install the Google Cloud CLI.

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

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

    gcloud init
  16. Você precisa ter criado um cluster zonal ou regional padrão (não Autopilot) do Google Kubernetes Engine (GKE) com a Identidade da carga de trabalho ativada.

  17. Funções exigidas

    Alguns papéis do IAM são necessários para executar os exemplos nesta página. Dependendo das políticas da organização, essas funções já podem ter sido concedidas. Para verificar as concessões de papéis, consulte Você precisa conceder papéis?.

    Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

    Papéis do usuário

    Para receber as permissões necessárias para criar um cluster do Dataproc, peça ao administrador os seguintes papéis do IAM:

    Papel de conta de serviço

    Para garantir que a conta de serviço padrão do Compute Engine tenha as permissões necessárias para criar um cluster do Dataproc, peça ao administrador para conceder a ela o papel do IAM de worker do Dataproc (roles/dataproc.worker) no projeto.

    Criar um cluster virtual do Dataproc no GKE

    Um cluster virtual do Dataproc no GKE é criado como plataforma de implantação para componentes do Dataproc. É um recurso virtual e, ao contrário de um cluster do Dataproc no Compute Engine, não inclui VMs separadas do Dataproc mestre e worker.

    • O Dataproc no GKE cria pools de nós em um cluster do GKE quando você cria um cluster virtual do Dataproc no GKE.

    • Os jobs do Dataproc no GKE são executados como pods nesses pools de nós. Os pools de nós e o agendamento de pods neles são gerenciados pelo GKE.

    • Crie vários clusters virtuais. É possível criar e executar vários clusters virtuais em um cluster do GKE para melhorar a utilização de recursos compartilhando pools de nós entre os clusters virtuais.

      • Cada cluster virtual:
        • é criado com propriedades separadas, incluindo a versão do mecanismo do Spark e a identidade da carga de trabalho.
        • é isolado em um namespace separado do GKE no cluster do GKE

    Console

    1. No Google Cloud console, acesse a página Clusters do Dataproc.

      Acessar Clusters

    2. Clique em Criar cluster.

    3. Na caixa de diálogo Criar cluster do Dataproc, clique em Criar na linha Cluster no GKE.

    4. No painel Configurar cluster:

      1. No campo Nome do cluster, insira um nome para o cluster.
      2. Na lista Região, selecione uma região para o cluster virtual do Dataproc no GKE. Essa região precisa ser a mesma em que o cluster do GKE está localizado (que você seleciona no próximo item).
      3. No campo Cluster do Kubernetes, clique em Procurar para selecionar a região em que o cluster do GKE está localizado.
      4. Opcional: no campo Bucket de preparo do Cloud Storage, clique em Procurar para selecionar um bucket do Cloud Storage. O Dataproc no GKE vai armazenar os artefatos no bucket. Ignore este campo para que o Dataproc no GKE crie um bucket de organização.
    5. No painel à esquerda, clique em Configurar pools de nós e, no painel Pools de nós, clique em Adicionar um pool.

      1. Para reutilizar um pool de nós do Dataproc no GKE:
        1. Clique em Reutilizar o pool de nós atual.
        2. Insira o nome do pool de nós atual e selecione a Função. Pelo menos um pool de nós precisa ter a função DEFAULT.
        3. Clique em Concluído.
      2. Para criar um novo pool de nós do Dataproc no GKE:
        1. Clique em Criar um pool de nós.
        2. Insira os seguintes valores de pool de nós:
      3. Clique em Adicionar um pool para adicionar mais pools de nós. Todos os pools de nós precisam ter o local. É possível adicionar um total de quatro pools de nós.
    6. (Opcional) Se você configurou um servidor de histórico permanente (PHS) do Dataproc para usar na visualização do histórico de jobs do Spark em clusters ativos e excluídos do Dataproc no GKE, clique em Personalizar cluster. Em seguida, no campo Cluster do servidor de histórico, procure e escolha seu cluster do PHS. O cluster do PHS precisa estar na mesma região que o cluster virtual do Dataproc no GKE.

    7. Clique em Criar para criar o cluster do Dataproc. O cluster do Dataproc no GKE aparece em uma lista na página Clusters. O status é Provisionamento até que o cluster esteja pronto para uso e mude para Em execução.

    gcloud

    Defina variáveis de ambiente e execute o comando gcloud dataproc clusters gke create localmente ou no Cloud Shell para criar um cluster do Dataproc no GKE.

    1. Defina as variáveis de ambiente:

      DP_CLUSTER=Dataproc on GKE  cluster-name \
        REGION=region \
        GKE_CLUSTER=GKE cluster-name \
        BUCKET=Cloud Storage bucket-name \
        DP_POOLNAME=node pool-name
        PHS_CLUSTER=Dataproc PHS server name
      
      Observações:

      • DP_CLUSTER: defina o nome do cluster virtual do Dataproc, que precisa começar com uma letra minúscula, seguida de até 54 letras minúsculas, números ou hifens. Ele não pode terminar com um hífen.
      • REGION: o region precisa ser igual à região em que o cluster do GKE está localizado.
      • GKE_CLUSTER: o nome do cluster do GKE.
      • BUCKET: (opcional) é possível especificar o nome de um bucket do Cloud Storage, que o Dataproc vai usar para preparar artefatos. Se você não especificar um bucket, o Dataproc no GKE vai criar um bucket de preparo.
      • DP_POOLNAME: o nome de um pool de nós a ser criado no cluster do GKE.
      • PHS_CLUSTER: (opcional) servidor PHS do Dataproc para usar e conferir o histórico de jobs do Spark em clusters ativos e excluídos do Dataproc no GKE. O cluster do PHS precisa estar na mesma região que o cluster virtual do Dataproc no GKE.
    2. Execute o comando:

      gcloud dataproc clusters gke create ${DP_CLUSTER} \
          --region=${REGION} \
          --gke-cluster=${GKE_CLUSTER} \
          --spark-engine-version=latest \
          --staging-bucket=${BUCKET} \
          --pools="name=${DP_POOLNAME},roles=default" \
          --setup-workload-identity \
          --history-server-cluster=${PHS_CLUSTER}
      
      Observações:

      • --spark-engine-version: a versão da imagem do Spark usada no cluster do Dataproc. É possível usar um identificador, como 3, 3.1 ou latest, ou especificar a versão subminor completa, como 3.1-dataproc-5.
      • --staging-bucket: exclua essa flag para que o Dataproc no GKE crie um bucket de organização.
      • --pools: essa flag é usada para especificar um pool de nós novo ou existente que o Dataproc vai criar ou usar para realizar a carga de trabalho. Liste as configurações do pool de nós do Dataproc no GKE, separadas por vírgulas, por exemplo:
        --pools=name=dp-default,roles=default,machineType=e2-standard-4,min=0,max=10
        
        É preciso especificar o pool de nós name e role. Outras configurações de pool de nós são opcionais. É possível usar várias flags --pools para especificar vários pools de nós. Pelo menos um pool de nós precisa ter a função default. Todos os pools de nós precisam estar no mesmo local.
      • --setup-workload-identity: essa flag ativa as vinculações da Identidade da carga de trabalho. Essas vinculações permitem que as contas de serviço do Kubernetes (KSAs) atuem como a conta de serviço de VM do Dataproc (identidade do plano de dados) padrão do cluster virtual.

    REST

    Conclua um virtualClusterConfig como parte de uma solicitação cluster.create da API Dataproc.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT: ID do projeto do Google Cloud
    • REGION: região do cluster virtual do Dataproc (a mesma região do cluster do GKE atual)
    • DP_CLUSTER: nome do cluster do Dataproc
    • GKE_CLUSTER: nome do cluster do GKE
    • NODE_POOL: nome do pool de nós
    • PHS_CLUSTER: nome do cluster do servidor de histórico persistente (PHS)
    • BUCKET: (opcional) nome do bucket de staging. Deixe esse campo em branco para que o Dataproc no GKE crie um bucket de organização.

    Método HTTP e URL:

    POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/clusters

    Corpo JSON da solicitação:

    {
      "clusterName":"DP_CLUSTER",
      "projectId":"PROJECT",
      "virtualClusterConfig":{
        "auxiliaryServicesConfig":{
          "sparkHistoryServerConfig":{
            "dataprocCluster":"projects/PROJECT/regions/REGION/clusters/PHS_CLUSTER"
          }
        },
        "kubernetesClusterConfig":{
          "gkeClusterConfig":{
            "gkeClusterTarget":"projects/PROJECT/locations/REGION/clusters/GKE_CLUSTER",
            "nodePoolTarget":[
              {
    "nodePool":"projects/PROJECT/locations/REGION/clusters/GKE_CLUSTER/nodePools/NODE_POOL",
                "roles":[
                  "DEFAULT"
                ]
              }
            ]
          },
          "kubernetesSoftwareConfig":{
            "componentVersion":{
              "SPARK":"latest"
            }
          }
        },
        "stagingBucket":"BUCKET"
      }
    }
    
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "projectId":"PROJECT",
      "clusterName":"DP_CLUSTER",
      "status":{
        "state":"RUNNING",
        "stateStartTime":"2022-04-01T19:16:39.865716Z"
      },
      "clusterUuid":"98060b77-...",
      "statusHistory":[
        {
          "state":"CREATING",
          "stateStartTime":"2022-04-01T19:14:27.340544Z"
        }
      ],
      "labels":{
        "goog-dataproc-cluster-name":"DP_CLUSTER",
        "goog-dataproc-cluster-uuid":"98060b77-...",
        "goog-dataproc-location":"REGION",
        "goog-dataproc-environment":"prod"
      },
      "virtualClusterConfig":{
        "stagingBucket":"BUCKET",
        "kubernetesClusterConfig":{
          "kubernetesNamespace":"dp-cluster",
          "gkeClusterConfig":{
    "gkeClusterTarget":"projects/PROJECT/locations/REGION/clusters/GKE_CLUSTER",
            "nodePoolTarget":[
              {
    "nodePool":"projects/PROJECT/locations/REGION/clusters/GKE_CLUSTER/nodePools/NODE_POOL",
                "roles":[
                  "DEFAULT"
                ]
              }
            ]
          },
          "kubernetesSoftwareConfig":{
            "componentVersion":{
              "SPARK":"3.1-..."
            },
            "properties":{
              "dpgke:dpgke.unstable.outputOnly.endpoints.sparkHistoryServer":"https://...",
              "spark:spark.eventLog.dir":"gs://BUCKET/.../spark-job-history",
              "spark:spark.eventLog.enabled":"true"
            }
          }
        },
        "auxiliaryServicesConfig":{
          "sparkHistoryServerConfig":{
            "dataprocCluster":"projects/PROJECT/regions/REGION/clusters/PHS_CLUSTER"
          }
        }
      }
    

    Enviar um job do Spark

    Depois que o cluster virtual do Dataproc no GKE estiver em execução, envie um job do Spark usando o console Google Cloud , a gcloud CLI ou a API jobs.submit do Dataproc (usando solicitações HTTP diretas ou as Bibliotecas de cliente do Cloud).

    Exemplo de job do Spark da CLI gcloud:

    gcloud dataproc jobs submit spark \
        --region=${REGION} \
        --cluster=${DP_CLUSTER} \
        --class=org.apache.spark.examples.SparkPi \
        --jars=local:///usr/lib/spark/examples/jars/spark-examples.jar \
        -- 1000
    

    Exemplo de job do PySpark da CLI gcloud:

    gcloud dataproc jobs submit pyspark \
        --region=${REGION} \
        --cluster=${DP_CLUSTER} \
        local:///usr/lib/spark/examples/src/main/python/pi.py \
        -- 10
    

    Exemplo de job do SparkR da CLI gcloud:

    gcloud dataproc jobs submit spark-r \
        --region=${REGION} \
        --cluster=${DP_CLUSTER} \
        local:///usr/lib/spark/examples/src/main/r/dataframe.R
    

    Limpar