Todos os produtos
Search
Central de documentação

AnalyticDB:Desenvolva aplicações Spark com PySpark

Última atualização: Jul 15, 2026

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

Uso básico do PySpark

  1. 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()
    
  2. Faça upload do arquivo example.py para o OSS. Para mais informações, consulte Upload de arquivo.

  3. Acesse o editor de desenvolvimento Spark.

    1. 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.

    2. No painel de navegação à esquerda, escolha Job Development > Spark JAR Development.

  4. 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.

  5. 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

  • Debugging e jobs temporários.

  • Poucas dependências e download rápido.

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

  • Ambientes de produção.

  • Muitas dependências ou dependências grandes.

  • Ambientes que exigem reutilização de longo prazo.

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:

  1. Status do cluster: O cluster está inicializado e executa com sucesso o exemplo básico Spark Pi.

  2. 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.

  3. 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

  1. 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)
  2. 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 ---
        }
    }
    Importante

    O 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_python

    spark.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 PyPI a 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.

    Importante

    Use 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

  3. 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.

  1. Planeje um caminho no OSS

    Especifique um caminho no OSS para armazenar o ambiente empacotado, por exemplo, oss://your-bucket/envs/my_custom_env.

  2. Envie um job de empacotamento

    Importante
    • Nã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 PyPI a 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.

    Importante

    Use 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.

  3. 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
  4. 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 archives na configuração do seu job.

    Aviso

    Esta 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

  1. ModuleNotFoundError:

    • Verifique se as dependências estão configuradas tanto para driverEnv quanto para executorEnv.

    • Confirme se os nomes dos pacotes estão grafados corretamente e correspondem aos nomes no PyPI.

  2. 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.

  3. 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.