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:
JAVA_HOME환경 변수는 Java 설치 위치를 가리킵니다. 현재 기본값은/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64이며 변경될 수 있습니다(업데이트 정보는 Dataproc 출시 노트 참조).- Java 환경을 맞춤설정하는 경우
JAVA_HOME이 올바른 위치로 설정되어 있고PATH에 바이너리 경로가 포함되어 있는지 확인합니다.
- Java 환경을 맞춤설정하는 경우
Python: GKE 기반 Dataproc 기본 Spark 이미지는 Miniconda3가
/opt/conda에 설치되어 있습니다.CONDA_HOME이 해당 위치를 가리키고${CONDA_HOME}/bin은PATH에 포함되어 있으며PYSPARK_PYTHON은${CONDA_HOME}/python으로 설정됩니다.Conda를 맞춤설정하는 경우
CONDA_HOME이 Conda 홈 디렉터리를 가리키고${CONDA_HOME}/bin이PATH에 포함되어 있으며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를 실행하려면
procps및tini유틸리티 패키지가 필요합니다. 이러한 유틸리티는 기본 Spark 이미지에 포함되어 있으므로 커스텀 이미지를 다시 설치할 필요가 없습니다.진입점: GKE 기반 Dataproc은 컨테이너 이미지의
ENTRYPOINT및CMD기본 요소에 대한 모든 변경사항을 무시합니다.초기화 스크립트:
/opt/init-script.sh에 선택적 초기화 스크립트를 추가할 수 있습니다. 초기화 스크립트는 Cloud Storage에서 파일을 다운로드하고, 컨테이너 내에서 프록시를 시작하고, 다른 스크립트를 호출하고, 다른 시작 작업을 수행할 수 있습니다.진입점 스크립트는 Spark 드라이버, Spark 실행자, 기타 프로세스를 시작하기 전에 모든 명령줄 인수(
$@)로 초기화 스크립트를 호출합니다. 초기화 스크립트에서 첫 번째 인수($1)를 기반으로 Spark 프로세스 유형을 선택할 수 있습니다. 가능한 값으로는 드라이버 컨테이너의 경우spark-submit, 실행자의 경우executor가 포함됩니다.
구성: Spark 구성은
/etc/spark/conf에 있습니다.SPARK_CONF_DIR환경 변수가 이 위치를 가리킵니다.컨테이너 이미지에서 Spark 구성을 맞춤설정하지 마세요. 대신 다음과 같은 이유로 GKE 기반 Dataproc API를 통해 속성을 제출하세요.
- 실행자 메모리 크기 등의 일부 속성은 컨테이너 이미지 빌드 시간이 아닌 런타임에 결정됩니다. GKE 기반 Dataproc에서 삽입해야 합니다.
- GKE 기반 Dataproc은 사용자가 제공한 속성에 제한사항을 적용합니다.
GKE 기반 Dataproc은
configMap의 구성을 컨테이너의/etc/spark/conf에 마운트하여 이미지에 삽입된 설정을 재정의합니다.
기본 Spark 이미지
Dataproc은 다음과 같은 기본 Spark 컨테이너 이미지를 지원합니다.
- Spark 3.5: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.2
샘플 커스텀 컨테이너 이미지 빌드
샘플 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 디렉터리에서 다음 명령어를 실행합니다.
- 이미지(예:
us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest)를 설정하고 빌드 디렉터리로 변경합니다.IMAGE=custom container image \ BUILD_DIR=$(mktemp -d) \ cd "${BUILD_DIR}" BigQuery 커넥터를 다운로드합니다.
gcloud storage cp \ gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
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() EOFinit 스크립트 예시를 만듭니다.
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
이미지를 빌드하고 푸시합니다.
docker build -t "${IMAGE}" . && docker push "${IMAGE}"