Dataproc YARN의 Docker 기능을 사용하면 Docker 이미지를 만들고 사용하여 Spark 작업 런타임 환경을 맞춤설정할 수 있습니다. 이 이미지는 자바, Python, R 종속 항목 및 작업 jar에 대한 맞춤설정을 포함할 수 있습니다.
제한사항
다음의 경우 기능 가용성 또는 지원이 제공되지 않습니다.
- 2.0.49 이전의 Dataproc 이미지 버전(1.5 이미지에서 제공되지 않음)
- 맵리듀스 작업(Spark 작업에만 지원됨)
- Spark 클라이언트 모드(Spark 클러스터 모드에서만 지원됨)
- Kerberos 클러스터: YARN에서 Docker를 사용하여 클러스터를 만들고 Kerberos가 사용 설정되면 클러스터 생성이 실패합니다.
- JDK, Hadoop, Spark 맞춤설정: 호스트 JDK, Hadoop, Spark가 사용됩니다(사용자 맞춤설정 아님).
Docker 이미지 만들기
Spark 환경을 맞춤설정하는 첫 번째 단계는 Docker 이미지를 빌드하는 것입니다.
Dockerfile
다음 Dockerfile을 예시로 사용하여 필요에 맞게 변경하고 항목을 추가할 수 있습니다.
FROM debian:10-slim
# Suppress interactive prompts.
ENV DEBIAN_FRONTEND=noninteractive
# Required: Install utilities required by Spark scripts.
RUN apt update && apt install -y procps tini
# Optional: Add extra jars.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}"
COPY *.jar "${SPARK_EXTRA_JARS_DIR}"
# Optional: Install and configure Miniconda3.
ENV CONDA_HOME=/opt/miniconda3
ENV PYSPARK_PYTHON=${CONDA_HOME}/bin/python
ENV PYSPARK_DRIVER_PYTHON=${CONDA_HOME}/bin/python
ENV PATH=${CONDA_HOME}/bin:${PATH}
COPY Miniconda3-py39_4.10.3-Linux-x86_64.sh .
RUN bash Miniconda3-py39_4.10.3-Linux-x86_64.sh -b -p /opt/miniconda3 \
&& ${CONDA_HOME}/bin/conda config --system --set always_yes True \
&& ${CONDA_HOME}/bin/conda config --system --set auto_update_conda False \
&& ${CONDA_HOME}/bin/conda config --system --prepend channels conda-forge \
&& ${CONDA_HOME}/bin/conda config --system --set channel_priority strict
# Optional: Install Conda packages.
#
# The following packages are installed in the default image. It is strongly
# recommended to include all of them.
#
# Use mamba to install packages quickly.
RUN ${CONDA_HOME}/bin/conda install mamba -n base -c conda-forge \
&& ${CONDA_HOME}/bin/mamba install \
conda \
cython \
fastavro \
fastparquet \
gcsfs \
google-cloud-bigquery-storage \
google-cloud-bigquery[pandas] \
google-cloud-bigtable \
google-cloud-container \
google-cloud-datacatalog \
google-cloud-dataproc \
google-cloud-datastore \
google-cloud-language \
google-cloud-logging \
google-cloud-monitoring \
google-cloud-pubsub \
google-cloud-redis \
google-cloud-spanner \
google-cloud-speech \
google-cloud-storage \
google-cloud-texttospeech \
google-cloud-translate \
google-cloud-vision \
koalas \
matplotlib \
nltk \
numba \
numpy \
openblas \
orc \
pandas \
pyarrow \
pysal \
pytables \
python \
regex \
requests \
rtree \
scikit-image \
scikit-learn \
scipy \
seaborn \
sqlalchemy \
sympy \
virtualenv
# Optional: Add extra Python modules.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"
# Required: Create the 'yarn_docker_user' group/user.
# The GID and UID must be 1099. Home directory is required.
RUN groupadd -g 1099 yarn_docker_user
RUN useradd -u 1099 -g 1099 -d /home/yarn_docker_user -m yarn_docker_user
USER yarn_docker_user
이미지 빌드 및 푸시
다음은 예시 Docker 이미지를 빌드하고 푸시하기 위한 명령어입니다. 맞춤설정에 따라 항목을 변경할 수 있습니다.
# Increase the version number when there is a change to avoid referencing
# a cached older image. Avoid reusing the version number, including the default
# `latest` version.
IMAGE=gcr.io/my-project/my-image:1.0.1
# Download the BigQuery connector.
gcloud storage cp \
gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
# Download the Miniconda3 installer.
wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-x86_64.sh
# Python module example:
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
# Build and push the image.
docker build -t "${IMAGE}" .
docker push "${IMAGE}"
Dataproc 클러스터 만들기
Spark 환경을 맞춤설정하는 Docker 이미지를 만든 후 Spark 작업을 실행할 때 Docker 이미지를 사용하는 Dataproc 클러스터를 만듭니다.
gcloud
gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --image-version=DP_IMAGE \ --optional-components=DOCKER \ --properties=dataproc:yarn.docker.enable=true,dataproc:yarn.docker.image=DOCKER_IMAGE \ other flags
다음을 바꿉니다.
- CLUSTER_NAME: 클러스터 이름입니다.
- REGION: 클러스터 리전입니다.
- DP_IMAGE: Dataproc 이미지 버전은
2.0.49
이상이어야 합니다.--image-version=2.0
에2.0.49
이후의 적격한 부 버전이 사용됩니다. --optional-components=DOCKER
: 클러스터에서 Docker 구성요소를 사용 설정합니다.--properties
플래그:dataproc:yarn.docker.enable=true
: YARN 기능으로 Dataproc Docker를 사용 설정하는 데 필요한 속성입니다.dataproc:yarn.docker.image
:{hostname}/{project-id}/{image}:{tag}
Container Registry 이미지 이름 지정 형식을 사용하여 DOCKER_IMAGE를 지정하기 위해 추가할 수 있는 선택적인 속성입니다.예:
dataproc:yarn.docker.image=gcr.io/project-id/image:1.0.1
요구사항: Container Registry 또는 Artifact Registry에 Docker 이미지를 호스팅해야 합니다. Dataproc는 다른 레지스트리에서 컨테이너를 가져올 수 없습니다.
권장사항: Docker 이미지를 캐시하도록 클러스터를 만들 때 이 속성을 추가하고, 나중에 이 이미지를 사용하는 작업을 제출할 때 YARN 시간 초과가 발생하지 않도록 방지합니다.
dataproc:yarn.docker.enable
이 true
로 설정되면 Dataproc은 클러스터에서 YARN 기능에 Docker를 사용 설정하도록 Hadoop 및 Spark 구성을 업데이트합니다. 예를 들어 spark.submit.deployMode
는 cluster
로 설정되고 spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS
및 spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS
는 호스트의 디렉터리를 컨테이너에 마운트하도록 설정됩니다.
클러스터에 Spark 작업 제출
Dataproc 클러스터 만들기 이후 Docker 이미지를 사용하는 클러스터에 Spark 작업을 제출합니다. 이 섹션의 예시에서는 클러스터에 PySpark 작업을 제출합니다.
작업 속성을 설정합니다.
# Set the Docker image URI.
IMAGE=(e.g., gcr.io/my-project/my-image:1.0.1)
# Required: Use `#` as the delimiter for properties to avoid conflicts.
JOB_PROPERTIES='^#^'
# Required: Set Spark properties with the Docker image.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=${IMAGE}"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=${IMAGE}"
# Optional: Add custom jars to Spark classpath. Don't set these properties if
# there are no customizations.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.driver.extraClassPath=/opt/spark/jars/*"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executor.extraClassPath=/opt/spark/jars/*"
# Optional: Set custom PySpark Python path only if there are customizations.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.pyspark.python=/opt/miniconda3/bin/python"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.pyspark.driver.python=/opt/miniconda3/bin/python"
# Optional: Set custom Python module path only if there are customizations.
# Since the `PYTHONPATH` environment variable defined in the Dockerfile is
# overridden by Spark, it must be set as a job property.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.yarn.appMasterEnv.PYTHONPATH=/opt/python/packages"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executorEnv.PYTHONPATH=/opt/python/packages"
참고:
- 관련 속성에 대한 Docker 컨테이너를 사용하여 애플리케이션 출시 정보를 참조하세요.
gcloud
클러스터에 작업을 제출합니다.
gcloud dataproc jobs submit pyspark PYFILE \ --cluster=CLUSTER_NAME \ --region=REGION \ --properties=${JOB_PROPERTIES}
다음을 바꿉니다.
- PYFILE: PySpark 작업 파일의 경로입니다. Cloud Storage에 있는 파일의 URI 또는 로컬 파일 경로일 수 있습니다(
gs://BUCKET_NAME/PySpark filename
). - CLUSTER_NAME: 클러스터 이름입니다.
- REGION: 클러스터 리전입니다.