Dataproc 향상된 유연성 모드

Dataproc 노드가 삭제되면 Dataproc 향상된 유연성 모드(EFM)가 HDFS에서 맵리듀스 셔플 데이터와 같은 스테이트풀(Stateful) 노드 데이터를 보존합니다.

HDFS는 기본 작업자에서만 실행되므로 이 기능은 특히 선점형 VM을 사용하거나 선점형 작업자 그룹을 자동 확장하는 클러스터에 적합합니다.

제한사항:

  • 향상된 유연성 모드는 현재 1.4 이미지 클러스터에서만 지원됩니다.
  • AppMaster 재배치를 지원하지 않는 Apache Hadoop YARN 작업은 향상된 유연성 모드에서 더 자주 실패할 수 있습니다(AppMaster가 종료될 때까지 기다리는 시간 참조).
  • 향상된 유연성 모드는 다음과 같은 경우에 권장되지 않습니다
    • 클러스터는 기본 작업자만 있는 경우
    • EFM이 다른 클러스터의 HDFS를 가리키도록 구성되지 않는 한 기본 작업자 자동 확장이 사용 설정됨
      참고: 작업이 HDFS에 크게 의존하는 경우 HDFS의 자동 확장은 권장되지 않습니다.

향상된 유연성 모드 사용

향상된 유연성 모드를 사용 설정한 클러스터를 만듭니다.

gcloud dataproc clusters create cluster-name \
    --region=region \
    --properties=dataproc:efm.spark.shuffle=hcfs \
    --properties=dataproc:efm.mapreduce.shuffle=hcfs \
    --image-version=1.4

