Dataproc 组件网关

Google Dataproc 集群附带的一些默认开源组件(例如 Apache HadoopApache Spark)提供了网页界面。这些界面可用于管理和监控集群资源和设施,例如 YARN 资源管理器、Hadoop 分布式文件系统 (HDFS)、MapReduce 和 Spark。组件网关让 Dataproc 的默认组件和可选组件可以安全访问 Web 端点。

使用受支持的 Dataproc 映像版本创建的集群可以实现对组件网页界面的访问,无需依赖 SSH 隧道修改防火墙规则来允许入站流量。

注意事项

  • 用户必须具有 dataproc.clusters.use Identity and Access Management 权限才能访问已启用的组件网页界面。请参阅 Dataproc 角色
  • 组件网关可用于访问 REST API(例如 Apache Hadoop YARNApache Livy)以及历史记录服务器。
  • 启用组件网关后,Dataproc 会向集群的第一个主节点添加以下服务:
  • 组件网关不支持直接访问 node:port 接口,而是自动代理特定的服务子集。如果要访问节点 (node:port) 上的服务,请使用 SSH SOCKS 代理

使用组件网关创建集群

控制台

当您使用 Google Cloud 控制台创建集群时,Dataproc 组件网关默认处于启用状态。如需停用此设置,请清除 Dataproc 的在 Compute Engine 上创建 Dataproc 集群页面上设置集群面板的组件部分中的启用组件网关复选框。

gcloud 命令

在终端窗口或 Cloud Shell 中以本地方式运行 gcloud CLI gcloud dataproc clusters create 命令。

gcloud dataproc clusters create cluster-name \
    --enable-component-gateway \
    --region=region \
    other args ...

REST API

EndpointConfig.enableHttpPortAccess 属性设置为 true(作为 clusters.create 请求的一部分)。

使用组件网关网址访问网页界面

在集群上启用组件网关后,您可以通过点击 Google Cloud 控制台上提供的链接,连接集群的第一个主节点上运行的组件网页界面。组件网关还通过将端口名映射为网址来设置 endpointConfig.httpPorts。作为使用控制台的替代方法,您可以使用 gcloud 命令行工具或 Dataproc REST API 查看此映射信息,然后将网址复制并粘贴到浏览器中以连接组件的界面。

控制台

导航到 Google Cloud Console 上的 Dataproc 集群表单,然后选择您的集群以打开集群详细信息表单。点击网页界面标签页以显示组件网关链接列表,这些链接指向安装在集群上的默认组件和可选组件的网页界面。点击链接以在本地浏览器中打开集群的主节点上运行的网页界面。

gcloud 命令

在终端窗口或 Cloud Shell 中以本地方式运行 gcloud CLI gcloud dataproc clusters describe 命令。

gcloud dataproc clusters describe cluster-name \
    --region=region

输出示例

...
config:
  endpointConfig:
    enableHttpPortAccess: true
    httpPorts:
      HDFS NameNode:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/hdfs/ MapReduce Job History:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/jobhistory/ Spark HistoryServer:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/sparkhistory/ YARN ResourceManager:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/yarn/ YARN Application Timeline:
https://584bbf70-7a12-4120-b25c-31784c94dbb4-dot-dataproc.google.com/apphistory/ ...

REST API

调用 clusters.get 获取端口名称到网址的 endpointConfig.httpPorts 映射。

将组件网关与 VPC-SC 配合使用

组件网关支持 VPC Service Controls。为强制执行服务边界,通过组件网关对界面发送的请求视为 Dataproc API 表面的一部分,控制 dataproc.googleapis.com 权限的所有访问权限政策也将控制对组件网关界面的访问权限

组件网关还支持 VPC-SC 配置,这些配置依赖于没有外部 IP 地址的 Dataproc 集群的专用 Google 连接,但您必须手动配置网络,以允许通过受限 Google 虚拟 IP 范围 199.36.153.4/30 从 Dataproc 主虚拟机访问 *.dataproc.cloud.google.com

  1. 按照相关说明为所有 Google API 配置专用 Google 连接
  2. 使用 Cloud DNS 配置 DNS在 Dataproc 主实例节点上本地配置 DNS 以允许访问 *.dataproc.cloud.google.com

使用 Cloud DNS 配置 DNS

创建一个 Cloud DNS 地区,将发往 *.dataproc.cloud.google.com 的流量映射到受限的 Google API 虚拟 IP 地址范围。

  1. 为您的 VPC 网络创建一个托管专用地区。

    gcloud dns managed-zones create ZONE_NAME \
     --visibility=private \
     --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME \
     --description=DESCRIPTION \
     --dns-name=dataproc.cloud.google.com \
     --project=PROJECT_ID
    
    • ZONE_NAME 是您要创建的区域的名称。例如 vpc。以下每个步骤都会用到该地区名称。

    • PROJECT_ID 是托管 VPC 网络的项目的 ID。

    • NETWORK_NAME 为 VPC 网络的名称。

    • DESCRIPTION 是可选的,用于提供有关托管式区域的直观易懂说明。

  2. 启动一项事务。

    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    • ZONE_NAME 是您的地区名称。
  3. 添加 DNS 记录。

    gcloud dns record-sets transaction add --name=*.dataproc.cloud.google.com. \
        --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
        --zone=ZONE_NAME \
        --ttl=300
    
    • ZONE_NAME 是您的地区名称。
    gcloud dns record-sets transaction add --name=dataproc.cloud.google.com. \
        --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
        --zone=ZONE_NAME \
        --ttl=300
    
    • ZONE_NAME 是您的地区名称。
  4. 执行事务。

    gcloud dns record-sets transaction execute --zone=ZONE_NAME --project=PROJECT_ID
    
    • ZONE_NAME 是您的地区名称。

    • PROJECT_ID 是托管 VPC 网络的项目的 ID。

