Imagens de contentores personalizadas do Dataproc no GKE

Pode especificar uma imagem do contentor personalizada para usar com o Dataproc no GKE . A sua imagem de contentor personalizada tem de usar uma das imagens base do Spark do Dataproc no GKE.

Use uma imagem de contentor personalizada

Para usar uma imagem de contentor personalizada do Dataproc no GKE, defina o spark.kubernetes.container.image property quando criar um cluster virtual do Dataproc no GKE ou enviar uma tarefa do Spark para o cluster.

  • Exemplo de criação de cluster da CLI gcloud:
    gcloud dataproc clusters gke create "${DP_CLUSTER}" \
        --properties=spark:spark.kubernetes.container.image=custom-image \
        ... other args ...
    
  • Exemplo de envio de tarefas da CLI gcloud:
    gcloud dataproc jobs submit spark \
        --properties=spark.kubernetes.container.image=custom-image \
        ... other args ...
    

Requisitos e definições de imagens de contentores personalizadas

Imagens de base

Pode usar dockerferramentas para criar contentores Docker personalizados com base numa das imagens Spark base do Dataproc no GKE publicadas.

Utilizador do contentor

O Dataproc no GKE executa contentores do Spark como o utilizador do Linux spark com um 1099 UID e um 1099 GID. Use o UID e o GID para autorizações do sistema de ficheiros. Por exemplo, se adicionar um ficheiro JAR em /opt/spark/jars/my-lib.jar na imagem como uma dependência da carga de trabalho, tem de conceder ao utilizador spark autorização de leitura para o ficheiro.

Componentes

  • Java: a variável de ambiente JAVA_HOME aponta para a localização da instalação do Java. O valor predefinido atual é /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64, que está sujeito a alterações (consulte as notas de lançamento do Dataproc para ver informações atualizadas).

    • Se personalizar o ambiente Java, certifique-se de que JAVA_HOME está definido para a localização correta e que PATH inclui o caminho para os ficheiros binários.
  • Python: o Dataproc no GKE tem imagens Spark base com o Miniconda3 instalado em /opt/conda. CONDA_HOME aponta para esta localização, ${CONDA_HOME}/bin está incluído em PATH e PYSPARK_PYTHON está definido como ${CONDA_HOME}/python.

    • Se personalizar o Conda, certifique-se de que CONDA_HOME aponta para o diretório inicial do Conda${CONDA_HOME}/bin, está incluído em PATH e PYSPARK_PYTHON está definido como ${CONDA_HOME}/python.

    • Pode instalar, remover e atualizar pacotes no ambiente base predefinido ou criar um novo ambiente. No entanto, é vivamente recomendado que o ambiente inclua todos os pacotes instalados no ambiente base da imagem do contentor base.

    • Se adicionar módulos Python, como um script Python com funções de utilidade, à imagem do contentor, inclua os diretórios de módulos em PYTHONPATH.

  • Spark: o Spark está instalado em /usr/lib/spark e SPARK_HOME aponta para esta localização. Não é possível personalizar o Spark. Se for alterada, a imagem do contentor é rejeitada ou não funciona corretamente.

    • Tarefas: pode personalizar as dependências das tarefas do Spark. SPARK_EXTRA_CLASSPATH define o caminho de classe adicional para processos JVM do Spark. Recomendação: coloque os frascos sob /opt/spark/jars e defina SPARK_EXTRA_CLASSPATH como /opt/spark/jars/*.

      Se incorporar o ficheiro JAR na imagem, o diretório recomendado é /opt/spark/job. Quando envia o trabalho, pode fazer referência ao mesmo com um caminho local, por exemplo, file:///opt/spark/job/my-spark-job.jar.

    • Conetor do Cloud Storage: o conetor do Cloud Storage está instalado em /usr/lib/spark/jars.

    • Utilitários: os pacotes de utilitários procps e tini são necessários para executar o Spark. Estas utilidades estão incluídas nas imagens base do Spark, pelo que não é necessário reinstalá-las nas imagens personalizadas.

    • Ponto de entrada: o Dataproc no GKE ignora quaisquer alterações feitas às primitivas ENTRYPOINT e CMD na imagem do contentor.

    • Scripts de inicialização: pode adicionar um script de inicialização opcional em /opt/init-script.sh. Um script de inicialização pode transferir ficheiros do Cloud Storage, iniciar um proxy no contentor, chamar outros scripts e realizar outras tarefas de inicialização.

      O script de ponto de entrada chama o script de inicialização com todos os argumentos da linha de comandos ($@) antes de iniciar o controlador do Spark, o executor do Spark e outros processos. O script de inicialização pode selecionar o tipo de processo do Spark com base no primeiro argumento ($1): os valores possíveis incluem spark-submit para contentores de controladores e executor para contentores de executores.

  • Configs: as configurações do Spark encontram-se em /etc/spark/conf. A variável de ambiente SPARK_CONF_DIR aponta para esta localização.

    Não personalize as configurações do Spark na imagem do contentor. Em alternativa, envie quaisquer propriedades através da API Dataproc on GKE pelos seguintes motivos:

    • Algumas propriedades, como o tamanho da memória do executor, são determinadas no tempo de execução e não no tempo de compilação da imagem do contentor. Têm de ser injetadas pelo Dataproc no GKE.
    • O Dataproc no GKE impõe restrições às propriedades fornecidas pelos utilizadores. O Dataproc no GKE monta as configurações de configMap em /etc/spark/conf no contentor, substituindo as definições incorporadas na imagem.

Imagens do Base Spark

O Dataproc suporta as seguintes imagens de contentores Spark base:

  • Spark 3.5: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.2

Exemplo de criação de imagem de contentor personalizada

Exemplo de ficheiro Docker

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

Crie a imagem de contentor

Execute os seguintes comandos no diretório Dockerfile

  1. Defina a imagem (exemplo: us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest) e mude para o diretório de compilação.
    IMAGE=custom container image \
        BUILD_DIR=$(mktemp -d) \
        cd "${BUILD_DIR}"
    
  2. Transfira o conetor do BigQuery.

    gcloud storage cp \
        gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
    

  3. Crie um ficheiro de exemplo do 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() EOF

  4. Crie um script de inicialização de exemplo.

    cat >init-script.sh <<EOF
    echo "hello world" >/tmp/init-script.out
    EOF
    

  5. Crie e envie a imagem.

    docker build -t "${IMAGE}" . && docker push "${IMAGE}"