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
에 바이너리 경로가 포함되어 있는지 확인합니다.
- 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 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 디렉터리에서 다음 명령어를 실행합니다.
- 이미지(예:
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}"