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 docker
ferramentas 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 quePATH
inclui o caminho para os ficheiros binários.
- Se personalizar o ambiente Java, certifique-se de que
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 emPATH
ePYSPARK_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 emPATH
ePYSPARK_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
eSPARK_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 definaSPARK_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
etini
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
eCMD
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 incluemspark-submit
para contentores de controladores eexecutor
para contentores de executores.
Configs: as configurações do Spark encontram-se em
/etc/spark/conf
. A variável de ambienteSPARK_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
- 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}"
Transfira o conetor do BigQuery.
gcloud storage cp \ gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
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() EOFCrie um script de inicialização de exemplo.
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
Crie e envie a imagem.
docker build -t "${IMAGE}" . && docker push "${IMAGE}"