GKE 기반 Dataproc 커스텀 컨테이너 이미지

GKE 기반 Dataproc에서 사용할 커스텀 컨테이너 이미지를 지정할 수 있습니다. 커스텀 컨테이너 이미지가 GKE 기반 Dataproc 기본 Spark 이미지 중 하나를 사용해야 합니다.

커스텀 컨테이너 이미지 사용

GKE 기반 Dataproc 커스텀 컨테이너 이미지를 사용하려면 GKE 기반 Dataproc 가상 클러스터를 만들거나 클러스터에 Spark 작업을 제출할 때 spark.kubernetes.container.image property를 설정합니다.

  • gcloud CLI 클러스터 만들기 예시:
    gcloud dataproc clusters gke create "${DP_CLUSTER}" \
        --properties=spark:spark.kubernetes.container.image=custom-image \
        ... other args ...
    
  • gcloud CLI 작업 제출 예시:
    gcloud dataproc jobs submit spark \
        --properties=spark.kubernetes.container.image=custom-image \
        ... other args ...
    

커스텀 컨테이너 이미지 요구사항 및 설정

기본 이미지

docker 도구를 사용하여 게시된 GKE 기반 Dataproc 기본 Spark 이미지 중 하나를 기반으로 맞춤설정된 Docker를 빌드할 수 있습니다.

컨테이너 사용자

GKE 기반 Dataproc은 1099 UID 및 1099 GID를 사용하여 Spark 컨테이너를 Linux spark 사용자로 실행합니다. 파일 시스템 권한에 UID 및 GID를 사용합니다. 예를 들어 /opt/spark/jars/my-lib.jar의 jar 파일을 워크로드 종속 항목으로 이미지에 추가하면 spark 사용자에게 파일에 대한 읽기 권한을 부여해야 합니다.

