Usar bibliotecas Python com o AWS Glue
É possível instalar módulos e bibliotecas Python adicionais para uso com o ETL do AWS Glue. Para o AWS Glue 2.0 ou superior, o AWS Glue usa o Python Package Installer (pip3) para instalar módulos adicionais a serem usados pelo ETL do AWS Glue. AWS O Glue oferece várias opções para levar os módulos adicionais do Python ao seu ambiente de trabalho do AWS Glue. O parâmetro --additional-python-modules pode ser utilizado para trazer novos módulos por meio de arquivos zip contendo wheels Python empacotadas (também conhecido como “zip de wheel”, disponível para o AWS Glue 5.0 e versões superiores), arquivos de wheel Python individuais, arquivos de requisitos (requirements.txt, disponível para o AWS Glue 5.0 e versões superiores) ou uma lista de módulos Python separados por vírgula. Ele também pode ser usado para alterar a versão dos módulos python fornecidos no ambiente AWS Glue (consulte Módulos do Python já fornecidos no AWS Glue para obter mais detalhes).
Tópicos
Instalar módulos Python adicionais com pip no AWS Glue 2.0 ou posterior
O AWS Glue usa o Python Package Installer (pip3) para instalar módulos adicionais a serem usados pelo ETL do AWS Glue. Você pode usar o parâmetro --additional-python-modules com uma lista de módulos do Python separados por vírgulas para adicionar um novo módulo ou alterar a versão de um módulo existente. Você pode instalar artefatos de wheel construídos por meio de um zip de wheel ou de um artefato de wheel independente carregando o arquivo para o Amazon S3 e incluindo o caminho para o objeto do Amazon S3 na sua lista de módulos. Para obter mais informações sobre como configurar parâmetros de trabalho, consulte Usar parâmetros de trabalho em trabalhos do AWS Glue.
Você pode transmitir opções adicionais para o pip3 com o parâmetro --python-modules-installer-option. Por exemplo, você pode passar o --only-binary para forçar o pip a instalar somente artefatos pré-construídos para os pacotes especificados por --additional-python-modules. Para obter mais exemplos, consulte Desenvolver módulos Python de um wheel para workloads de ETL do Spark usando o AWS Glue 2.0
Práticas recomendadas para o gerenciamento de dependências do Python
Para workloads de produção, o AWS Glue recomenda empacotar todas as suas dependências do Python como arquivos wheel em um único artefato zip. Essa abordagem fornece:
-
Execução determinística: controle exato sobre quais versões do pacote estão instaladas
-
Confiabilidade: sem dependência de repositórios de pacotes externos durante a execução do trabalho
-
Desempenho: operação de download único em vez de várias chamadas de rede
-
Instalação off-line: funciona em ambientes VPC privados sem acesso à Internet
Considerações importantes
No modelo de responsabilidade compartilhada da AWS
-
Atualizações de segurança: atualização regular de pacotes para solucionar vulnerabilidades de segurança
-
Compatibilidade de versão: para garantir que os pacotes sejam compatíveis com sua versão do AWS Glue
-
Teste: para validar se suas dependências empacotadas funcionam corretamente no ambiente Glue
Se você tiver dependências mínimas, considere usar arquivos wheel individuais em vez disso.
O AWS Glue 5.0 e versões posteriores são compatíveis com o empacotamento de vários arquivos de wheel em um único artefato zip contendo wheels Python agrupadas para um gerenciamento de dependências mais confiável e determinístico. Para usar essa abordagem, crie um arquivo zip contendo todas as suas dependências de wheel e suas dependências transitivas com o sufixo .gluewheels.zip, faça o upload para o Amazon S3 e faça referência a ele usando o parâmetro --additional-python-modules. Certifique-se de adicionar --no-index ao parâmetro de trabalho --python-modules-installer-option. Com essa configuração, o arquivo zip de wheels atua essencialmente como um índice local para o pip resolver dependências no runtime. Isso elimina dependências em repositórios de pacotes externos, como o PyPI, durante a execução do trabalho, proporcionando maior estabilidade e consistência para workloads de produção. Por exemplo:
--additional-python-modules s3://amzn-s3-demo-bucket/path/to/zip-of-wheels-1.0.0.gluewheels.zip --python-modules-installer-option --no-index
Para obter instruções sobre como criar um zip de wheels, consulte Apêndice A: Como criar um artefato de zip de wheels.
O AWS Glue oferece suporte à instalação de pacotes Python personalizados usando arquivos wheel (.whl) armazenados no Amazon S3. Para incluir arquivos wheel em seus trabalhos do AWS Glue, forneça uma lista separada por vírgula dos arquivos wheel armazenados no S3 para o parâmetro do trabalho do --additional-python-modules. Por exemplo:
--additional-python-modules s3://amzn-s3-demo-bucket/path/to/package-1.0.0-py3-none-any.whl,s3://your-bucket/path/to/another-package-2.1.0-cp311-cp311-linux_x86_64.whl
Essa abordagem também pode ser aplicada quando você precisa de distribuições personalizadas ou pacotes com dependências nativas pré-compilados para o sistema operacional correto. Para obter mais exemplos, consulte Desenvolver módulos Python de um wheel para workloads de ETL do Spark usando o AWS Glue 2.0
No AWS Glue 5.0+, você pode fornecer o arquivo requirements.txt padrão de fábrica para gerenciar as dependências da biblioteca Python. Para fazer isso, forneça os seguintes dois parâmetros de trabalho:
-
Chave:
--python-modules-installer-optionValor::
-r -
Chave:
--additional-python-modulesValor::
s3://path_to_requirements.txt
Os nós do AWS Glue 5.0 carregam inicialmente as bibliotecas Python especificadas em requirements.txt.
Exemplo de requirements.txt:
awswrangler==3.9.1 elasticsearch==8.15.1 PyAthena==3.9.0 PyMySQL==1.1.1 PyYAML==6.0.2 pyodbc==5.2.0 pyorc==0.9.0 redshift-connector==2.1.3 scipy==1.14.1 scikit-learn==1.5.2 SQLAlchemy==2.0.36
Importante
Use essa opção com cuidado, especialmente em workloads de produção. Extrair dependências do PyPI no runtime é altamente arriscado porque não é possível ter certeza de qual artefato o pip resolve. Usar versões de biblioteca não fixadas é especialmente arriscado, pois extrai a versão mais recente dos módulos Python, que podem introduzir alterações significativas ou transportar um módulo Python incompatível. Isso pode resultar em falha no trabalho devido à falha na instalação do python no ambiente de trabalho AWS Glue. Embora fixar a versão da biblioteca aumente a estabilidade, a resolução de pip ainda não é totalmente determinística, portanto, problemas semelhantes podem surgir. Como prática recomendada, o AWS Glue recomenda o uso de artefatos congelados, como zip de wheels ou arquivos de wheel individuais (consulte (Recomendado) Instalar bibliotecas Python adicionais no AWS Glue 5.0 ou versões superiores usando o Zip de Wheels para obter mais detalhes).
Importante
Se você não fixar as versões de suas dependências transitivas, uma dependência primária poderá extrair versões de dependência transitiva incompatíveis. Como prática recomendada, todas as versões da biblioteca devem ser fixadas para garantir maior consistência em trabalhos do AWS Glue. Para uma opção ainda melhor, o AWS Glue recomenda empacotar suas dependências em um arquivo zip de wheel para garantir a máxima consistência e confiabilidade das seus workloads de produção.
Para atualizar ou adicionar um novo módulo do AWS Glue, é possível passar parâmetros --additional-python-modules com uma lista de módulos Python separados por vírgulas como valores. Por exemplo, para atualizar ou adicionar o módulo scikit-learn, use a seguinte chave/valor: "--additional-python-modules",
"scikit-learn==0.21.3". Existem duas opções para configurar diretamente os módulos Python.
-
Módulo Python fixo
"--additional-python-modules", "scikit-learn==0.21.3,ephem==4.1.6" -
Módulo Python não fixado: (não recomendado para workloads de produção)
"--additional-python-modules", "scikit-learn>==0.20.0,ephem>=4.0.0"OU
"--additional-python-modules", "scikit-learn,ephem"
Importante
Use essa opção com cuidado, especialmente em workloads de produção. Extrair dependências do PyPI no runtime é altamente arriscado porque não é possível ter certeza de qual artefato o pip resolve. Usar versões de biblioteca não fixadas é especialmente arriscado, pois extrai a versão mais recente dos módulos Python, que podem introduzir alterações significativas ou transportar um módulo Python incompatível. Isso pode resultar em falha no trabalho devido à falha na instalação do python no ambiente de trabalho AWS Glue. Embora fixar a versão da biblioteca aumente a estabilidade, a resolução de pip ainda não é totalmente determinística, portanto, problemas semelhantes podem surgir. Como prática recomendada, o AWS Glue recomenda o uso de artefatos congelados, como zip de wheels ou arquivos de wheel individuais (consulte (Recomendado) Instalar bibliotecas Python adicionais no AWS Glue 5.0 ou versões superiores usando o Zip de Wheels para obter mais detalhes).
Importante
Se você não fixar as versões de suas dependências transitivas, uma dependência primária poderá extrair versões de dependência transitiva incompatíveis. Como prática recomendada, todas as versões da biblioteca devem ser fixadas para garantir maior consistência em trabalhos do AWS Glue. Para uma opção ainda melhor, o AWS Glue recomenda empacotar suas dependências em um arquivo zip de wheel para garantir a máxima consistência e confiabilidade das seus workloads de produção.
Inclusão de arquivos Python com recursos nativos do PySpark
O AWS Glue usa PySpark para incluir arquivos Python em trabalhos de ETL do AWS Glue. Recomenda-se usar --additional-python-modules para gerenciar suas dependências quando disponíveis. Você pode usar o parâmetro de trabalho --extra-py-files para incluir arquivos Python. As dependências devem ser hospedadas no Amazon S3, e o valor do argumento deve ser uma lista delimitada por vírgulas de caminhos do Amazon S3 sem espaços. Essa funcionalidade se comporta como o gerenciamento de dependências do Python que você usaria com o Spark. Para obter mais informações sobre o gerenciamento de dependências do Python no Spark, consulte a página Using PySpark Native Features--extra-py-files é útil em casos nos quais seu código adicional não está empacotado ou quando você está migrando um programa Spark com uma cadeia de ferramentas existente para gerenciar dependências. Para que suas ferramentas de dependência sejam passíveis de manutenção, você precisará empacotar suas dependências antes de enviá-las.
Scripts de programação que usam transformações visuais
Ao criar uma tarefa do AWS Glue usando a interface visual do AWS Glue Studio, é possível transformar seus dados com nós de transformação de dados gerenciados e transformações visuais personalizadas. Para obter mais informações sobre nós de transformações de dados gerenciados, consulte Transformar dados com transformações gerenciadas do AWS Glue. Para obter mais informações sobre transformações visuais personalizadas, consulte Transformar dados com transformações visuais personalizadas . Os scripts que usam transformações visuais só poderão ser gerados quando a Linguagem do trabalho estiver configurada para usar Python.
Ao gerar uma tarefa do AWS Glue usando transformações visuais, o AWS Glue Studio incluirá essas transformações no ambiente de runtime usando o parâmetro --extra-py-files na configuração da tarefa. Para obter mais informações sobre parâmetros de trabalho, consulte Usar parâmetros de tarefa em tarefas do AWS Glue. Ao fazer alterações em um script gerado ou em um ambiente de runtime, será necessário preservar essa configuração de trabalho para que seu script seja executado com êxito.
Compactar bibliotecas para inclusão
A menos que uma biblioteca esteja contida em um único arquivo .py, ela precisará ser compactada em uma pasta .zip. O diretório do pacote deve estar na raiz do arquivo e precisa conter um arquivo __init__.py para o pacote. Em seguida, o Python poderá importar o pacote normalmente.
Se a sua biblioteca contém um único módulo Python em um arquivo .py, você não precisará compactá-la em uma pasta .zip.
Carregar bibliotecas do Python em cadernos do AWS Glue Studio
Para especificar bibliotecas do Python nos cadernos do AWS Glue Studio, consulte Instalar módulos Python adicionais.
Carregar bibliotecas Python em um endpoint de desenvolvimento no AWS Glue 0.9/1.0
Se você estiver usando diferentes conjuntos de bibliotecas para diferentes scripts de ETL, poderá configurar um endpoint de desenvolvimento separado para cada conjunto ou substituir os arquivos .zip da biblioteca carregados pelo seu endpoint de desenvolvimento sempre que os scripts são alternados.
Você pode usar o console para especificar um ou mais arquivos .zip da biblioteca para um endpoint de desenvolvimento ao criá-lo. Depois de atribuir um nome e um perfil do IAM, escolha Script Libraries and job parameters (optional) (Bibliotecas de script e parâmetros de trabalho [opcional]) e insira o caminho completo do Amazon S3 para o arquivo .zip da sua biblioteca na caixa Python library path (Caminho da biblioteca Python). Por exemplo:
s3://bucket/prefix/site-packages.zip
Se quiser, você poderá especificar vários caminhos completos para arquivos, separando-os com vírgulas, mas sem espaços, da seguinte maneira:
s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip
Se você atualizar esses arquivos .zip posteriormente, poderá usar o console para importá-los novamente para o seu endpoint de desenvolvimento. Navegue até o endpoint do desenvolvedor em questão, marque a caixa de seleção ao lado e escolha Update ETL libraries no menu Action.
De forma semelhante, você pode especificar arquivos de biblioteca usando as APIs do AWS Glue. Ao criar um endpoint de desenvolvimento chamando Ação CreateDevEndpoint (Python: create_dev_endpoint), você pode especificar um ou mais caminhos completos para bibliotecas no parâmetro ExtraPythonLibsS3Path. Essa chamada é semelhante à seguinte:
dep = glue.create_dev_endpoint(
EndpointName="testDevEndpoint",
RoleArn="arn:aws:iam::123456789012",
SecurityGroupIds="sg-7f5ad1ff",
SubnetId="subnet-c12fdba4",
PublicKey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtp04H/y...",
NumberOfNodes=3,
ExtraPythonLibsS3Path="s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip")
Ao atualizar um endpoint de desenvolvimento, você também pode atualizar as bibliotecas que ele carrega usando um objeto DevEndpointCustomLibraries e definindo o parâmetro UpdateEtlLibraries como True ao chamar UpdateDevEndpoint (update_dev_endpoint).
Usar bibliotecas Python em trabalho ou JobRun
Ao criar um novo trabalho no console, você pode especificar um ou mais arquivos .zip de biblioteca escolhendo a opção Script Libraries and job parameters (optional) (Bibliotecas de script e parâmetros de trabalho [opcional]) e inserindo os caminhos completos das bibliotecas do Amazon S3, da mesma maneira como você faria ao criar um endpoint de desenvolvimento:
s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip
Se você estiver chamando CreateJob (create_job), poderá especificar um ou mais caminhos completos para bibliotecas padrão usando o parâmetro padrão --extra-py-files, da seguinte maneira:
job = glue.create_job(Name='sampleJob',
Role='Glue_DefaultRole',
Command={'Name': 'glueetl',
'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'},
DefaultArguments={'--extra-py-files': 's3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip'})
Assim, quando estiver iniciando um JobRun, você poderá substituir a configuração da biblioteca padrão por uma diferente:
runId = glue.start_job_run(JobName='sampleJob',
Arguments={'--extra-py-files': 's3://bucket/prefix/lib_B.zip'})
Analisar proativamente dependências do Python
Para identificar proativamente possíveis problemas de dependência antes de implantar no AWS Glue, é possível usar a ferramenta de análise de dependências para validar seus pacotes Python em relação ao ambiente AWS Glue de destino.
A AWS oferece uma ferramenta de análise de dependências Python de código aberto projetada especificamente para ambientes AWS Glue. Essa ferramenta está disponível no repositório de amostras do AWS Glue e pode ser usada localmente para validar suas dependências antes da implantação.
Essa análise ajuda a garantir que suas dependências sigam a prática recomendada de fixar todas as versões da biblioteca para implantações de produção consistentes. Para obter mais detalhes, consulte o arquivo README
O AWS Glue Python Dependency Analyzer ajuda a identificar dependências não fixadas e conflitos de versão simulando a instalação do pip com restrições específicas da plataforma que correspondem ao seu ambiente AWS Glue de destino.
# Analyze a single Glue job python glue_dependency_analyzer.py -j my-glue-job # Analyze multiple jobs with specific AWS configuration python glue_dependency_analyzer.py -j job1 -j job2 --aws-profile production --aws-region us-west-2
A ferramenta sinalizará:
-
Dependências não fixadas que poderiam instalar versões diferentes em todas as execuções de tarefas
-
Conflitos de versão entre pacotes
-
Dependências não disponíveis para seu ambiente AWS Glue de destino
O Amazon Q Developer é um assistente conversacional baseado em inteligência artificial (IA) generativa que pode ajudar você a entender, criar, estender e operar aplicações da AWS. Você pode baixá-lo seguindo as instruções no guia de introdução do Amazon Q.
O Amazon Q Developer pode ser usado para analisar e corrigir falhas de trabalho devido à dependência do Python. Sugerimos o prompt a seguir, onde <Job-Name> deve ser substituídopelo nome do seu trabalho do Glue.
I have an AWS Glue job named <Job-Name> that has failed due to Python module installation conflicts. Please assist in diagnosing and resolving this issue using the following systematic approach. Proceed once sufficient information is available. Objective: Implement a fix that addresses the root cause module while minimizing disruption to the existing working environment. Step 1: Root Cause Analysis • Retrieve the most recent failed job run ID for the specified Glue job • Extract error logs from CloudWatch Logs using the job run ID as a log stream prefix • Analyze the logs to identify: • The recently added or modified Python module that triggered the dependency conflict • The specific dependency chain causing the installation failure • Version compatibility conflicts between required and existing modules Step 2: Baseline Configuration Identification • Locate the last successful job run ID prior to the dependency failure • Document the Python module versions that were functioning correctly in that baseline run • Establish the compatible version constraints for conflicting dependencies Step 3: Targeted Resolution Implementation • Apply pinning by updating the job's additional_python_modules parameter • Pin only the root cause module and its directly conflicting dependencies to compatible versions, and do not remove python modules unless necessary • Preserve flexibility for non-conflicting modules by avoiding unnecessary version constraints • Deploy the configuration changes with minimal changes to the existing configuration and execute a validation test run. Do not change the Glue versions. Implementation Example: Scenario: Recently added pandas==2.0.0 to additional_python_modules Error: numpy version conflict (pandas 2.0.0 requires numpy>=1.21, but existing job code requires numpy<1.20) Resolution: Update additional_python_modules to "pandas==1.5.3,numpy==1.19.5" Rationale: Use pandas 1.5.3 (compatible with numpy 1.19.5) and pin numpy to last known working version Expected Outcome: Restore job functionality with minimal configuration changes while maintaining system stability.
O prompt instrui o Q a:
-
Obter o ID de execução do trabalho com falha mais recente
-
Encontrar logs e detalhes associados
-
Encontrar execuções de trabalho bem-sucedidas para detectar quaisquer pacotes Python alterados
-
Fazer quaisquer correções na configuração e acionar outra execução de teste
Módulos do Python já fornecidos no AWS Glue
Para alterar a versão desses módulos fornecidos, forneça novas versões com o parâmetro de trabalho --additional-python-modules.
Apêndice A: Como criar um artefato de zip de wheels
Demonstramos, por exemplo, como criar um artefato de zip de wheels. O exemplo mostrado baixa os pacotes cryptography e scipy em um artefato com zip de wheels e copia o zip de wheels em um local do Amazon S3.
-
Você deve executar os comandos para criar o zip de wheels em um ambiente Amazon Linux semelhante ao ambiente do Glue. Consulte Apêndice B: Detalhes do ambiente AWS Glue. O Glue 5.1 usa o AL2023 com python versão 3.11. Crie o Dockerfile que criará esse ambiente:
FROM --platform=linux/amd64 public.ecr.aws/amazonlinux/amazonlinux:2023-minimal # Install Python 3.11, pip, and zip utility RUN dnf install -y python3.11 pip zip && \ dnf clean all WORKDIR /build -
Criar um arquivo requirements.txt
cryptography scipy -
Criar e girar um contêiner do Docker
# Build docker image docker build --platform linux/amd64 -t glue-wheel-builder . # Spin up container docker run --platform linux/amd64 -v $(pwd)/requirements.txt:/input/requirements.txt:ro -v $(pwd):/output -it glue-wheel-builder bash -
Excute os seguintes comandos na imagem do Docker:
# Create a directory for the wheels mkdir wheels # Copy requirements.txt into wheels directory cp /input/requirements.txt wheels/ # Download the wheels with the correct platform and Python version pip3 download \ -r wheels/requirements.txt \ --dest wheels/ \ --platform manylinux2014_x86_64 \ --python-version 311 \ --only-binary=:all: # Package the wheels into a zip archive with the .gluewheels.zip suffix zip -r mylibraries-1.0.0.gluewheels.zip wheels/ # Copy zip to output cp mylibraries-1.0.0.gluewheels.zip /output/ # Exit the container exit -
Enviar o zip de wheel para o local do Amazon S3
aws s3 cp mylibraries-1.0.0.gluewheels.zip s3://amzn-s3-demo-bucket/example-prefix/ -
Limpeza opcional
rm mylibraries-1.0.0.gluewheels.zip rm Dockerfile rm requirements.txt -
Execute a tarefa Glue com os seguintes argumentos de tarefa:
--additional-python-modules s3://amzn-s3-demo-bucket/example-prefix/mylibraries-1.0.0.gluewheels.zip --python-modules-installer-option --no-index
Apêndice B: Detalhes do ambiente AWS Glue
| Versão do AWS Glue | Versão do Python | Imagem base | versão glibc | Tags de plataforma compatíveis |
|---|---|---|---|---|
| 5.1 | 3.11 | Amazon Linux 2023 (AL2023) |
2.34 |
manylinux_2_34_x86_64 manylinux_2_28_x86_64 manylinux2014_x86_64 |
| 5,0 | 3.11 | Amazon Linux 2023 (AL2023) |
2.34 |
manylinux_2_34_x86_64 manylinux_2_28_x86_64 manylinux2014_x86_64 |
| 4,0 | 3.10 | Amazon Linux 2 (AL2) |
2.26 | manylinux2014_x86_64 |
| 3.0 | 3.7 | Amazon Linux 2 (AL2) |
2.26 | manylinux2014_x86_64 |
| 2.0 | 3.7 | Amazon Linux AMI (AL1) |
2.17 | manylinux2014_x86_64 |
No modelo de responsabilidade compartilhada da AWS
O AWS Glue não oferece suporte à compilação de código nativo no ambiente de trabalho. No entanto, os trabalhos do AWS Glue são executados em um ambiente Linux gerenciado pela Amazon. Talvez você possa fornecer suas dependências nativas em formato compilado por meio de um arquivo wheel Python. Consulte a tabela acima para obter detalhes sobre a compatibilidade de versões do AWS Glue.
Importante
O uso de dependências incompatíveis pode resultar em problemas de tempo de execução, especialmente para bibliotecas com extensões nativas que devem corresponder à arquitetura e às bibliotecas do sistema do ambiente de destino. Cada versão do AWS Glue é executada em uma versão específica do Python com bibliotecas pré-instaladas e configurações do sistema.