Autenticação de cluster pessoal do Dataproc

Ao criar um cluster do Dataproc, você pode ativar a autenticação de cluster pessoal do Dataproc para permitir que as cargas de trabalho interativas no cluster sejam executadas com segurança como sua identidade de usuário final. Isso significa que as interações com outros recursos do Google Cloud, como o Cloud Storage, serão autenticadas como você em vez de como a conta do serviço de cluster.

Considerações

  • Quando você cria um cluster com a autenticação de cluster pessoal ativada, o cluster só poderá ser usado pela sua identidade. Outros usuários não poderão executar jobs no cluster nem acessar os endpoints do Gateway de componentes no cluster.

  • Os clusters com a autenticação de cluster pessoal ativa bloqueiam o acesso SSH e os recursos do Compute Engine, como scripts de inicialização em todas as VMs no cluster.

  • Os clusters com a autenticação de cluster pessoal ativada são automaticamente ativados e configuram o Kerberos no cluster para a comunicação segura entre clusters. No entanto, todas as identidades do Kerberos no cluster vão interagir com os recursos do Google Cloud como o mesmo usuário final.

  • No momento, a autenticação de cluster pessoal do Dataproc não é compatível com os fluxos de trabalho do Dataproc e os jobs enviados por meio da API Jobs do Dataproc continuarão sendo autenticados como a conta de serviço no principal programa "driver", mas o código executado nas tarefas do worker será autenticado como a identidade do usuário final.

  • A autenticação de cluster pessoal do Dataproc destina-se apenas a jobs interativos executados por um usuário individual (humano). Jobs e operações de longa duração precisam configurar e usar uma identidade de conta de serviço apropriada.

Objetivos

  • Crie um cluster do Dataproc com a autenticação de cluster pessoal do Dataproc ativada.

  • Inicie a propagação de credencial no cluster.

  • Usar um notebook do Jupyter no cluster para executar jobs do Spark que autenticam com suas credenciais.

Antes de começar

Criar um projeto

  1. Faça login na sua conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. No Console do Cloud, na página do seletor de projetos, selecione ou crie um projeto do Cloud.

    Acessar a página do seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como confirmar se a cobrança está ativada para o seu projeto.

  4. Ative a API Dataproc.

    Ative a API

  5. Instale e inicialize o SDK do Cloud..

Configure o ambiente

Configure o ambiente a partir do Cloud Shell ou de um terminal local:

Cloud Shell

  1. Inicie uma sessão do Cloud Shell.

  2. Instale o auxiliar de cliente da autenticação pessoal do Dataproc.

    wget -O gcloud_dataproc_personal_cluster.py https://storage.googleapis.com/cloud-dataproc/tools/gcloud_dataproc_personal_cluster.py
    
    chmod +x gcloud_dataproc_personal_cluster.py
    

Terminal local

  1. Instale o Python 3.6 ou superior google-auth e requests as bibliotecas Python.

    sudo apt-get install python3-pip
    
    pip3 install google-auth
    
    pip3 install requests
    

  2. Execute gcloud auth login para receber credenciais de usuário válidas.

  3. Instale o auxiliar de cliente da autenticação pessoal do Dataproc.

    wget -O gcloud_dataproc_personal_cluster.py https://storage.googleapis.com/cloud-dataproc/tools/gcloud_dataproc_personal_cluster.py
    
    chmod +x gcloud_dataproc_personal_cluster.py
    

Criar um cluster e ativar uma sessão interativa

  1. Crie um cluster.

    ./gcloud_dataproc_personal_cluster.py create  cluster-name \
        --optional-components=ANACONDA,JUPYTER,ZEPPELIN \
        --region=region
    

  2. Ative uma sessão de propagação de credenciais para o cluster começar a usar suas credenciais pessoais ao interagir com os recursos do Google Cloud.

./gcloud_dataproc_personal_cluster.py enable-session \
    --region=region \
    cluster-name

A resposta será assim:

Enabling session...
Found instance IDs: ['3967997218955957976', '3369851129530390232', '8339066009681630936']
Applying organization-level boundary with org id 172397083938
Refreshing token for instance_uuid 3967997218955957976...
Refreshing token for instance_uuid 3369851129530390232...
Refreshing token for instance_uuid 8339066009681630936...
  1. Mantenha o comando em execução e alterne para uma nova guia ou sessão de terminal do Cloud Shell. O cliente atualizará as credenciais enquanto o comando estiver em execução.

  2. Para encerrar a sessão, digite Ctrl-C.

