Solução de erros nos Snowflake Notebooks

Os cenários a seguir podem ajudar você a solucionar problemas que podem ocorrer ao usar os Snowflake Notebooks.

O número total de notebooks excede o limite

O seguinte erro ocorre quando o número total de notebooks em sua conta excede 6.000 e você atualiza a lista de Notebooks:

Result size for streamlit list exceeded the limit. Streamlit list was truncated.

Os usuários ainda podem criar novos notebooks; no entanto, a Snowflake recomenda que você remova os notebooks que não estão mais sendo usados pela conta.

Conflito de pacote snowflake.core

Para usar as APIs do Snowpark Python, use snowflake.core do seletor de pacotes. Se você adicionar snowflake.core e snowflake, mas colocá-los em versões diferentes, um erro de conflito de pacote será retornado.

Erro de Notebooks (tempo de execução de warehouse) ao atualizar um pacote

A Snowflake tornou obsoleto o pacote snowflake-ml antigo, que não é mais compatível. Ele foi removido do seletor de pacotes e não está disponível no canal Snowflake Anaconda. Se você estiver usando snowflake-ml e tentar adicionar, remover ou atualizar pacotes em seus notebooks, esses notebooks falharão porque snowflake-ml não estará mais acessível.

Para evitar problemas, mude para o snowflake-ml-python, que é o pacote correto para o Snowflake ML.

AttributeError: NoneType

O seguinte erro ocorre quando uma célula é renomeada com o mesmo nome de uma variável existente no notebook:

AttributeError: ‘NoneType’ object has no attribute ‘sql’

Por exemplo, você tem o seguinte em uma célula Python chamada cell1:

session = get_active_session() #establishing a Snowpark session
Copy

Se você renomear cell2 para “sessão” e referenciar “sessão” na cell3, o Notebooks tentará referenciar “sessão” (o nome da célula), e não a sessão do Snowpark, causando um erro.

Desconexão precoce

A sessão do notebook é executada como um procedimento armazenado. Se o seu notebook for desconectado inesperadamente antes do tempo limite de 1 hora, seu ACCOUNTADMIN ou o proprietário do warehouse pode ter definido o parâmetro STATEMENT_TIMEOUT_IN_SECONDS como um valor específico (por exemplo, 5 minutos), o que limita o tempo que todas as instruções podem ser executadas no warehouse, incluindo sessões do notebook. Esse parâmetro é definido no nível do warehouse ou da conta e, quando definido para um warehouse e uma sessão, o menor valor diferente de zero é aplicado. Para permitir que o notebook seja executado por mais tempo, você pode usar o warehouse padrão SYSTEM$STREAMLIT_NOTEBOOK$WAREHOUSE ou alterar o parâmetro STATEMENT_TIMEOUT_IN_SECONDS para uma duração maior.

Falha ao conectar devido ao firewall

O seguinte pop-up ocorre quando você tenta iniciar seu notebook:

Something went wrong. Unable to connect. A firewall or ad blocker might be preventing you from connecting.

Certifique-se de que *.snowflake.app esteja na lista de permissões da sua rede e possa se conectar ao Snowflake. Quando este domínio está na lista de permissões, seus aplicativos podem se comunicar com os servidores Snowflake sem quaisquer restrições.

Além disso, para evitar problemas de conexão com o backend do Snowflake, certifique-se de que os WebSockets não estão bloqueados na sua configuração de rede.

Nenhum warehouse ativo selecionado

Para resolver esse erro, especifique um warehouse para a sessão com o comando USE WAREHOUSE ou selecione um warehouse em seu notebook. Para obter etapas sobre como selecionar um warehouse para seu notebook, consulte Recomendações de warehouse para execução dos notebooks Snowflake.

Além disso, você verá esse erro se estiver usando uma função sem privilégios para acessar o warehouse, banco de dados ou esquema que o notebook está usando. Você precisa mudar para uma função que tenha acesso a esses recursos para poder continuar seu trabalho.

Pacotes ausentes

A seguinte mensagem é exibida em uma saída de célula se você estiver tentando usar um pacote que não está instalado em seu ambiente de notebook:

ModuleNotFoundError: Line 2: Module Not Found: snowflake.core. To import packages from Anaconda, install them first using the package
selector at the top of the page.

Importe o pacote necessário seguindo as instruções na página Importação de pacotes Python para uso em notebooks.

Pacote ausente do notebook existente

Novas versões de notebooks são lançadas continuamente e os notebooks são atualizados automaticamente para a versão mais recente. Às vezes, ao atualizar um notebook antigo, os pacotes no ambiente de notebook não são compatíveis com a atualização. Isso pode fazer com que o notebook não inicie.

A seguir está um exemplo de uma mensagem de erro quando o pacote Libpython está ausente:

SnowflakeInternalException{signature=std::vector<sf::RuntimePathLinkage> sf::{anonymous}::buildRuntimeFileSet(const sf::UdfRuntime&, std::string_view, const std::vector<sf::udf::ThirdPartyLibrariesInfo>&, bool):"libpython_missing", internalMsg=[XP_WORKER_FAILURE: Unexpected error signaled by function 'std::vector<sf::RuntimePathLinkage> sf::{anonymous}::buildRuntimeFileSet(const sf::UdfRuntime&, std::string_view, const std::vector<sf::udf::ThirdPartyLibrariesInfo>&, bool)'
Assert "libpython_missing"[{"function": "std::vector<sf::RuntimePathLinkage> sf::{anonymous}::buildRuntimeFileSet(const sf::UdfRuntime&, std::string_view, const std::vector<sf::udf::ThirdPartyLibrariesInfo>&, bool)", "line": 1307, "stack frame ptr": "0xf2ff65553120",  "libPythonOnHost": "/opt/sfc/deployments/prod1/ExecPlatform/cache/directory_cache/server_2921757878/v3/python_udf_libs/.data/4e8f2a35e2a60eb4cce3538d6f794bd7881d238d64b1b3e28c72c0f3d58843f0/lib/libpython3.9.so.1.0"}]], userMsg=Processing aborted due to error 300010:791225565; incident 9770775., reporter=unknown, dumpFile= file://, isAborting=true, isVerbose=false}

Para resolver esse erro, tente as seguintes etapas:

  • Atualize a página da Web e inicie o notebook novamente.

  • Se o problema persistir, o próximo passo é abrir o seletor de pacotes e verificar se todos os pacotes instalados ainda são válidos. No menu suspenso de cada pacote, você pode ver as versões disponíveis. Selecionar a versão mais recente do pacote geralmente resolve o erro.

Problema no sistema de arquivos somente leitura

Algumas bibliotecas Python baixam ou armazenam em cache dados em um diretório de usuário local. No entanto, o diretório de usuário padrão /home/udf é somente leitura. Para contornar isso, defina o caminho como /tmp, que é um local gravável. Observe que a variável de ambiente usada para definir o diretório de gravação pode variar dependendo da biblioteca que você está usando. A seguir está uma lista de bibliotecas conhecidas que apresentam esse problema:

  • Matplotlib

  • HuggingFace

  • CatBoost

Exemplo de Matplotlib

A seguir está o aviso que você recebe ao tentar usar Matplotlib:

Matplotlib created a temporary cache directory at /tmp/matplotlib-2fk8582w because the default path (/home/udf/.config/matplotlib) is
not a writable directory; it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular
to speed up the import of Matplotlib and to better support multiprocessing.

O código a seguir define a variável MPLCONFIGDIR para /tmp/ para resolver este aviso:

import os
os.environ["MPLCONFIGDIR"] = '/tmp/'
import matplotlib.pyplot as plt
Copy

Exemplo de Hugging Face

A seguir está o aviso retornado quando você tenta usar o Hugging Face:

Readonly file system: `/home/udf/.cache`

O código a seguir define as variáveis HF_HOME e SENTENCE_TRANSFORMERS_HOME para /tmp/ para se livrar deste erro:

import os
os.environ['HF_HOME'] = '/tmp'
os.environ['SENTENCE_TRANSFORMERS_HOME'] = '/tmp'

from sentence_transformers import SentenceTransformer
model = SentenceTransformer("Snowflake/snowflake-arctic-embed-xs")
Copy

A mensagem de saída é muito grande ao usar df.collect()

A seguinte mensagem é exibida na saída da célula quando você executa df.collect():

MessageSizeError: Data of size 522.0 MB exceeds the message size limit of 200.0 MB.
This is often caused by a large chart or dataframe. Please decrease the amount of data sent to the browser,
or increase the limit by setting the config option server.maxMessageSize.
Click here to learn more about config options.
Note that increasing the limit may lead to long loading times and large memory consumption of the client's browser and the Streamlit server.

Snowflake Notebooks trunca automaticamente os resultados na saída da célula para grandes conjuntos de dados nos seguintes casos:

  • Todos os resultados de células SQL.

  • Resultados de células Python se for um snowpark.Dataframe.

O problema com a célula acima é que df.collect() retorna List em vez de snowpark.Dataframe. As listas não são truncadas automaticamente. Para contornar esse problema, emita diretamente os resultados do DataFrame.

df
Copy

Notebook trava ao usar df.to_pandas() no Snowpark DataFrames

Ao executar df.to_pandas(), todos os dados são carregados na memória e podem resultar no encerramento da sessão do Notebook se o tamanho dos dados exceder o limite de memória do warehouse do Notebook associado.

data = session.table("BIG_TABLE")
df = data.to_pandas() # This may lead to memory error
Copy

Em geral, para grandes conjuntos de dados, a Snowflake recomenda evitar o uso de df.to_pandas(). Em vez disso, para operar seus dados com o Pandas, use a API Snowpark pandas. A API Snowpark pandas permite que você execute seu código pandas diretamente em seus dados no Snowflake com o cálculo reduzido para SQL, para que você não fique restrito a trabalhar apenas em dados que cabem na memória.

O exemplo abaixo mostra como você pode reescrever o código para ler na tabela com o Snowpark pandas.

# Import Snowpark pandas
import modin.pandas as pd
import snowflake.snowpark.modin.plugin
# Create a Snowpark pandas DataFrame from BIG_TABLE
df = pd.read_snowflake("BIG_TABLE")
# Keep working with your data using the pandas API
df.dropna()
Copy

Para mais detalhes, consulte Snowpark pandas em notebooks.