구성요소

  • 자바: JAVA_HOME 환경 변수는 자바 설치 위치를 가리킵니다. 현재 기본값은 /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64이며 변경될 수 있습니다(업데이트된 정보는 Dataproc 출시 노트 참조).

    • Java 환경을 맞춤설정하는 경우 JAVA_HOME이 올바른 위치로 설정되어 있고 PATH에 바이너리 경로가 포함되어 있는지 확인합니다.
  • Python: GKE 기반 Dataproc 기본 Spark 이미지는 Miniconda3가 /opt/conda에 설치되어 있습니다. CONDA_HOME이 해당 위치를 가리키고 ${CONDA_HOME}/binPATH에 포함되어 있으며 PYSPARK_PYTHON${CONDA_HOME}/python으로 설정됩니다.

    • Conda를 맞춤설정하는 경우 CONDA_HOME이 Conda 홈 디렉터리를 가리키고 ${CONDA_HOME}/binPATH에 포함되어 있으며 PYSPARK_PYTHON${CONDA_HOME}/python.으로 설정되어 있는지 확인합니다.

    • 기본값인 기본 환경에서 패키지를 설치, 삭제, 업데이트할 수 있지만 환경에 기본 컨테이너 이미지의 기본 환경에 설치된 모든 패키지를 포함하는 것이 좋습니다.

    • 유틸리티 함수가 포함된 Python 스크립트와 같은 Python 모듈을 컨테이너 이미지에 추가하는 경우 PYTHONPATH에 모듈 디렉터리를 포함합니다.

  • Spark: Spark는 /usr/lib/spark에 설치되며 SPARK_HOME이 해당 위치를 가리킵니다. Spark는 맞춤설정할 수 없습니다. 변경될 경우 컨테이너 이미지가 거부되거나 올바르게 작동하지 않습니다.

    • 작업: Spark 작업 종속 항목을 맞춤설정할 수 있습니다. SPARK_EXTRA_CLASSPATH는 Spark JVM 프로세스의 추가 클래스 경로를 정의합니다. 권장사항: jar을 /opt/spark/jars에 배치하고 SPARK_EXTRA_CLASSPATH/opt/spark/jars/*로 설정합니다.

      이미지에 작업 jar을 삽입하는 경우 권장 디렉터리는 /opt/spark/job입니다. 작업을 제출할 때 로컬 경로(예: file:///opt/spark/job/my-spark-job.jar)를 사용하여 작업을 참조할 수 있습니다.

    • Cloud Storage 커넥터: Cloud Storage 커넥터는 /usr/lib/spark/jars에 설치됩니다.

    • 유틸리티: Spark를 실행하려면 procpstini 유틸리티 패키지가 필요합니다. 이러한 유틸리티는 기본 Spark 이미지에 포함되어 있으므로 커스텀 이미지를 다시 설치할 필요가 없습니다.

    • 진입점: GKE 기반 Dataproc은 컨테이너 이미지의 ENTRYPOINTCMD 기본 요소에 대한 모든 변경사항을 무시합니다.

    • 초기화 스크립트: /opt/init-script.sh에 선택적 초기화 스크립트를 추가할 수 있습니다. 초기화 스크립트는 Cloud Storage에서 파일을 다운로드하고, 컨테이너 내에서 프록시를 시작하고, 다른 스크립트를 호출하고, 다른 시작 태스크를 수행할 수 있습니다.

      진입점 스크립트는 Spark 드라이버, Spark 실행자, 기타 프로세스를 시작하기 전에 모든 명령줄 인수($@)로 초기화 스크립트를 호출합니다. 초기화 스크립트에서 첫 번째 인수($1)를 기반으로 Spark 프로세스 유형을 선택할 수 있습니다. 가능한 값으로는 드라이버 컨테이너의 경우 spark-submit, 실행자의 경우 executor가 포함됩니다.

  • 구성: Spark 구성은 /etc/spark/conf에 있습니다. SPARK_CONF_DIR 환경 변수가 이 위치를 가리킵니다.

    컨테이너 이미지에서 Spark 구성을 맞춤설정하지 마세요. 대신 다음과 같은 이유로 GKE API 기반 Dataproc을 통해 속성을 제출하세요.

    • 실행자 메모리 크기 등의 일부 속성은 컨테이너 이미지 빌드 시간이 아닌 런타임에 결정됩니다. GKE 기반 Dataproc에서 삽입해야 합니다.
    • GKE 기반 Dataproc은 사용자가 제공한 속성에 제한사항을 적용합니다. GKE 기반 Dataproc은 configMap의 구성을 컨테이너의 /etc/spark/conf에 마운트하여 이미지에 삽입된 설정을 재정의합니다.

기본 Spark 이미지

Dataproc은 다음과 같은 기본 Spark 컨테이너 이미지를 지원합니다.

  • Spark 2.4: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_1.5
  • Spark 3.1: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0

샘플 커스텀 컨테이너 이미지 빌드

샘플 Dockerfile

FROM us-central1-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0:latest

# Change to root temporarily so that it has permissions to create dirs and copy
# files.
USER root

# Add a BigQuery connector jar.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}" \
    && chown spark:spark "${SPARK_EXTRA_JARS_DIR}"
COPY --chown=spark:spark \
    spark-bigquery-with-dependencies_2.12-0.22.2.jar "${SPARK_EXTRA_JARS_DIR}"

# Install Cloud Storage client Conda package.
RUN "${CONDA_HOME}/bin/conda" install google-cloud-storage

# Add a custom Python file.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"

# Add an init script.
COPY --chown=spark:spark init-script.sh /opt/init-script.sh

# (Optional) Set user back to `spark`.
USER spark

컨테이너 이미지 빌드

Dockerfile 디렉터리에서 다음 명령어를 실행합니다.

  1. 이미지(예: us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest)를 설정하고 빌드 디렉터리로 변경합니다.
    IMAGE=custom container image \
        BUILD_DIR=$(mktemp -d) \
        cd "${BUILD_DIR}"
    
  2. BigQuery 커넥터를 다운로드합니다.

    gcloud storage cp \
        gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
    

  3. Python 예시 파일을 만듭니다.

    cat >test_util.py <<'EOF'
    def hello(name):
      print("hello {}".format(name))
    def read_lines(path):   with open(path) as f:     return f.readlines() EOF

  4. init 스크립트 예시를 만듭니다.

    cat >init-script.sh <<EOF
    echo "hello world" >/tmp/init-script.out
    EOF
    

  5. 이미지를 빌드하고 푸시합니다.

    docker build -t "${IMAGE}" . && docker push "${IMAGE}"