Acessar o Jupyter no cluster

Comando gcloud

  1. Receber detalhes do cluster.
    gcloud dataproc clusters describe cluster-name
    

    O URL da interface da Web do Jupyter está listado nos detalhes do cluster.

    ...
    JupyterLab: https://UUID-dot-us-central1.dataproc.googleusercontent.com/jupyter/lab/
    ...
    
  2. Copie o URL no navegador local para iniciar a IU do Jupyer.
  3. Verifique se a autenticação do cluster pessoal foi bem-sucedida.
    1. Inicie um terminal do Jupyter.
    2. Executar gcloud auth list
    3. Verifique se seu nome de usuário é a única conta ativa.
  4. Em um terminal Jupyter, ative o Jupyter para autenticar com o Kerberos e enviar jobs do Spark.
    kinit -kt /etc/security/keytab/dataproc.service.keytab dataproc/$(hostname -f)
    
    1. Execute klist para verificar se o Jupyter teve um TGT válido.
  5. Em um terminal do Juypter, use gsutil para criar um arquivo rose.txt em um bucket do Cloud Storage no seu projeto.
    echo "A rose by any other name would smell as sweet" > /tmp/rose.txt
    

    gsutil cp /tmp/rose.txt gs://bucket-name/rose.txt
    
    1. Marque o arquivo como privado para que apenas a sua conta de usuário possa ler ou gravar nele. O Jupyter usará suas credenciais pessoais ao interagir com o Cloud Storage.
      gsutil acl set private gs://bucket-name/rose.txt
      
    2. Verifique o acesso privado.
      gsutil acl get gs://$BUCKET/rose.txt
      

      [
      {
      "email": "$USER",
      "entity": "user-$USER",
      "role": "OWNER"
      }
      ]
      

Console

  1. Clique no link Jupyter Gateway de Componentes para iniciar a IU do Jupyter.
  2. Verifique se a autenticação do cluster pessoal foi bem-sucedida.
    1. Iniciar um terminal do Jupyter
    2. Executar gcloud auth list
    3. Verifique se seu nome de usuário é a única conta ativa.
  3. Em um terminal Jupyter, ative o Jupyter para autenticar com o Kerberos e enviar jobs do Spark.
    kinit -kt /etc/security/keytab/dataproc.service.keytab dataproc/$(hostname -f)
    
    1. Execute klist para verificar se o Jupyter teve um TGT válido.
  4. Em um terminal do Juypter, use gsutil para criar um arquivo rose.txt em um bucket do Cloud Storage no seu projeto.
    echo "A rose by any other name would smell as sweet" > /tmp/rose.txt
    

    gsutil cp /tmp/rose.txt gs://bucket-name/rose.txt
    
    1. Marque o arquivo como privado para que apenas a sua conta de usuário possa ler ou gravar nele. O Jupyter usará suas credenciais pessoais ao interagir com o Cloud Storage.
      gsutil acl set private gs://bucket-name/rose.txt
      
    2. Verifique o acesso privado.
      gsutil acl get gs://$BUCKET/rose.txt
      
      [
      {
      "email": "$USER",
      "entity": "user-$USER",
      "role": "OWNER"
      }
      ]
      

Executar um job do PySpark no Jupyter

  1. Navegue até uma pasta e crie um notebook do PySpark.
  2. Execute um job básico de contagem de palavras no arquivo rose.txt criado acima.

    text_file = sc.textFile("gs://$BUCKET/rose.txt")
    counts = text_file.flatMap(lambda line: line.split(" ")) \
             .map(lambda word: (word, 1)) \
             .reduceByKey(lambda a, b: a + b)
    print(counts.collect())
    

    O Spark é capaz de ler o arquivo rose.txt no Cloud Storage porque ele é executado com suas credenciais de usuário.

    Também é possível verificar os Registros de auditoria do "bucket do GCS" para verificar se o job está acessando o Cloud Storage com sua identidade.

Limpar

  1. Encerre a sessão interativa.

    ./gcloud_dataproc_personal_cluster.py disable-session \
        --region=region cluster-name
    

  2. Exclua o cluster do Dataproc.

    gcloud dataproc clusters delete cluster-name --region=region