Dataproc 구성요소 게이트웨이

Apache HadoopApache Spark와 같이 Google Dataproc 클러스터에 포함된 일부 기본 오픈소스 구성요소는 웹 인터페이스를 제공합니다. 이러한 인터페이스를 사용하여 YARN 리소스 관리자, Hadoop 분산 파일 시스템(HDFS), 맵리듀스, Spark와 같은 클러스터 리소스 및 기능을 관리하고 모니터링할 수 있습니다. 구성요소 게이트웨이는 Dataproc 기본 구성요소와 선택적 구성요소의 웹 엔드포인트에 보안 액세스를 제공합니다.

Dataproc 이미지 버전 1.3.29 이상으로 생성된 클러스터를 사용하면 SSH 터널을 사용하거나 인바운드 트래픽을 허용하도록 방화벽 규칙을 수정할 필요 없이 구성요소 웹 인터페이스에 액세스할 수 있습니다.

고려사항

  • 구성요소 웹 인터페이스는 dataproc.clusters.use IAM 권한이 있는 사용자가 액세스할 수 있습니다. 기본적으로 프로젝트 구성원에게만 이 권한이 있습니다(Dataproc 역할 참조).
  • Apache Hadoop YARNApache Livy와 같은 REST API와 기록 서버에 액세스하는 데 Component Gateway를 사용할 수 있습니다.
  • 구성요소 게이트웨이가 사용 설정되면 클러스터의 첫 번째 마스터 노드에 다음과 같은 추가 서비스가 포함됩니다.
  • 구성요소 게이트웨이는 node:port 인터페이스에 대한 직접 액세스를 사용 설정하지 않고 서비스의 특정 하위 집합을 자동으로 프록싱합니다. 노드(node:port)의 서비스에 액세스하려면 SSH SOCKS 프록시를 사용하세요.

구성요소 게이트웨이로 클러스터 만들기

Console

Cloud Console에서 구성요소 게이트웨이를 사용 설정하려면 Dataproc 클러스터 만들기 페이지에서 클러스터 설정 패널의 구성요소 섹션에서 구성요소 게이트웨이 체크박스를 선택하세요.

gcloud 명령어

Cloud Shell 또는 터미널 창에서 로컬로 Cloud SDK gcloud dataproc clusters create 명령어를 실행합니다.

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

REST API

clusters.create 요청의 일부로 EndpointConfig.enableHttpPortAccess 속성을 true로 설정합니다.

구성요소 게이트웨이 URL 보기 및 액세스

클러스터에서 구성요소 게이트웨이가 사용 설정되면 Cloud Console에 제공되는 링크를 클릭하여 클러스터의 첫 번째 마스터 노드에서 실행 중인 구성요소 웹 인터페이스에 연결할 수 있습니다. 구성요소 게이트웨이는 포트 이름과 URL 매핑을 사용하여 endpointConfig.httpPorts도 설정합니다. Console을 사용하는 대신 gcloud 명령줄 도구 또는 Dataproc REST API를 사용하여 이 매핑 정보를 확인한 다음 URL을 복사하고 브라우저에 붙여넣어 구성요소 UI와 연결할 수 있습니다.

Console

Google Cloud Console에서 Dataproc 클러스터 양식으로 이동한 다음 클러스터를 선택하여 클러스터 세부정보 양식을 엽니다. 웹 인터페이스 탭을 클릭하여 클러스터에 설치된 기본 및 선택사항 구성요소의 웹 인터페이스에 구성요소 게이트웨이 링크 목록을 표시합니다. 링크를 클릭하여 로컬 브라우저에서 클러스터의 마스터 노드에서 실행 중인 웹 인터페이스를 엽니다.

gcloud 명령어

터미널 창 또는 Cloud Shell에서 로컬로 Cloud SDK 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을 호출하여 포트 이름과 URL에 대한 endpointConfig.httpPorts 매핑을 가져옵니다.

VPC-SC에서 구성요소 게이트웨이 사용

구성요소 게이트웨이는 VPC 서비스 제어를 지원합니다. 서비스 경계 강제 적용의 경우 구성요소 게이트웨이를 통한 인터페이스 요청은 Dataproc API 노출 영역의 일부로 처리되고 dataproc.googleapis.com에 대한 권한을 제어하는 모든 액세스 정책은 구성요소 게이트웨이 UI에 대한 액세스도 제어합니다.

구성요소 게이트웨이는 외부 IP 주소 없이 Dataproc 클러스터의 비공개 Google 연결을 사용하는 VPC-SC 구성을 지원하지만, 제한된 Google 가상 IP 범위 199.36.153.4/30을 통해 Dataproc 마스터 VM에서 *.dataproc.cloud.google.com으로 액세스할 수 있는 네트워크를 구성해야 합니다. 이를 위해 다음을 수행하세요.

  1. 안내에 따라 모든 Google API에 비공개 Google 연결을 구성합니다.
  2. Cloud DNS로 DNS를 구성하거나 Dataproc 마스터 노드에서 로컬로 DNS를 구성하여 *.dataproc.cloud.google.com에 대한 액세스를 허용합니다.

Cloud DNS로 DNS 구성하기

*.dataproc.cloud.google.com을 대상으로 하는 트래픽을 제한된 Google API 가상 IP 범위에 매핑하는 Cloud DNS 영역을 만듭니다.

  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.cloud.google.com에 대한 비공개 연결을 허용하도록 Dataproc 마스터 노드에서 DNS를 로컬로 구성할 수 있습니다. 이 절차는 단기 테스트 및 개발에 사용할 수 있습니다. 프로덕션 워크로드에는 사용하지 않는 것이 좋습니다.

  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
    
    gsutil 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가 사용되는 프록시입니다. Apache Knox에서 노출되는 엔드포인트는 https://component-gateway-base-url/component-path를 통해 제공됩니다.

구성요소 게이트웨이로 프로그래매틱 방식으로 인증하려면 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 헤더를 없앱니다.

구성요소 게이트웨이 기본 URL을 찾으려면 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/

...

기본 URL은 httpPorts 아래에 있는 URL의 스키마 및 인증 기관 부분입니다. 이 예시에서는 https://xxxxxxxxxxxxxxx-dot-us-central1.dataproc.googleusercontent.com/입니다.

다음 단계