O gerenciamento de dependências Python de terceiros em jobs distribuídos do MaxFrame geralmente exige o upload manual de pacotes para o MaxCompute antes de cada execução. O serviço de empacotamento automático elimina essa etapa: declare suas dependências no código usando with_python_requirements e o MaxFrame as resolverá e agrupará automaticamente durante a execução.
Pré-requisitos
Antes de começar, verifique se você possui:
Uma sessão do MaxFrame conectada ao MaxCompute
(Se estiver usando o cliente MaxFrame on-premises) MaxFrame SDK versão V0.1.0b5 ou posterior. Consulte Preparativos para obter instruções de configuração.
Como funciona
Decore sua UDF com
@with_python_requirements, listando os pacotes necessários para sua função.Durante a execução do job, o MaxFrame resolve os pacotes listados no PyPI e os agrupa no ambiente do job.
Nas execuções subsequentes, caso o resultado do empacotamento já esteja em cache, o MaxFrame ignora o reempacotamento.
O empacotamento é acionado na primeira execução. Se o cache for limpo (recursos temporários são excluídos diariamente quando force_rebuild=False ), o MaxFrame reempacota automaticamente na próxima execução, o que aumenta a latência.
Declarar dependências com with_python_requirements
O decorador with_python_requirements é o ponto de entrada para o serviço de empacotamento automático.
def with_python_requirements(
*requirements: str,
force_rebuild: bool = False,
prefer_binary: bool = False,
pre_release: bool = False,
): ...
Parâmetros
requirements (obrigatório)
Um ou mais especificadores de pacotes de dependência, seguindo a sintaxe da PEP 508 — o mesmo formato usado pelo pip.
@with_python_requirements("scikit_learn>1.0", "xgboost>1.0")
force_rebuild (opcional, padrão: False)
Controla se o MaxFrame deve reempacotar dependências que já estão em cache.
|
Valor |
Comportamento |
|
|
Ignora o reempacotamento se existir um resultado em cache. O pacote em cache é armazenado como um recurso temporário e excluído diariamente. |
|
|
Sempre reempacota usando a versão mais recente da imagem do PyPI. O resultado é armazenado como um recurso de longo prazo e não é excluído automaticamente. |
Para desenvolvimento e testes iterativos, mantenha o valor padrão False. Utilize force_rebuild=True quando desejar forçar uma atualização para a versão mais recente do pacote e armazenar o resultado como um recurso de longo prazo.
Com force_rebuild=False , o recurso temporário é excluído diariamente. Caso o cache seja limpo entre as execuções, o MaxFrame reempacota automaticamente, aumentando a latência da próxima execução.
prefer_binary (opcional, padrão: False)
Defina se o MaxFrame deve priorizar arquivos wheel binários pré-compilados em vez de distribuições de source.
|
Valor |
Comportamento |
|
|
Sem preferência; o pip resolve a melhor correspondência normalmente. |
|
|
Prioriza wheels binários, equivalente a passar |
Priorizar wheels binários pode acelerar o empacotamento, mas a versão selecionada pode não ser a release mais recente.
pre_release (opcional, padrão: False)
Determina se versões de pré-release (alfa ou beta) dos pacotes são elegíveis para empacotamento.
|
Valor |
Comportamento |
|
|
Apenas releases estáveis são empacotadas. |
|
|
Releases alfa e beta são incluídas. |
Exemplo
O exemplo abaixo utiliza with_python_requirements para injetar jieba, cloudpickle e pandas em um job apply de DataFrame.
import os
import maxframe.dataframe as md
from maxframe import new_session
from maxframe.udf import with_python_requirements
from odps import ODPS
# Initialize the ODPS client.
# Load credentials from environment variables — avoid hardcoding AccessKey ID
# and AccessKey secret in your code.
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='your-default-project',
endpoint='your-end-point',
)
session = new_session(o)
data = [["abcd"], ["efgh"], ["ijkl"], ["mno"]]
md_df = md.DataFrame(data, columns=["col1"])
# Declare dependencies. MaxFrame packages them automatically at runtime.
@with_python_requirements("jieba==0.40 cloudpickle pandas")
def process(row):
import jieba
row["col1"] = row["col1"] + "_" + jieba.__version__
return row
md_result = (
md_df.apply(
process,
axis=1,
result_type="expand",
output_type="dataframe",
dtypes=md_df.dtypes.copy(),
)
.execute()
.fetch()
)
Substitua os seguintes placeholders pelos seus valores reais:
|
Placeholder |
Descrição |
|
|
Nome do seu projeto no MaxCompute |
|
|
Seu endpoint do MaxCompute |
FAQ
Quando ocorre o empacotamento?
O empacotamento é acionado no início da primeira execução do job. Se o resultado do empacotamento já estiver em cache, o MaxFrame ignora o reempacotamento e o job inicia imediatamente.
O que acontece se o pacote em cache for excluído antes da minha próxima execução?
Com force_rebuild=False, o pacote em cache é armazenado como um recurso temporário e excluído diariamente. Caso seja excluído antes da próxima execução, o MaxFrame reempacota automaticamente. Isso aumenta a latência dessa execução específica, mas não causa falha no job.
Como garantir que as versões mais recentes dos pacotes sejam usadas nas diferentes execuções?
Defina force_rebuild=True. O MaxFrame reempacota usando a versão mais recente da imagem do PyPI e armazena o resultado como um recurso de longo prazo, que não é excluído automaticamente.