Este artigo descreve como desenvolver jobs Spark Python no AnalyticDB for MySQL e apresenta um método para configurar um ambiente em cloud.
Pré-requisitos
Cluster do AnalyticDB for MySQL Enterprise Edition, Basic Edition ou Data Lakehouse Edition criado.
Bucket do Object Storage Service (OSS) criado na mesma região do cluster do AnalyticDB for MySQL.
Grupo de recursos de job criado para o cluster do AnalyticDB for MySQL Enterprise Edition, Basic Edition ou Data Lakehouse Edition.
-
Conta de banco de dados criada para o cluster do AnalyticDB for MySQL.
Se você utiliza uma conta Alibaba Cloud, basta criar uma conta privilegiada.
Caso utilize um usuário do Resource Access Management (RAM), é necessário criar uma conta privilegiada e uma conta padrão e, em seguida, associar a conta padrão ao usuário RAM.
Uso básico do PySpark
-
Escreva o código de exemplo abaixo e salve-o como example.py.
from pyspark.sql import SparkSession if __name__ == "__main__": spark = SparkSession.builder.getOrCreate() df = spark.sql("SELECT 1+1") df.printSchema() df.show() Faça upload do arquivo example.py para o OSS. Para mais informações, consulte Upload de arquivo.
-
Acesse o editor de desenvolvimento Spark.
Faça login no console do AnalyticDB for MySQL. No canto superior esquerdo do console, selecione uma região. No painel de navegação à esquerda, clique em Clusters. Localize o cluster desejado e clique no ID do cluster.
No painel de navegação à esquerda, escolha .
Na parte superior da janela do editor, selecione um grupo de recursos de job e um tipo de job Spark. Este tópico utiliza o tipo Batch como exemplo.
-
Insira a seguinte configuração de job no editor.
{ "name": "Spark Python Test", "file": "oss://testBucketName/example.py", "conf": { "spark.driver.resourceSpec": "small", "spark.executor.instances": 1, "spark.executor.resourceSpec": "small" } }Para detalhes sobre os parâmetros, consulte Descrição dos parâmetros.
Uso de dependências Python
Este tópico apresenta duas soluções para criar um ambiente em cloud sem a necessidade de empacotamento local.
Tipo de solução | Casos de uso | Vantagens e desvantagens |
Instalação em tempo real |
| Vantagens: Configuração simples e pronto para uso. Desvantagens: As dependências são baixadas e instaladas novamente a cada execução do job. |
Build em cloud |
| Vantagens: Empacote uma vez, reutilize indefinidamente. Garante inicialização rápida e alta estabilidade. Desvantagens: Requer um job extra para empacotar as dependências. |
Pré-requisitos
Antes de configurar o ambiente em cloud, certifique-se de atender aos seguintes requisitos:
Status do cluster: O cluster está inicializado e executa com sucesso o exemplo básico Spark Pi.
-
Requisitos de versão:
Versão do Spark: Versão 3.5.1 suportada.
Versão do Python: Versões 3,9 ou 3,11 suportadas.
-
Restrição importante (versão do NumPy):
O Apache Spark deve executar em um ambiente com numpy < 2.0.0.
O sistema impõe a instalação da versão numpy==1.26.0.
Importante: Certifique-se de que outras dependências instaladas, como Pandas e SciPy, sejam compatíveis com o NumPy 1.26.0. Caso contrário, o job falhará.
Exemplos
Instalação em tempo real
-
Prepare o código da sua aplicação
Escreva um script Python, por exemplo,
job.py, e faça upload dele para um caminho no OSS, como oss://your-bucket/scripts/job.py.# This sample script prints all dependencies in the current Python environment. # Print all modules in the Python environment import pkgutil if __name__ == "__main__": for module_info in pkgutil.iter_modules(): print(module_info.name) -
Configure os parâmetros do job
## Sample job { "file": "oss://your-bucket/scripts/job.py", // Path to your code file "name": "Real-time Env Demo", "conf": { "spark.adb.version": "3.5", "spark.driver.resourceSpec": "medium", "spark.executor.instances": 1, "spark.executor.resourceSpec": "medium", // --- Start of core configuration --- // 1. Specify the Python version "spark.kubernetes.driverEnv.PYTHON_BIN": "python3.11", "spark.executorEnv.PYTHON_BIN": "python3.11", // 2. Specify the dependencies to install (for both Driver and Executor) "spark.kubernetes.driverEnv.PYTHON_MODULES": "chinesecalendar>=1.10.0,pandas>=1.5.3,lunar_python", "spark.executorEnv.PYTHON_MODULES": "chinesecalendar>=1.10.0,pandas>=1.5.3,lunar_python" // --- End of core configuration --- } }ImportanteO Spark é composto por um Driver (nó de controle) e Executors (nós de execução). Para garantir um ambiente consistente, configure as mesmas variáveis de ambiente para ambos.
Parâmetro
Descrição
Obrigatório
Padrão
Observações
spark.kubernetes.driverEnv.PYTHON_MODULES
Lista de pacotes Python a instalar.
Sim
Nenhum
Separe múltiplas dependências Python com vírgulas (,).
O formato das dependências Python deve seguir rigorosamente os requisitos da comunidade
PyPI.Dependências Python sem restrições de versão devem ficar no final da lista.
Exemplo:
chinesecalendar>=1.10.0,dynaconf>=3.2.10,pandas>=1.5.3,lunar_pythonspark.executorEnv.PYTHON_MODULES
spark.kubernetes.driverEnv.PYTHON_BIN
Versão do Python para usar no job.
Não
python3.11
Valores válidos:
python3.11
python3.9
spark.executorEnv.PYTHON_BIN
spark.kubernetes.driverEnv.INDEX_URL
URL do repositório
PyPI.Não
http://mirrors.cloud.aliyuncs.com/pypi/simple/
O valor padrão é a URL de um espelho hospedado na Alibaba Cloud, acessível via rede interna. Se você especificar um endereço acessível apenas pela rede pública, como o espelho PyPI da Universidade Tsinghua, será necessário ativar o acesso à rede pública. Para mais informações, consulte Configurar acesso à rede pública para uma aplicação Spark.
spark.executorEnv.INDEX_URL
spark.kubernetes.driverEnv.TRUSTED_HOST
Domínio do repositório
PyPIa adicionar como host confiável.Não
mirrors.cloud.aliyuncs.com
O Python verifica o certificado SSL do repositório PyPI durante a instalação. Se o certificado do repositório não for emitido por uma autoridade certificadora (CA) confiável, use este parâmetro para marcar o domínio do repositório como um host confiável.
ImportanteUse este parâmetro com cautela. Certifique-se de que a fonte PyPI configurada seja confiável, pois ataques de confusão de dependência são uma ameaça comum.
spark.executorEnv.TRUSTED_HOST
-
Execute o job de exemplo. Ao visualizar o log, confirme que o ambiente Python contém as dependências declaradas e suas dependências transitivas.
xxlimited_35 zlib numpy pandas _distutils_hack _virtualenv chinese_calendar dateutil lunar_python pip pkg_resources pytz setuptools six tzdata wheel >>>>>>>> stderr: 25/12/25 17:01:56 INFO ShutdownHookManager: Shutdown hook called
Build em cloud
Esta solução utiliza um job dedicado para empacotar dependências em um arquivo compactado, enviado posteriormente ao OSS para reutilização em jobs futuros.
-
Planeje um caminho no OSS
Especifique um caminho no OSS para armazenar o ambiente empacotado, por exemplo,
oss://your-bucket/envs/my_custom_env. -
Envie um job de empacotamento
ImportanteNão modifique o caminho do script de empacotamento integrado:
local:///opt/tools/build_venv.py.Em
args, especifique as dependências a instalar.
## Sample job { // 1. Specify all dependencies to be packaged. "args": [ "chinesecalendar>=1.10.0", "pandas>=1.5.3", "pyarrow>=19.0.1", "lunar_python" ], // 2. Call the built-in packaging script (do not modify). "file": "local:///opt/tools/build_venv.py", "name": "Build VirtualEnv Job", "conf": { "spark.driver.resourceSpec": "medium", "spark.executor.instances": 1, "spark.executor.resourceSpec": "medium", // 3. Specify the Python version. "spark.kubernetes.driverEnv.PYTHON_BIN": "python3.11", // 4. Specify the OSS path to upload the packaged environment (modify as needed). "spark.kubernetes.driverEnv.VENV_OSS_PATH": "oss://your-bucket/envs/my_custom_env", // 5. Specify the temporary directory for the build. "spark.kubernetes.driverEnv.VENV_DIR": "/tmp/build_test" } }Parâmetro
Descrição
Obrigatório
Padrão
Observações
spark.kubernetes.driverEnv.VENV_OSS_PATH
Caminho de armazenamento para o pacote de ambiente.
Sim
Nenhum
Exemplo:
oss://your-bucket/envs/my_custom_env.spark.kubernetes.driverEnv.VENV_DIR
Diretório temporário de build.
Não
/tmp/venv
Se o pacote de ambiente for grande, monte um disco de dados e altere este caminho para
/user_data_dir.spark.kubernetes.driverEnv.PYTHON_BIN
Versão do Python para usar no job.
Não
python3.11
Valores válidos:
python3.11
python3.9
spark.kubernetes.driverEnv.INDEX_URL
URL do repositório
PyPI.Não
http://mirrors.cloud.aliyuncs.com/pypi/simple/
O valor padrão é a URL de um espelho hospedado na Alibaba Cloud, acessível via rede interna. Se você especificar um endereço acessível apenas pela rede pública, como o espelho PyPI da Universidade Tsinghua, será necessário ativar o acesso à rede pública. Para mais informações, consulte Configurar acesso à rede pública para uma aplicação Spark.
spark.kubernetes.driverEnv.TRUSTED_HOST
Domínio do repositório
PyPIa adicionar como host confiável.Não
mirrors.cloud.aliyuncs.com
O Python verifica o certificado SSL do repositório PyPI durante a instalação. Se o certificado do repositório não for emitido por uma autoridade certificadora (CA) confiável, use este parâmetro para marcar o domínio do repositório como um host confiável.
ImportanteUse este parâmetro com cautela. Certifique-se de que a fonte PyPI configurada seja confiável, pois ataques de confusão de dependência são uma ameaça comum.
-
Execute o job
Os logs exibirão os detalhes do upload do arquivo compactado e uma lista completa dos pacotes e versões instalados no ambiente virtual.
------------------ -------------- chinesecalendar 1.11.0 lunar_python 1.4.8 numpy 1.26.0 pandas 2.3.3 pip 24.2 pyarrow 22.0.0 python-dateutil 2.9.0.post0 pytz 2025.2 setuptools 75.1.0 six 1.17.0 tzdata 2025.3 wheel 0.44.0 Uploading archive to oss://xxx/envs/my_custom_env/venv_20251225174458.tar.gz + ossutil cp /tmp/venv_20251225174458.tar.gz xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx Succeed: Total num: 1, size: 115,655,687. OK num: 1(upload 1 files). 0.788886(s) elapsed Upload completed: oss://xxx/envs/my_custom_env/venv_20251225174458.tar.gz -
Utilize o pacote de ambiente
Em jobs PySpark subsequentes, referencie o arquivo compactado em
oss://your-bucket/envs/my_custom_env.Para usar o ambiente empacotado, defina o parâmetro
archivesna configuração do seu job.AvisoEsta configuração é suportada apenas no Spark 3.5 e versões posteriores.
## Sample usage { "name": "Spark Python", "file": "oss://testBucketName/example.py", "archives": ["oss://your-bucket/envs/my_custom_env/venv_*****.tar.gz#PY3"], "args": [ "oss://testBucketName/staff.csv" ], "conf": { "spark.driver.resourceSpec": "small", "spark.executor.instances": 2, "spark.executor.resourceSpec": "small", "spark.pyspark.python": "./PY3/venv/bin/python3" } }
Solução de problemas
-
ModuleNotFoundError:
Verifique se as dependências estão configuradas tanto para
driverEnvquanto paraexecutorEnv.Confirme se os nomes dos pacotes estão grafados corretamente e correspondem aos nomes no PyPI.
-
Erros relacionados ao NumPy:
Verifique se suas dependências exigem numpy >= 2.0.0. Em caso afirmativo, faça downgrade das versões das dependências para garantir compatibilidade com o numpy 1.26.0.
-
Timeouts de download:
Se os timeouts persistirem mesmo usando o espelho padrão da rede interna, verifique se, ao especificar um espelho público, você também ativou o acesso à rede pública para o seu job.