Execute uma tarefa do Spark no Dataproc no Google Kubernetes Engine

Este documento começa por apresentar alternativas à execução de tarefas do Spark num cluster do Dataproc no Google Kubernetes Engine. Em seguida, mostra-lhe como criar um cluster virtual do Dataproc on GKE e, depois, executar uma tarefa do Spark no cluster.

Vista geral das opções

Embora o Dataproc no GKE ofereça um controlo avançado para ambientes em contentores, também oferece opções sem servidores e totalmente geridas que podem simplificar as operações e acelerar o desenvolvimento.Google Cloud

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

  • Google Cloud Sem servidor para Apache Spark: para uma experiência sem operações com escalabilidade automática, o serviço sem servidor para Apache Spark permite-lhe focar-se no seu código. Também é ideal para novos pipelines e análise interativa.

Para uma comparação das opções de implementação do Spark, consulte o artigo Decida 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 tem as autorizaçõ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. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  8. Para inicializar a CLI gcloud, 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 tem as autorizaçõ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. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

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

    gcloud init
  16. Tem de ter criado um cluster zonal ou regional do Google Kubernetes Engine (GKE) padrão (não autopilot) com o Workload Identity ativado no cluster.

  17. Funções necessárias

    São necessárias determinadas funções de IAM para executar os exemplos nesta página. Consoante as políticas da organização, estas funções podem já ter sido concedidas. Para verificar as concessões de funções, consulte a secção Precisa de conceder funções?.

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Funções do utilizador

    Para receber as autorizações de que precisa para criar um cluster do Dataproc, peça ao seu administrador para lhe conceder as seguintes funções do IAM:

    Função da conta de serviço

    Para garantir que a conta de serviço predefinida do Compute Engine tem as autorizações necessárias para criar um cluster do Dataproc, peça ao seu administrador para conceder à conta de serviço predefinida do Compute Engine a função de IAM Trabalhador do Dataproc (roles/dataproc.worker) no projeto.

    Crie um cluster virtual do Dataproc no GKE

    É criado um cluster virtual do Dataproc no GKE como a plataforma de implementação dos componentes do Dataproc. É um recurso virtual e, ao contrário de um cluster do Dataproc no Compute Engine, não inclui VMs principais e de trabalho do Dataproc separadas.

    • O Dataproc no GKE cria node pools num cluster do GKE quando cria um cluster virtual do Dataproc no GKE.

    • As tarefas do Dataproc no GKE são executadas como pods nestes conjuntos de nós. Os node pools e o agendamento de pods nos node pools são geridos pelo GKE.

    • Crie vários clusters virtuais. Pode criar e executar vários clusters virtuais num cluster do GKE para obter uma utilização melhorada dos recursos partilhando conjuntos de nós entre os clusters virtuais.

      • Cada cluster virtual:
        • é criado com propriedades separadas, incluindo a versão do motor Spark e a identidade da carga de trabalho
        • está isolado num espaço de nomes do GKE separado no cluster do GKE

    Consola

    1. Na Google Cloud consola, aceda à página Dataproc Clusters.

      Aceda a 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, introduza um nome para o cluster.
      2. Na lista Região, selecione uma região para o cluster virtual do Dataproc no GKE. Esta região tem de ser a mesma região onde o cluster do GKE existente está localizado (que seleciona no item seguinte).
      3. No campo Cluster do Kubernetes, clique em Procurar para selecionar a região onde se encontra o cluster do GKE existente.
      4. Opcional: no campo Contentor de preparação do Cloud Storage, pode clicar em Procurar para selecionar um contentor do Cloud Storage existente. O Dataproc no GKE prepara os artefactos no contentor. Ignore este campo para que o Dataproc no GKE crie um contentor de preparação.
    5. No painel do lado esquerdo, clique em Configurar conjuntos de nós e, de seguida, no painel Conjuntos de nós, clique em Adicionar conjunto.

      1. Para reutilizar um node pool do Dataproc no GKE existente:
        1. Clique em Reutilizar pool de nós existente.
        2. Introduza o nome do conjunto de nós existente e selecione a respetiva função. Pelo menos, um conjunto de nós tem de ter a função PREDEFINIDA.
        3. Clique em Concluído.
      2. Para criar um novo conjunto de nós do Dataproc no GKE:
        1. Clique em Criar um novo conjunto de nós.
        2. Introduza os seguintes valores do conjunto de nós:
      3. Clique em Adicionar um conjunto para adicionar mais conjuntos de nós. Todos os conjuntos de nós têm de ter a localização. Pode adicionar um total de quatro conjuntos de nós.
    6. (Opcional) Se tiver configurado um servidor de histórico persistente (PHS) do Dataproc para usar para ver o histórico de tarefas do Spark, em clusters do Dataproc no GKE ativos e eliminados, clique em Personalizar cluster. Em seguida, no campo Cluster do servidor de histórico, procure e escolha o seu cluster do PHS. O cluster do PHS tem de estar localizado 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 on GKE aparece numa lista na página Clusters. O respetivo estado é Aprovisionamento até o cluster estar pronto a usar e, em seguida, o estado muda para Em execução.

    gcloud

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

    1. Defina 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
      
      Notas:

      • DP_CLUSTER: defina o nome do cluster virtual do Dataproc, que tem de começar com uma letra minúscula, seguida de até 54 letras minúsculas, números ou hífenes. Não pode terminar com um hífen.
      • REGION: O region tem de ser igual à região onde o cluster do GKE está localizado.
      • GKE_CLUSTER: o nome do cluster do GKE existente.
      • BUCKET: (Opcional) Pode especificar o nome de um contentor do Cloud Storage, que o Dataproc vai usar para preparar artefactos. Se não especificar um contentor, o Dataproc no GKE cria um contentor de preparação.
      • DP_POOLNAME: o nome de um node pool a criar no cluster do GKE.
      • PHS_CLUSTER: (Opcional) servidor PHS do Dataproc a usar para ver o histórico de tarefas do Spark em clusters do Dataproc no GKE ativos e eliminados. O cluster do PHS tem de estar localizado 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}
      
      Notas:

      • --spark-engine-version: a versão da imagem do Spark usada no cluster do Dataproc. Pode usar um identificador, como 3, 3.1 ou latest, ou pode especificar a versão subminor completa, como 3.1-dataproc-5.
      • --staging-bucket: elimine esta flag para que o Dataproc no GKE crie um contentor de preparação.
      • --pools: esta flag é usada para especificar um conjunto de nós novo ou existente que o Dataproc vai criar ou usar para executar a carga de trabalho. List Dataproc on GKE node pool settings, separados por vírgulas, por exemplo:
        --pools=name=dp-default,roles=default,machineType=e2-standard-4,min=0,max=10
        
        Tem de especificar o conjunto de nós name e role. As outras definições do conjunto de nós são opcionais. Pode usar várias flags --pools para especificar vários conjuntos de nós. Pelo menos, um conjunto de nós tem de ter a função default. Todos os conjuntos de nós têm de ter a mesma localização.
      • --setup-workload-identity: este sinalizador ativa as associações do Workload Identity. Estas associações permitem que as contas de serviço do Kubernetes (KSAs) atuem como a conta de serviço da VM do Dataproc (identidade do plano de dados) predefinida do cluster virtual.

    REST

    Conclua um virtualClusterConfig como parte de um pedido cluster.create da API Dataproc.

    Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

    • PROJECT: ID do projeto do Google Cloud
    • REGION: região do cluster virtual do Dataproc (a mesma região que a região do cluster do GKE existente)
    • DP_CLUSTER: nome do cluster do Dataproc
    • GKE_CLUSTER: nome do cluster do GKE
    • NODE_POOL: nome do node pool
    • PHS_CLUSTER: Nome do cluster do servidor de histórico persistente (PHS)
    • BUCKET: (Opcional) Nome do contentor de preparação. Deixe este campo vazio para que o Dataproc no GKE crie um contentor de preparação.

    Método HTTP e URL:

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

    Corpo JSON do pedido:

    {
      "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 o seu pedido, expanda uma destas opções:

    Deve receber uma resposta JSON semelhante à seguinte:

    {
      "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"
          }
        }
      }
    

    Envie uma tarefa do Spark

    Depois de o cluster virtual do Dataproc no GKE estar em execução, envie uma tarefa do Spark através da Google Cloud consola, da CLI gcloud ou da API jobs.submit Dataproc (através de pedidos HTTP diretos ou das bibliotecas cliente da Google Cloud).

    Exemplo de tarefa 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 tarefa 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 tarefa 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