使用初始化操作在 Dataproc 主实例节点主实例节点上本地配置 DNS

您可以在 Dataproc 主实例节点上本地配置 DNS,以允许专用连接到 dataproc.cloud.google.com。此过程适用于短期测试和开发。不建议在生产工作负载中使用。

  1. 将初始化操作暂存至 Cloud Storage。

    cat <<EOF >component-gateway-vpc-sc-dns-init-action.sh
    #!/bin/bash
    readonly ROLE="$(/usr/share/google/get_metadata_value attributes/dataproc-role)"
    
    if [[ "${ROLE}" == 'Master' ]]; then
      readonly PROXY_ENDPOINT=$(grep "^dataproc.proxy.agent.endpoint=" \
        "/etc/google-dataproc/dataproc.properties" | \
        tail -n 1 | cut -d '=' -f 2- | sed -r 's/\\([#!=:])/\1/g')
    
      readonly HOSTNAME=$(echo ${PROXY_ENDPOINT} | \
        sed -n -E 's;^https://([^/?#]*).*;\1;p')
    
      echo "199.36.153.4 ${HOSTNAME}  # Component Gateway VPC-SC" >> "/etc/hosts"
    fi
    EOF
    
    gcloud storage cp component-gateway-vpc-sc-dns-init-action.sh gs://BUCKET/
    
    • BUCKET 是可从 Dataproc 集群访问的 Cloud Storage 存储分区。
  2. 创建使用暂存的初始化操作并启用组件网关的 Dataproc 集群。

    gcloud dataproc clusters create cluster-name \
        --region=region \
        --initialization-actions=gs://BUCKET/component-gateway-vpc-sc-dns-init-action.sh \
        --enable-component-gateway \
        other args ...
    
    • BUCKET 是上面第 1 步中使用的 Cloud Storage 存储分区。

通过组件网关以编程方式使用 HTTP API

组件网关是一种采用 Apache Knox 的代理。可通过 https://component-gateway-base-url/component-path 获取由 Apache Knox 公开的端点。

如需使用组件网关以编程方式进行身份验证,请使用 OAuth 2.0 Bearer 令牌传递标头 Proxy-Authorization

$ ACCESS_TOKEN="$(gcloud auth print-access-token)"
$ curl -H "Proxy-Authorization: Bearer ${ACCESS_TOKEN}" "https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/yarn/jmx"
{
  "beans" : [ {
    "name" : "Hadoop:service=ResourceManager,name=RpcActivityForPort8031",
    "modelerType" : "RpcActivityForPort8031",
    "tag.port" : "8031",
    "tag.Context" : "rpc",
    "tag.NumOpenConnectionsPerUser" : "{\"yarn\":2}",
    "tag.Hostname" : "demo-cluster-m",
    "ReceivedBytes" : 1928581096,
    "SentBytes" : 316939850,
    "RpcQueueTimeNumOps" : 7230574,
    "RpcQueueTimeAvgTime" : 0.09090909090909091,
    "RpcProcessingTimeNumOps" : 7230574,
    "RpcProcessingTimeAvgTime" : 0.045454545454545456,
...

在将请求转发到 Apache Knox 之前,组件网关会删除 Proxy-Authorization 标头。

如需查找组件网关基准网址,请运行:gcloud dataproc clusters describe

$ gcloud dataproc clusters describe <var>cluster-name</var> &#92;
    &nbsp;&nbsp;&nbsp;&nbsp;--region=<var>region</var>
...
  endpointConfig:
    enableHttpPortAccess: true
    httpPorts:
      HDFS NameNode: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/hdfs/dfshealth.html
      MapReduce Job History: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/jobhistory/
      Spark History Server: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/sparkhistory/
      Tez: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/apphistory/tez-ui/
      YARN Application Timeline: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/apphistory/
      YARN ResourceManager: https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/yarn/

...

基础网址是 httpPorts 下网址的架构和授权部分。在此示例中,该网址为 https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/

如何重新生成组件网关 SSL 证书

组件网关默认 Knox 网关 SSL 证书的有效期:

  • 对于使用映像版本 2.0.93、2.1.41、2.2.7 及更高版本创建的集群,从 Dataproc 集群创建之日起 5 年。

  • 对于使用早期映像版本创建的集群,从 Dataproc 集群创建之日起算 13 个月。

如果证书过期,所有组件网关网页界面网址都会变为无效。

如果是您的组织提供的 SSL 证书,请从该组织获取新的证书,然后用新证书替换旧证书。

如果您使用的是默认的自签名 SSL 证书,请按照以下步骤进行续订:

  1. 使用 SSH 连接到带有 m-0 名称后缀的 Dataproc 集群主节点。

  2. /var/lib/knox/security/keystores/gateway.jks 路径中找到 gateway.jks

    keytool -list -v -keystore /var/lib/knox/security/keystores/gateway.jks
    
  3. gateway.jks 文件移至备份目录。

    mv /var/lib/knox/security/keystores/gateway.jks /tmp/backup/gateway.jks
    
  4. 通过重启 Knox 服务创建新的自签名证书。

    systemctl restart knox
    
  5. 验证组件网关和 Knox 状态。

    systemctl status google-dataproc-component-gateway
    systemctl status knox
    

后续步骤