Puerta de enlace de componentes de Dataproc

Algunos de los componentes de código abierto predeterminados incluidos en los clústeres de Google Dataproc, como Apache Hadoop y Apache Spark, proporcionan interfaces web. Estas interfaces se pueden usar para administrar y supervisar los recursos y las instalaciones del clúster, como el administrador de recursos YARN, el sistema de archivos distribuidos de Hadoop (HDFS), MapReduce y Spark. La puerta de enlace de componentes proporciona acceso seguro a los extremos web para los componentes predeterminados y opcionales de Dataproc.

Los clústeres creados con la versión 1.3.29 y posteriores de la imagen de Dataproc pueden habilitar el acceso a las interfaces web de componentes sin depender de túneles SSH ni modificar reglas de firewall para permitir el tráfico entrante.

Consideraciones

  • Los usuarios que tienen el permiso de IAM dataproc.clusters.use pueden acceder a las interfaces web de los componentes. De forma predeterminada, solo los miembros del proyecto tienen este permiso (consulta Funciones de Dataproc).
  • La puerta de enlace de componentes se puede usar para acceder a las API de REST, como Apache Hadoop YARN, Apache Livy y servidores de historial.
  • Cuando la puerta de enlace de componentes está habilitada, el primer nodo principal del clúster tendrá los siguientes servicios adicionales:
  • La puerta de enlace de componentes no habilita el acceso directo a las interfaces node:port, sino que envía automáticamente por proxy un subconjunto específico de servicios. Si deseas acceder a los servicios en los nodos (node:port), usa un proxy SSH SOCKS.

Crea un clúster con puerta de enlace de componentes

Console

Para habilitar la puerta de enlace de componentes desde Cloud Console, marca la casilla de verificación Component Gateway (Puerta de enlace de componentes) en el formulario Create a cluster (Crear un clúster) de Dataproc.

Comando de gcloud

Ejecuta el comando gcloud dataproc clusters create del SDK de Cloud de manera local en una ventana de la terminal o en Cloud Shell.

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

API de REST

Configura la propiedad EndpointConfig.enableHttpPortAccess como true como parte de una solicitud clusters.create.

Visualiza y accede a las URL de puerta de enlace de componentes

Cuando la puerta de enlace de componentes está habilitada en un clúster, se puede hacer clic en los vínculos proporcionados en Cloud Console para conectarse a las interfaces web de los componentes que se ejecutan en el primer nodo principal del clúster. La puerta de enlace de componentes también establece endpointConfig.httpPorts con una asignación de nombres de puertos a URL. Como alternativa al uso de la consola, puedes usar la herramienta de línea de comandos de gcloud o la API de REST de Dataproc para ver esta información de asignación. Luego, copia y pega la URL en el navegador para conectarte a la IU del componente.

Console

Navega hasta el formulario Clústeres de Dataproc en Google Cloud Console y, luego, selecciona tu clúster para abrir el formulario Cluster details (Detalles del clúster). Haz clic en la pestaña Web Interfaces (Interfaces web) para ver una lista de los vínculos de puerta de enlace de componentes a las interfaces web de los componentes predeterminados y opcionales instalados en el clúster. Haz clic en un vínculo para abrir la interfaz web que se ejecuta en el nodo principal del clúster en tu navegador local.

Comando de gcloud

Ejecuta el comando gcloud dataproc clusters describe del SDK de Cloud de manera local en una ventana de la terminal o en Cloud Shell.

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

Resultado de muestra:

...
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/ ...

API de REST

Llama a clusters.get para obtener la asignación endpointConfig.httpPorts de nombres de puertos a URL.

Usa la puerta de enlace de componentes con VPC-SC

La puerta de enlace de componentes es compatible con los controles del servicio de VPC. Para la aplicación del perímetro de servicio, las solicitudes a las interfaces mediante la puerta de enlace de componentes se incluyen como parte de la superficie de la API de Dataproc y cualquier política de acceso que controle los permisos de dataproc.googleapis.com también controlará el acceso a las IU de puerta de enlace de componentes.

La puerta de enlace de componentes también admite configuraciones de VPC-SC que dependen de la conectividad privada de Google para clústeres de Dataproc sin direcciones IP externas. Sin embargo, debes configurar la red de forma manual para permitir el acceso de la VM principal de Dataproc a *.dataproc.cloud.google.com a través del rango restringido 199.36.153.4/30 de IP virtual de Google mediante los siguientes pasos:

  1. Sigue las instrucciones a fin de configurar la conectividad privada de Google para todas las API de Google.
  2. Configura DNS con Cloud DNS o de forma local en el nodo principal de Dataproc para permitir el acceso a *.dataproc.cloud.google.com.

Configura DNS con Cloud DNS

Crea una zona de Cloud DNS que asigne el tráfico destinado para *.dataproc.cloud.google.com al rango restringido de IP virtual de la API de Google.

  1. Crea una zona privada administrada para tu red de 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 es un nombre para la zona que estás creando. Por ejemplo, vpc Este nombre de zona se usará en cada uno de los siguientes pasos.

    • PROJECT_ID es el ID del proyecto que aloja tu red de VPC.

    • NETWORK_NAME es el nombre de la red de VPC.

    • DESCRIPTION es una descripción opcional y legible de la zona administrada.

  2. Inicia una transacción.

    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    • ZONE_NAME es el nombre de la zona.
  3. Agrega registros 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 es el nombre de la zona.
    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 es el nombre de la zona.
  4. Ejecuta la transacción.

    gcloud dns record-sets transaction execute --zone=ZONE_NAME --project=PROJECT_ID
    
    • ZONE_NAME es el nombre de la zona.

    • PROJECT_ID es el ID del proyecto que aloja tu red de VPC.

Configura DNS de forma local en el nodo principal de Dataproc mediante una acción de inicialización

Puedes configurar DNS de forma local en los nodos principales de Dataproc para permitir la conectividad privada a dataproc.cloud.google.com. Este procedimiento está diseñado para la realización de pruebas y desarrollo a corto plazo. No se recomienda su uso en cargas de trabajo de producción.

  1. Almacena la acción de inicialización en Cloud Storage en etapa intermedia.

    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
    
    gsutil cp component-gateway-vpc-sc-dns-init-action.sh gs://BUCKET/
    
    • BUCKET es un depósito de Cloud Storage al que se puede acceder desde el clúster de Dataproc.
  2. Crea un clúster de Dataproc con la acción de inicialización almacenada en etapa intermedia y con la puerta de enlace de componentes habilitada.

    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 es el depósito de Cloud Storage que se usó en el paso 1 anteriormente.

De manera programática, usa API de HTTP mediante la puerta de enlace de componentes

Component Gateway es un proxy que incorpora Apache Knox. Los extremos expuestos por Apache Knox están disponibles a través de https://component-gateway-base-url/component-path.

Para autenticar de manera programática con Puerta de enlace de componentes, pasa el encabezado Proxy-Authorization con un token del portador de OAuth 2.0.

$ 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,
...

La puerta de enlace de componentes quita el encabezado Proxy-Authorization antes de reenviar las solicitudes a Apache Knox.

Para encontrar la URL base de la puerta de enlace de componentes, ejecuta el siguiente comando: gcloud dataproc clusters describe:

$ gcloud dataproc clusters describe
...
  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/

...

La URL base son las partes del esquema y la autoridad de las URL en httpPorts. En este ejemplo, es https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/.

Qué sigue