A funcionalidade Docker on YARN do Dataproc permite-lhe criar e usar uma imagem do Docker para personalizar o ambiente de tempo de execução da tarefa do Spark. A imagem pode incluir personalizações às dependências de Java, Python e R, bem como ao seu JAR de tarefas.
Limitações
A disponibilidade ou o apoio técnico de funcionalidades não estão disponíveis com:
- Versões de imagens do Dataproc anteriores à 2.0.49 (não disponíveis em imagens 1.5)
- Tarefas MapReduce (apenas suportadas para tarefas Spark)
- Modo de cliente do Spark (apenas suportado com o modo de cluster do Spark)
- Clusters Kerberos: a criação de clusters falha se criar um cluster com o Docker no YARN e o Kerberos ativado.
- Personalizações do JDK, Hadoop e Spark: são usados o JDK, o Hadoop e o Spark do anfitrião, e não as suas personalizações.
Crie uma imagem de Docker
O primeiro passo para personalizar o seu ambiente Spark é criar uma imagem do Docker.
Ficheiro Docker
Pode usar o Dockerfile seguinte como exemplo, fazendo alterações e adições para satisfazer as suas necessidades.
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
Crie e envie a imagem
Seguem-se os comandos para criar e enviar a imagem Docker de exemplo. Pode fazer alterações de acordo com as suas personalizações.
# 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}"
Crie um cluster do Dataproc
Depois de criar uma imagem do Docker que personalize o seu ambiente do Spark, crie um cluster do Dataproc que vai usar a sua imagem do Docker quando executar tarefas do 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
Substitua o seguinte:
- CLUSTER_NAME: o nome do cluster.
- REGION: a região do cluster.
- DP_IMAGE: a versão da imagem do Dataproc tem de ser
2.0.49
ou posterior (--image-version=2.0
vai usar uma versão secundária qualificada posterior a2.0.49
). --optional-components=DOCKER
: ativa o componente Docker no cluster.--properties
flag:dataproc:yarn.docker.enable=true
: propriedade obrigatória para ativar a funcionalidade Dataproc Docker on YARN.dataproc:yarn.docker.image
: propriedade opcional que pode adicionar para especificar o seu DOCKER_IMAGE através do seguinte formato de nomenclatura de imagens do Container Registry:{hostname}/{project-id}/{image}:{tag}
.Exemplo:
dataproc:yarn.docker.image=gcr.io/project-id/image:1.0.1
Requisito: tem de alojar a sua imagem de Docker no Container Registry ou no Artifact Registry. (O Dataproc não consegue obter contentores de outros registos).
Recomendação: adicione esta propriedade quando criar o cluster para colocar em cache a imagem do Docker e evitar tempos limite do YARN mais tarde quando enviar uma tarefa que use a imagem.
Quando dataproc:yarn.docker.enable
está definido como true
, o Dataproc atualiza as configurações do Hadoop e do Spark para ativar a funcionalidade Docker on YARN no cluster. Por exemplo, spark.submit.deployMode
está definido como cluster
e
spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS
e
spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS
estão definidos para montar
diretórios do anfitrião no contentor.
Envie uma tarefa do Spark para o cluster
Depois de criar um cluster do Dataproc, envie um trabalho do Spark para o cluster que usa a sua imagem do Docker. O exemplo nesta secção envia uma tarefa do PySpark para o cluster.
Defina as propriedades do trabalho:
# 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"
Notas:
- Consulte as informações sobre o lançamento de aplicações através de contentores Docker em propriedades relacionadas.
gcloud
Envie a tarefa para o cluster.
gcloud dataproc jobs submit pyspark PYFILE \ --cluster=CLUSTER_NAME \ --region=REGION \ --properties=${JOB_PROPERTIES}
Substitua o seguinte:
- PYFILE: o caminho do ficheiro para o ficheiro de tarefa do PySpark. Pode ser um caminho do ficheiro local ou o URI do ficheiro no Cloud Storage (
gs://BUCKET_NAME/PySpark filename
). - CLUSTER_NAME: o nome do cluster.
- REGION: a região do cluster.