Apache Hadoop MapReduce 예시

  1. 향상된 유연성 모드 클러스터의 맵리듀스 예시에서 작은 타기 작업을 실행하여 나중에 테라 정렬 작업을 위해 Cloud Storage에서 입력 데이터를 생성합니다.
    gcloud dataproc jobs submit hadoop \
        --cluster=cluster-name \
        --region=region \
        --jar=file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \
        -- teragen 1000 Cloud Storage output URI (for example, gs://terasort/input)
    
  2. 데이터에서 테라 정렬 작업을 실행합니다.
    gcloud dataproc jobs submit hadoop \
        --cluster=cluster-name \
        --region=region \
        --jar=file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \
        -- terasort gs://terasort/input gs://terasort/output
    

Apache Spark 예시

  1. 향상된 유연성 모드 클러스터에서 Spark examples jar를 사용하여 공개 셰익스피어 텍스트에서 WordCount 작업을 실행합니다.
    gcloud dataproc jobs submit spark \
        --cluster=cluster-name \
        --region=region \
        --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \
        --class=org.apache.spark.examples.JavaWordCount \
        -- gs://apache-beam-samples/shakespeare/macbeth.txt
    

향상된 유연성 모드 클러스터에서 YARN 단계적 해제

YARN 단계적 해제를 사용하면 실행중인 애플리케이션에 미치는 영향을 최소화하면서 노드를 빠르게 삭제할 수 있습니다. 자동 확장 클러스터의 경우 향상된 유연성 모드 클러스터에 연결된 AutoscalingPolicy에서 단계적 해제 제한 시간을 설정할 수 있습니다.

향상된 유연성 모드가 단계적으로 해제됨

  1. 중간 데이터는 분산 파일 시스템에 저장되므로 해당 노드에서 실행되는 모든 컨테이너가 완료되는 즉시 노드가 향상된 유연성 모드 클러스터에서 제거될 수 있습니다. 그에 비해 애플리케이션이 완료될 때까지 표준 Dataproc 클러스터에서 노드가 삭제되지 않습니다.

  2. 노드 삭제는 노드에서 실행 중인 앱 마스터가 완료될 때까지 기다리지 않습니다. 앱 마스터 컨테이너가 종료되면 해제되지 않는 다른 노드에서 다시 예약됩니다. 작업 진행률은 손실되지 않습니다. 새 앱 마스터는 작업 내역을 읽어서 이전 앱 마스터의 상태를 빠르게 복구합니다.

향상된 유연성 모드 클러스터에서 단계적 해제 사용

예:

  1. 동일한 수의 기본 및 보조 작업자로 향상된 유연성 모드 클러스터를 만듭니다.
    gcloud dataproc clusters create cluster-name \
        --properties=dataproc:efm.spark.shuffle=hcfs \
        --properties=dataproc:efm.mapreduce.shuffle=hcfs \
        --image-version=1.4 \
        --region=region \
        --num-workers=5 \
        --num-secondary-workers=5
    
  2. 클러스터의 맵리듀스 예시 jar에서 pi 값을 계산하는 맵리듀스 작업을 실행합니다.
    gcloud dataproc jobs submit hadoop \
        --cluster=cluster-name \
        --region=region \
        --jar=file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \
        -- pi 1000 10000000
    
  3. 작업이 실행되는 동안 단계적 해제를 사용하여 클러스터를 축소합니다.
    gcloud dataproc clusters update cluster-name \
        --region=region \
        --num-secondary-workers=0 \
        --graceful-decommission-timeout=1h
    

작업이 완료되기 전에 클러스터에서 노드가 신속하게 삭제되고 작업 진행 손실이 최소화됩니다. 다음과 같은 이유로 작업 진행률이 일시적으로 감소할 수 있습니다.

  • 앱 마스터 장애 조치. 작업 진행률이 0%로 감소한 후 감소 이전의 값으로 즉시 증가하는 경우는 앱 마스터가 종료되고 새 앱 마스터가 상태를 복구했기 때문일 수 있습니다. 이는 장애 조치가 빠르게 발생하므로 작업 진행률에 크게 영향을 주지 않습니다.
  • VM 선점. HDFS는 부분적이 아닌 완전한 맵 작업 출력만을 보존하므로, 맵 작업을 수행하는 동안 VM이 선점되면 작업 진행률이 일시적으로 감소할 수 있습니다.

고급 구성

HDFS 구성

대규모 셔플의 성능을 개선하려면 클러스터를 만들 때 dfs.namenode.handler.countdfs.datanode.handler.count의 값을 늘리면서 이름 노드 및 데이터 노드의 게재 스레드 수를 늘릴 수 있습니다 기본적으로 이름 노드와 데이터 노드에는 각각 10개의 게재 스레드가 있습니다. 이름 노드 성능을 더 개선하려면 --num-master-local-ssds 플래그를 clusters create 명령어에 전달하여 마스터 노드에 로컬 SSD를 연결합니다. 또한 --num-worker-local-ssds 플래그를 사용하여 로컬 SSD를 데이터 노드에 연결하여 HDFS 성능을 개선할 수 있습니다.

파티션 나누기 및 동시 로드

맵리듀스 또는 Spark 작업을 제출할 때는 적합한 수준의 파티션 나누기를 구성하는 것이 중요합니다. 해당 셔플 스테이지의 입력 및 출력 파티션 수는 서로 다른 성능 특성을 보완합니다. 작업 형태에 맞는 값으로 실험하는 것이 가장 좋습니다.

맵리듀스 작업의 경우 출력 파티션 수는 mapreduce.job.reduces로 제어됩니다. Spark SQL의 경우 출력 파티션 수는 spark.sql.shuffle.partitions로 제어됩니다. RDD API를 사용하는 Spark 작업의 경우 파티션 수를 지정할 수 있습니다. 맵리듀스 및 Spark 입력 파티션 나누기는 입력 데이터 세트에 의해 암시적으로 설정됩니다.

재시도 상향 조정

앱 마스터, 작업 및 스테이지에 허용되는 최대 시도 수는 다음 속성을 설정하여 구성할 수 있습니다.

yarn:yarn.resourcemanager.am.max-attempts
mapred:mapreduce.map.maxattempts
mapred:mapreduce.reduce.maxattempts
spark:spark.task.maxFailures
spark:spark.stage.maxConsecutiveAttempts

앱 마스터 및 작업은 단계적 해제 없이 많은 선점형 VM 또는 자동 확장을 사용하는 클러스터에서 더 자주 종료되므로 권장되는 방법은 해당 클러스터에서 위의 값을 늘리는 것입니다.

선점형 작업자 비율

선점형 작업자는 셔플 데이터를 HDFS에 작성하므로 클러스터에 작업의 셔플 데이터를 수용하기에 충분한 기본 작업자가 포함되어 있어야 합니다. 자동 확장 클러스터의 경우 AutoscalingPolicyworkerConfigsecondaryWorkerConfig에 가중치를 할당하여 클러스터에서 선점형 작업자의 타겟 비율을 제어할 수 있습니다.

기타 Hadoop 호환 파일 시스템

기본적으로 셔플 데이터는 HDFS에 기록되지만 Hadoop 호환 파일 시스템(HCFS)을 사용할 수 있습니다. 예를 들어 Cloud Storage 또는 다른 클러스터의 HDFS에 셔플을 쓰기로 결정할 수 있습니다. 파일 시스템을 지정하려면 클러스터에 작업을 제출할 때 fs.defaultFS가 대상 파일 시스템을 가리키도록 할 수 있습니다.