Dataproc 组件网关

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

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

注意事项

  • 具有 dataproc.clusters.use IAM 权限的用户可以访问组件网页界面。请参阅 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 控制台上的 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 权限的所有访问权限政策也将控制对组件网关界面的访问权限

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

后续步骤