Fitur Docker on YARN Dataproc memungkinkan Anda membuat dan menggunakan image Docker untuk menyesuaikan lingkungan runtime tugas Spark. Image dapat menyertakan penyesuaian pada dependensi Java, Python, dan R, serta pada jar tugas Anda.
Batasan
Dukungan atau ketersediaan fitur tidak tersedia dengan:
- Versi image Dataproc sebelum 2.0.49 (tidak tersedia dalam image 1.5)
- Tugas MapReduce (hanya didukung untuk tugas Spark)
- Mode klien Spark (hanya didukung dengan mode cluster Spark)
- Cluster Kerberos: pembuatan cluster gagal jika Anda membuat cluster dengan Docker di YARN dan Kerberos diaktifkan.
- Penyesuaian JDK, Hadoop, dan Spark: JDK, Hadoop, dan Spark host digunakan, bukan penyesuaian Anda.
Membuat image Docker
Langkah pertama untuk menyesuaikan lingkungan Spark adalah mem-build image Docker.
Dockerfile
Anda dapat menggunakan Dockerfile berikut sebagai contoh, dengan melakukan perubahan dan penambahan untuk memenuhi kebutuhan Anda.
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
Mem-build dan mengirim image
Berikut adalah perintah untuk mem-build dan mengirim contoh image Docker, Anda dapat melakukan perubahan sesuai dengan penyesuaian Anda.
# 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}"
Membuat cluster Dataproc
Setelah membuat image Docker yang menyesuaikan lingkungan Spark, buat cluster Dataproc yang akan menggunakan image Docker saat menjalankan tugas Spark.
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
Ganti kode berikut;
- CLUSTER_NAME: Nama cluster.
- REGION: Region cluster.
- DP_IMAGE: Versi image Dataproc harus
2.0.49
atau yang lebih baru (--image-version=2.0
akan menggunakan versi minor yang memenuhi syarat setelah2.0.49
). --optional-components=DOCKER
: Mengaktifkan komponen Docker di cluster.- Flag
--properties
:dataproc:yarn.docker.enable=true
: Properti yang diperlukan untuk mengaktifkan fitur Dataproc Docker di YARN.dataproc:yarn.docker.image
: Properti opsional yang dapat Anda tambahkan untuk menentukan DOCKER_IMAGE menggunakan format penamaan image Container Registry berikut:{hostname}/{project-id}/{image}:{tag}
.Contoh:
dataproc:yarn.docker.image=gcr.io/project-id/image:1.0.1
Persyaratan: Anda harus menghosting image Docker di Container Registry atau Artifact Registry. (Dataproc tidak dapat mengambil kontainer dari registry lain).
Rekomendasi: Tambahkan properti ini saat Anda membuat cluster untuk meng-cache image Docker dan menghindari waktu tunggu YARN nanti saat Anda mengirimkan tugas yang menggunakan image.
Jika dataproc:yarn.docker.enable
ditetapkan ke true
, Dataproc
akan memperbarui konfigurasi Hadoop dan Spark untuk mengaktifkan fitur Docker di YARN di
cluster. Misalnya, spark.submit.deployMode
ditetapkan ke cluster
, dan
spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS
serta
spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS
ditetapkan untuk memasang
direktori dari host ke dalam penampung.
Mengirimkan tugas Spark ke cluster
Setelah membuat cluster Dataproc, kirimkan tugas Spark ke cluster yang menggunakan image Docker Anda. Contoh di bagian ini mengirimkan tugas PySpark ke cluster.
Tetapkan properti tugas:
# 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"
Catatan:
- Lihat informasi Meluncurkan Aplikasi Menggunakan Container Docker tentang properti terkait.
gcloud
Kirim tugas ke cluster.
gcloud dataproc jobs submit pyspark PYFILE \ --cluster=CLUSTER_NAME \ --region=REGION \ --properties=${JOB_PROPERTIES}
Ganti kode berikut;
- PYFILE: Jalur file ke file tugas PySpark Anda. Ini dapat berupa
jalur file lokal atau URI file di Cloud Storage
(
gs://BUCKET_NAME/PySpark filename
). - CLUSTER_NAME: Nama cluster.
- REGION: Region cluster.