Dataproc 个人集群身份验证

创建 Dataproc 集群时,您可以启用 Dataproc 个人集群身份验证,以允许集群上的交互式工作负载以最终用户身份安全地运行。这意味着,与其他 Google Cloud 资源(如 Cloud Storage)的交互将以自己的身份(而非集群服务帐号)进行身份验证。

注意事项

  • 创建启用了个人集群身份验证的集群时,该集群只能由您的身份使用。其他用户将无法在集群上运行作业,也无法访问集群上的组件网关端点。

  • 启用了个人集群身份验证的集群会禁止 SSH 访问和 Compute Engine 功能,例如集群中所有虚拟机上的启动脚本。

  • 启用了个人集群身份验证的集群会自动在集群上启用和配置 Kerberos,以确保集群内通信的安全。但是,该集群上的所有 Kerberos 身份将以同一最终用户身份与 Google Cloud 资源进行交互。

  • Dataproc 个人集群身份验证目前不支持 Dataproc 工作流,并且通过 Dataproc Jobs API 提交的作业将继续在主“驱动程序”中以服务帐号身份进行身份验证,但在工作器任务中执行的代码将以最终用户身份进行身份验证。

  • Dataproc 个人集群身份验证仅适用于个人(真人)用户运行的交互式作业。长时间运行的作业和操作应配置和使用适当的服务帐号身份。

目标

  • 创建启用了 Dataproc 个人集群身份验证的 Dataproc 集群。

  • 开始向该集群传播凭据。

  • 在该集群上使用 Jupyter 笔记本来运行 Spark 作业,以使用您的凭据进行身份验证。

准备工作

创建项目

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  4. 启用 Dataproc API。

    启用 API

  5. 安装并初始化 Cloud SDK

配置环境

通过 Cloud Shell 或本地终端配置环境:

Cloud Shell

  1. 启动 Cloud Shell 会话。

  2. 安装 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
    

本地终端

  1. 安装 Python 3.6 及更高版本,以及 google-authrequests Python 库。

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

  2. 运行 gcloud auth login 以获取有效的用户凭据。

  3. 安装 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
    

创建集群并启用交互式会话

  1. 创建集群。

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

  2. 为集群启用凭据传播会话,以便在与 Google Cloud 资源交互时开始使用您的个人凭据。

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

您应该会看到如下所示的输出:

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. 保持运行该命令并切换到新的 Cloud Shell 标签页或终端会话。客户端会在运行命令的同时刷新凭据。

  2. 如需结束会话,请输入 Ctrl-C

在集群上访问 Jupyter

gcloud 命令

  1. 获取集群详情。
    gcloud dataproc clusters describe cluster-name
    

    集群详情中列出了 Jupyter 网页界面网址。

    ...
    JupyterLab: https://UUID-dot-us-central1.dataproc.googleusercontent.com/jupyter/lab/
    ...
    
  2. 将网址复制到本地浏览器中以启动 Jupyer 界面。
  3. 检查个人集群身份验证是否成功。
    1. 启动 Jupyter 终端。
    2. 运行 gcloud auth list
    3. 验证您的用户名是否是唯一的活跃帐号。
  4. 在 Jupyter 终端中,启用 Jupyter 以通过 Kerberos 进行身份验证并提交 Spark 作业。
    kinit -kt /etc/security/keytab/dataproc.service.keytab dataproc/$(hostname -f)
    
    1. 运行 klist 以验证 Jupyter 是否已获取有效的 TGT。
  5. 在 Juypter 终端中,使用 gsutil 在您的项目的 Cloud Storage 存储分区中创建 rose.txt 文件。
    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. 将该文件标记为不公开,以便只有您的用户帐号才可以对该文件执行读取和写入操作。在与 Cloud Storage 交互时,Jupyter 将使用您的个人凭据。
      gsutil acl set private gs://bucket-name/rose.txt
      
    2. 验证您的专用访问通道。
      gsutil acl get gs://$BUCKET/rose.txt
      

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

控制台

  1. 点击组件网关 Jupyter 链接以启动 Jupyter 界面。
  2. 检查个人集群身份验证是否成功。
    1. 启动 Jupyter 终端
    2. 运行 gcloud auth list
    3. 验证您的用户名是否是唯一的活跃帐号。
  3. 在 Jupyter 终端中,启用 Jupyter 以通过 Kerberos 进行身份验证并提交 Spark 作业。
    kinit -kt /etc/security/keytab/dataproc.service.keytab dataproc/$(hostname -f)
    
    1. 运行 klist 以验证 Jupyter 是否已获取有效的 TGT。
  4. 在 Juypter 终端中,使用 gsutil 在您的项目的 Cloud Storage 存储分区中创建 rose.txt 文件。
    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. 将该文件标记为不公开,以便只有您的用户帐号才可以对该文件执行读取和写入操作。在与 Cloud Storage 交互时,Jupyter 将使用您的个人凭据。
      gsutil acl set private gs://bucket-name/rose.txt
      
    2. 验证您的专用访问通道。
      gsutil acl get gs://$BUCKET/rose.txt
      
      [
      {
      "email": "$USER",
      "entity": "user-$USER",
      "role": "OWNER"
      }
      ]
      

通过 Jupyter 运行 PySpark 作业

  1. 转到相应文件夹,然后创建 PySpark 笔记本。
  2. 对上面创建的 rose.txt 文件运行基本字数统计作业。

    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())
    

    Spark 能够读取 Cloud Storage 中的 rose.txt 文件,因为它是使用您的用户凭据运行的。

    您还可以查看“GCS 存储分区”审核日志,以验证作业是否使用您的身份访问 Cloud Storage。

清理

  1. 结束交互式会话。

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

  2. 删除 Dataproc 集群。

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