초기화 작업

Dataproc 클러스터를 만들 때 Dataproc이 클러스터가 설정된 직후 Dataproc 클러스터의 모든 노드에서 실행하는 실행 파일 또는 스크립트에서 초기화 작업을 지정할 수 있습니다. 초기화 작업은 종종 Python 패키지 설치와 같은 작업 종속 항목을 설정하므로 작업이 실행될 때 종속 항목을 설치하지 않고도 작업을 클러스터에 제출할 수 있습니다.

샘플 초기화 작업 스크립트는 다음 위치에서 찾을 수 있습니다. 참고: Google에서는 이러한 샘플을 지원하지 않습니다.

중요 고려사항 및 가이드라인

  • gs://goog-dataproc-initialization-actions-REGION 공개 버킷에 있는 초기화 작업을 참조하는 프로덕션 클러스터는 만들지 마세요. 이러한 스크립트는 참조 구현으로 제공됩니다. 스크립트는 진행 중인 GitHub 저장소 변경사항과 동기화되고 이러한 스크립트에 대한 업데이트에 따라 클러스터를 만드는 동안 문제가 발생할 수 있습니다. 대신 다음 예시에 표시된 것처럼 공개 버킷에서 버전이 지정된 Cloud Storage 버킷 폴더로 초기화 작업을 복사합니다.

    REGION=COMPUTE_REGION
    gcloud storage cp gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \
        gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh
    
    그런 후 Cloud Storage에서 사본을 참조하여 클러스터를 만듭니다.
    gcloud dataproc clusters create CLUSTER_NAME \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \
        ...other flags...
    

  • 초기화 작업은 클러스터를 만드는 동안 각 노드에서 하나씩 실행됩니다. 또한 클러스터를 확장 또는 자동 확장할 때 추가된 각 노드에서도 실행됩니다.

  • 초기화 작업을 업데이트할 때(예를 들어, Cloud Storage 초기화 작업을 공개 버킷 또는 GitHub 저장소 초기화 작업의 변경 내용에 동기화할 때) 업데이트된 초기화 작업을 받기 위한 새 폴더(가급적 버전이 포함된 이름)를 만듭니다. 대신 인플레이스 초기화 작업을 적용하면 새 노드(예: 자동 확장 처리에서 추가된 노드)가 기존 노드에서 실행한 이전 버전 초기화 작업이 아닌 인플레이스 업데이트되어 초기화 작업을 실행합니다. 이러한 초기화 작업 차이로 인해 클러스터 노드가 일관되지 않거나 손상될 수 있습니다.

  • 초기화 작업은 root 사용자로 실행됩니다. sudo를 사용할 필요가 없습니다.

  • 초기화 작업에 절대 경로를 사용합니다.

  • 스크립트 해석 방법을 나타내기 위해 초기화 작업에 shebang 줄을 사용합니다(예: #!/bin/bash 또는 #!/usr/bin/python).

  • 초기화 작업이 0이 아닌 종료 코드로 종료되는 경우, 클러스터 만들기 작업이 'ERROR' 상태를 보고합니다. 초기화 작업을 디버깅하려면 SSH를 사용하여 클러스터의 VM 인스턴스에 연결한 후 로그를 검토합니다. 초기화 작업 문제를 수정하면 클러스터를 삭제한 후 다시 만들 수 있습니다.

  • 내부 IP 주소만 사용하여 Cloud Dataproc 클러스터를 만드는 경우, Cloud NAT 또는 Cloud VPN을 통해 트래픽을 보내도록 경로를 구성하지 않으면 초기화 작업에서 인터넷을 통한 github.com 액세스 시도가 실패합니다. 인터넷에 액세스하지 않고도 비공개 Google 액세스를 사용 설정하고 Cloud Storage에 작업 종속 항목을 배치할 수 있습니다. 클러스터 노드는 내부 IP를 통해 Cloud Storage에서 종속 항목을 다운로드할 수 있습니다.

  • 초기화 작업 대신 Dataproc 커스텀 이미지를 사용하여 작업 종속 항목을 설정할 수 있습니다.

  • 초기화 처리:

    • 2.0 이전 이미지 클러스터:
      • 마스터: 초기화 작업을 마스터에서 실행하여 HDFS에 파일을 쓸 수 있도록 허용하기 위해 마스터 노드 초기화 작업은 HDFS가 쓰기 가능해질 때까지(HDFS가 안전 모드를 종료하고 2개 이상의 HDFS DataNode가 조인될 때까지) 시작되지 않습니다.
      • 작업자: 사용자가 dataproc:dataproc.worker.custom.init.actions.mode 클러스터 속성RUN_BEFORE_SERVICES로 설정하면 각 작업자는 HDFS 데이터 노드와 YARN NodeManager 데몬을 시작하기 전에 초기화 작업을 실행합니다. Dataproc은 HDFS가 쓰기 가능해질 때까지(2개의 HDFS 데이터 노드 데몬이 실행되어야 함) 마스터 초기화 작업을 실행하지 않으므로 이 속성을 설정하면 클러스터 생성 시간이 늘어날 수 있습니다.
    • 2.0 이상의 이미지 클러스터:

      • 마스터: HDFS가 쓰기 가능해지기 전에 마스터 노드 초기화 작업이 실행될 수 있습니다. HDFS에서 파일을 스테이징하거나 Ranger와 같은 HDFS 종속 서비스의 가용성에 의존하는 초기화 작업을 실행하는 경우 dataproc.master.custom.init.actions.mode 클러스터 속성RUN_AFTER_SERVICES로 설정합니다. 참고: 이 속성 설정은 클러스터 생성 시간을 늘릴 수 있으므로(2.0 이전의 이미지 클러스터 작업자의 클러스터 생성 지연에 대한 설명 참조) 필요할 때만 사용하십시오(이 속성의 기본 RUN_BEFORE_SERVICES 설정을 사용하는 것이 일반적).
      • 작업자: dataproc:dataproc.worker.custom.init.actions.mode 클러스터 속성RUN_BEFORE_SERVICES로 설정되며 클러스터가 생성될 때 클러스터에 전달할 수 없습니다(속성 설정은 변경할 수 없음). 각 작업자는 HDFS 데이터 노드와 YARN NodeManager 데몬을 시작하기 전에 초기화 작업을 실행합니다. Dataproc은 마스터 초기화 작업을 실행하기 전에 HDFS가 쓰기 가능해질 때까지 기다리지 않으므로 마스터 및 작업자 초기화 작업이 동시에 실행됩니다.
    • 권장사항:

      • 메타데이터를 사용하여 노드에서 초기화 작업을 조건부로 실행하는 노드의 역할을 결정하세요(클러스터 메타데이터 사용 참조).
      • 안정성을 위해 초기화 작업 사본을 Cloud Storage 버킷에 복사세요(초기화 작업 사용 방법 참조).
      • 초기화 작업을 안정화할 수 있도록 인터넷에서 다운로드할 때 재시도를 추가하세요.

초기화 작업 사용

클러스터 초기화 작업은 클러스터를 만드는 방법에 관계없이 다음을 통해 지정할 수 있습니다.

gcloud 명령

gcloud dataproc clusters create 명령어를 사용하여 클러스터를 만드는 경우 --initialization-actions 플래그를 사용하여 초기화 실행 파일이나 스크립트의 쉼표로 구분된 Cloud Storage 위치(URI)를 하나 이상 지정합니다. 참고: 'gs://bucket/my//object//name'과 같이 Cloud Storage 위치에서 처음 'gs://' 다음에 '/'가 여러 번 연속으로 나오는 경우는 지원되지 않습니다. 명령어 정보를 보려면 gcloud dataproc clusters create --help를 실행합니다.

gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
    --initialization-action-timeout=timeout-value (default=10m) \
    ... other flags ...
참고:
  • --initialization-action-timeout 플래그를 사용하여 초기화 작업의 제한 시간을 지정합니다. 기본 제한시간은 10분입니다. 초기화 실행 파일 또는 스크립트가 제한 시간이 끝날 때까지 완료되지 않으면 Dataproc이 초기화 작업을 취소합니다.
  • dataproc:dataproc.worker.custom.init.actions.mode 클러스터 속성을 사용하여 노드 관리자 및 데이터 노드 데몬이 시작되기 전에 기본 작업자에서 초기화 작업을 실행합니다.

REST API

clusters.create API 요청의 일부로 ClusterConfig.initializationActions 배열에서 하나 이상의 스크립트 또는 실행 파일을 지정합니다.

예시

POST /v1/projects/my-project-id/regions/us-central1/clusters/
{
  "projectId": "my-project-id",
  "clusterName": "example-cluster",
  "config": {
    "configBucket": "",
    "gceClusterConfig": {
      "subnetworkUri": "default",
      "zoneUri": "us-central1-b"
    },
    "masterConfig": {
      "numInstances": 1,
      "machineTypeUri": "n1-standard-4",
      "diskConfig": {
        "bootDiskSizeGb": 500,
        "numLocalSsds": 0
      }
    },
    "workerConfig": {
      "numInstances": 2,
      "machineTypeUri": "n1-standard-4",
      "diskConfig": {
        "bootDiskSizeGb": 500,
        "numLocalSsds": 0
      }
    },
    "initializationActions": [
      {
        "executableFile": "gs://cloud-example-bucket/my-init-action.sh"
      }
    ]
  }
}

콘솔

  • Dataproc 클러스터 만들기 페이지를 연 후 클러스터 맞춤설정 패널을 선택합니다.
  • 초기화 작업 섹션에서 실행 파일 필드에 각 초기화 작업의 Cloud Storage 버킷 위치를 입력합니다. 둘러보기를 클릭하여 Google Cloud 콘솔 Cloud Storage 브라우저 페이지를 열고 스크립트나 실행 파일을 선택합니다. 초기화 작업 추가를 클릭하여 각 파일을 추가합니다.
  • 초기화 작업에 인수 전달

    Dataproc은 클러스터에서 실행되는 인스턴스의 특수 메타데이터 값을 설정합니다. 초기화 작업에 인수를 전달하기 위한 방법으로 자체적인 커스텀 메타데이터를 설정할 수 있습니다.

    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
        --metadata=name1=value1,name2=value2... \
        ... other flags ...
    

    메타데이터 값은 초기화 작업 내에서 다음과 같이 읽을 수 있습니다.

    var1=$(/usr/share/google/get_metadata_value attributes/name1)
    

    노드 선택

    초기화 작업을 마스터, 드라이버, 또는 작업자 노드로 제한하려는 경우 간단한 노드-선택 로직을 실행 파일 또는 스크립트에 추가할 수 있습니다.

    ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
    if [[ "${ROLE}" == 'Master' ]]; then
      ... master specific actions ...
    else if [[ "${ROLE}" == 'Driver' ]]; then
      ... driver specific actions ...
    else
      ... worker specific actions ...
    fi
    

    바이너리 준비

    일반적인 클러스터 초기화 시나리오는 작업이 제출될 때마다 바이너리를 준비할 필요가 없도록 클러스터에 작업 바이너리를 준비하는 것입니다. 예를 들어 다음 초기화 스크립트가 Cloud Storage 버킷 위치인 gs://my-bucket/download-job-jar.sh에 저장된다고 가정해 보겠습니다.

    #!/bin/bash
    ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
    if [[ "${ROLE}" == 'Master' ]]; then
      gcloud storage cp gs://my-bucket/jobs/sessionalize-logs-1.0.jar home/username
    fi
    

    이 스크립트의 위치는 gcloud dataproc clusters create 명령어에 전달할 수 있습니다.

    gcloud dataproc clusters create my-dataproc-cluster \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/download-job-jar.sh
    

    Dataproc은 모든 노드에서 이 스크립트를 실행하고 스크립트의 노드-선택 논리의 결과로 jar을 마스터 노드에 다운로드합니다. 그러면 제출된 작업에서 다음과 같이 사전 준비된 jar을 사용할 수 있습니다.

    gcloud dataproc jobs submit hadoop \
        --cluster=my-dataproc-cluster \
        --region=${REGION} \
        --jar=file:///home/username/sessionalize-logs-1.0.jar
    

    자주 사용되는 다른 샘플 초기화 작업 스크립트는 gs://goog-dataproc-initialization-actions-<REGION>, 리전별 공개 Cloud Storage 버킷, GitHub 저장소에 위치합니다. 스크립트를 제공하려면 CONTRIBUTING.md 문서를 검토한 후 pull 요청을 제출합니다.

    로깅

    각 초기화 작업의 실행 출력은 /var/log/dataproc-initialization-script-X.log에 인스턴스별로 로깅됩니다. 여기서 X는 각 연속 초기화 작업 스크립트의 0부터 시작하는 색인입니다. 예를 들어 클러스터에 2개의 초기화 작업이 있는 경우 출력은 /var/log/dataproc-initialization-script-0.log/var/log/dataproc-initialization-script-1.log에 로깅됩니다.

    다음 단계

    GitHub 초기화 작업 살펴보기