Criação de perfil dos manipuladores de procedimentos armazenados do Snowpark Python

Você pode descobrir quanto tempo ou memória foi gasto na execução do código do manipulador usando o criador de perfil do código integrado. O criador de perfil gera informações que descrevem quanto tempo ou memória foi gasto na execução de cada linha do manipulador de procedimento.

Usando o criador de perfil, você pode gerar relatórios que se concentram em um dos seguintes itens de cada vez:

  • Quantidade de tempo por linha, no qual o relatório mostra o número de vezes que uma linha foi executada, quanto tempo levou a execução e assim por diante.

  • Quantidade de uso de memória por linha, no qual o relatório mostra a quantidade de memória consumida por linha.

O criador de perfil salva o relatório gerado no estágio de usuário interno do Snowflake que você especificar. Você pode ler a saída do criador de perfil usando a função StoredProcedureProfiler.get_output.

Nota

A criação de perfil introduz uma sobrecarga de desempenho na execução do Python e pode afetar o desempenho da consulta. Ele se destina a desenvolvimento e testes e não deve ser ativado em cargas de trabalho de produção contínua.

Privilégios obrigatórios

Quando um procedimento armazenado é executado depois que a função StoredProcedureProfiler.set_active_profiler é chamada, o Snowflake verifica os seguintes privilégios para o usuário que está executando o procedimento:

Limitações

  • Somente procedimentos armazenados são suportados. O suporte para UDFs ainda não está disponível.

  • Não há suporte para criação de perfil recursiva. Somente as funções de nível superior dos módulos especificados são analisadas, enquanto as funções definidas dentro das funções não são.

  • Não há suporte para a criação de perfis de procedimentos armazenados criados no lado do cliente por meio do snowflake.snowpark API.

  • As funções Python executadas em paralelo por meio do joblib não são analisadas.

  • Os procedimentos armazenados definidos pelo sistema não podem ser analisados. Elas não produzem nenhum resultado.

  • A API da criação de perfil deve ser usada no mesmo thread do qual o procedimento foi chamado.

Uso

Depois de configurar o criador de perfil para uso, você pode usá-lo simplesmente chamando o procedimento armazenado para gerar a saída do criador de perfil. Depois que o procedimento termina de ser executado, a saída do criador de perfil é gravada em um arquivo no estágio que você especificar. Você pode obter a saída do criador de perfil usando uma função do sistema, conforme descrito abaixo.

Siga estas etapas em seu código para configurar e usar o criador de perfil:

  1. Adquira um objeto de criador de perfil do objeto Session.

  2. Especifique o estágio do Snowflake em que a saída do perfil deve ser gravada.

  3. Ative o criador de perfil e defina em que o relatório de perfil deve se concentrar.

  4. Chame o procedimento armazenado.

  5. Visualize a saída de criação de perfil.

Adquira o objeto do criador de perfil

No Python, crie uma variável do tipo StoredProcedureProfiler para configurar e executar o criador de perfil.

# Create your sesssion
session = Session.builder.configs(CONNECTION_PARAMETERS).create()

# Acquire profiler object
profiler = session.stored_procedure_profiler()
Copy

Especifique o estágio do Snowflake em que a saída do perfil deve ser gravada

Antes de executar o criador de perfil, você deve especificar um estágio no qual salvar a saída. Para especificar o estágio, chame StoredProcedureProfiler.set_target_stage, especificando o nome totalmente qualificado de um estágio interno do Snowflake no qual o relatório deve ser gravado.

Tenha em mente o seguinte:

  • O nome do estágio deve ser um nome totalmente qualificado.

  • Se o estágio que você colocou nessa função não existir, o Snowflake criará um estágio temporário com esse nome.

  • Se você quiser preservar a saída do criador de perfil fora do escopo da sessão, crie um estágio permanente antes de executar set_target_stage e especifique o nome desse estágio permanente na chamada de função.

  • Se você não definir um estágio de destino com set_target_stage, o Snowflake definirá o estágio temporário da sessão atual como o estágio de destino. Para descobrir esse estágio temporário, chame Session.get_session_stage.

O código no exemplo a seguir cria um estágio temporário de profiler_output para receber a saída do criador de perfil.

profiler.set_target_stage("mydb.myschema.profiler_output")
Copy

Como habilitar o criador de perfil especificando seu foco

Use a função StoredProcedureProfiler.set_active_profiler, especificando um valor que indique o tipo de relatório de perfil que você deseja gerar.

  • Para que o criador de perfil relate a atividade de uso da linha, defina o parâmetro como o valor LINE (não diferencia maiúsculas de minúsculas), conforme mostrado abaixo:

    profiler.set_active_profiler("LINE")
    
    Copy
  • Para que o criador de perfil relate a atividade de uso da memória, defina o parâmetro como o valor MEMORY (não diferencia maiúsculas de minúsculas), conforme mostrado abaixo:

    profiler.set_active_profiler("MEMORY")
    
    Copy

Para desativar o criador de perfil, use a função StoredProcedureProfiler.disable.

Como chamar o procedimento armazenado

Depois que o criador de perfil estiver ativado, chame o procedimento armazenado.

session.call("my_stored_procedure")
Copy

Como exibir a saída de criação de perfil

No fim da execução, você pode acessar a saída usando a função StoredProcedureProfiler.get_output.

profiler.get_output()
Copy

Inclusão de módulos adicionais para criação de perfis

Ao criar perfis, você pode incluir módulos que não são incluídos por padrão.

Por padrão, os métodos definidos em seu módulo são com perfil. Esses métodos incluem os seguintes:

  • O método do manipulador

  • Métodos definidos no módulo

  • Métodos importados de pacotes ou outros módulos

Para incluir módulos adicionais para criação de perfil, use a função StoredProcedureProfiler.register_modules, especificando os módulos que você deseja incluir.

O código no exemplo a seguir registra os módulos módulo_A e módulo_B para criação de perfil.

profiler.register_modules(["module_A", "module_B"])
Copy

Para cancelar o registro de módulos registrados, use register_modules sem argumentos, como no exemplo a seguir.

profiler.register_modules()
Copy

Exemplo

Os exemplos a seguir ilustram como usar o criador de perfil para gerar e recuperar um relatório de uso de linha.

O código neste exemplo cria um procedimento profiler_test_proc.

CREATE OR REPLACE PROCEDURE profiler_test_proc()
RETURNS NUMBER
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'main'
AS
$$
from snowflake.snowpark.functions import col, udf

def main(session):
  df = session.sql("select 1")
  return df.collect()[0][0]
$$;
Copy

O código no exemplo a seguir configura um criador de perfil e, em seguida, cria o perfil do procedimento profiler_test_proc.

profiler = profiler_session.stored_procedure_profiler
profiler.register_modules(["profiler_test_proc"])
profiler.set_target_stage(
  f"{db_parameters['database']}.{db_parameters['schema']}.{tmp_stage_name}"
)

profiler.set_active_profiler("LINE")

profiler_session.call("profiler_test_proc")
res = profiler.get_output()
print(res)

profiler.disable()
profiler.register_modules([])
Copy

A saída do criador de perfil de linha gerada tem a seguinte aparência:

Handler Name: main
Python Runtime Version: 3.8
Modules Profiled: ['main_module']
Timer Unit: 0.001 s

Total Time: 0.0619571 s
File: _udf_code.py
Function: main at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           def main(session):
     5         1          0.4      0.4      0.6      df = session.sql("select 1")
     6         1         61.6     61.6     99.4      return df.collect()[0][0]