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 no Snowsight¶
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.
Erro de Notebooks (Warehouse Runtime) 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.
Erro do Plotly¶
st.plotly_chart(fig, render_mode='svg')
WebGL is not supported by your browser - visit https://get.webgl.org for more info.
O Plotly mudará para WebGL se houver mais de 1.000 pontos de dados.
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
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. O tempo limite é de 30 minutos no Warehouse Runtime e de 60 minutos no Container Runtime. Se o notebook se desconectar inesperadamente antes do tempo limite, o 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 de execução de todas as instruções no warehouse, inclusive as sessões do notebook. Esse parâmetro é definido no nível do warehouse ou da conta e, quando é definido para ambos, 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.
Para obter detalhes sobre a configuração de tempo ocioso, consulte Tempo ocioso e reconexão.
Falha ao reconectar¶
Se os cookies não estiverem ativados no navegador, o usuário não poderá se reconectar automaticamente à sessão do notebook enquanto ela ainda estiver ativa (antes de atingir o tempo limite devido à inatividade). Ao reabrir o notebook, é exibida uma mensagem de erro:
Notebook connection lost and cannot reconnect. Restart or end session.
Reiniciar a sessão encerrará a consulta atual em EXECUTE NOTEBOOK e iniciará uma nova sessão. O término da sessão encerrará a consulta atual em EXECUTE NOTEBOOK.
Se você não tomar nenhuma dessas ações, a consulta EXECUTE NOTEBOOK atual continuará sendo executada no warehouse, conforme mostrado em Query History.
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
e *.snowflake.com
estejam na lista de permissões da sua rede (incluindo sistemas de filtragem de conteúdo) e que possam se conectar ao Snowflake. Quando esses domínios estão na lista de permissões, seus aplicativos podem se comunicar com os servidores do Snowflake sem nenhuma restrição. No entanto, em alguns casos, adicionar esses domínios pode não ser suficiente devido a políticas de rede que bloqueiam subcaminhos deles. Se isso ocorrer, entre em contato com o administrador da rede.
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.
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, abra o seletor de pacotes e verifique se todos os pacotes instalados são válidos. No menu suspenso de cada pacote, é possível 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¶
É possível ver esse aviso ao usar o 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.
Resolva esse aviso usando este código, que define a variável MPLCONFIGDIR
como /tmp/
:
import os
os.environ["MPLCONFIGDIR"] = '/tmp/'
import matplotlib.pyplot as plt
Exemplo de Hugging Face¶
É possível ver esse aviso ao 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")
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
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.
Exemplo 1: exportação de uma tabela do Snowpark para o DataFrame pandas¶
data = session.table("BIG_TABLE")
df = data.to_pandas() # This may lead to memory error
Solução alternativa para o exemplo 1¶
O exemplo a seguir mostra como é possível reescrever o código para ler a 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()
Exemplo 2: referência a uma célula SQL que contém resultados grandes¶
Se você tiver o seguinte código em uma célula SQL nomeada cell1
, o resultado de saída será 500 milhões de linhas.
SELECT * from BIG_TABLE
Portanto, ao buscar os resultados em um DataFrame pandas, o notebook trava porque os dados são muito grandes para caber na memória:
df = cell1.to_pandas() # This may lead to memory error
Em geral, para grandes conjuntos de dados, o Snowflake recomenda que você evite usar df.to_pandas()
. Em vez disso, para operar em seus dados com pandas, use a Snowpark pandas API e um warehouse otimizado para o Snowpark. A Snowpark pandas API permite que você execute seu código pandas diretamente nos dados Snowflake com a consulta realizada em SQL. Isso permite executar o código do pandas em dados que não cabem na memória do notebook.
Solução alternativa para o exemplo 2¶
No segundo exemplo de referência de célula acima, é possível converter o resultado da célula SQL em um DataFrame Snowpark primeiro. Em seguida, é possível convertê-lo em Snowpark pandas.
SELECT * from BIG_TABLE
snowpark_df = cell1.to_df()
df = snowpark_df.to_snowpark_pandas()
# Keep working with your data using the Snowpark pandas API
Para obter mais detalhes, consulte pandas on Snowflake em notebooks.
Não é possível se conectar devido ao tunelamento dividido de VPN¶
Se a VPN estiver configurada para usar o tunelamento dividido, é necessário adicionar *.snowflake.com
e *.snowflake.app
à lista de permissões de política de redes.
Conflito de versão de pacote¶
Se você executar um notebook não interativo que carrega uma versão de pacote da imagem de base e, em seguida, tentar instalar uma nova versão, a nova versão não será carregada. Certifique-se de que a versão do pacote corresponda à imagem de base. Em um notebook interativo, você será solicitado a reiniciar o notebook para usar a nova versão.
Notebook SPCS agendado não consegue ser executado¶
Antes de executar um notebook agendado no Container Runtime, você deve criar um repositório de imagens. Se não houver um repositório de imagens, será exibido o seguinte erro:
Failed to retrieve image.
Para obter detalhes sobre como criar um repositório de imagens, consulte CREATE IMAGE REPOSITORY.
Mensagens de log que não aparecem na saída¶
Se as mensagens de log não estiverem aparecendo na saída do notebook, certifique-se de que os logs sejam direcionados para stdout
. Aqui está um exemplo de como configurar o registro em log corretamente:
import logging
import sys
# Create a logger
logger = logging.getLogger()
# Set the log level
logger.setLevel(logging.DEBUG)
# Create a stream handler that writes to sys.stdout
stdout_handler = logging.StreamHandler(sys.stdout)
# Set the log format (optional)
formatter = logging.Formatter('%(levelname)s: %(message)s')
stdout_handler.setFormatter(formatter)
# Add the handler to the logger
logger.addHandler(stdout_handler)
# Test the logging output
logger.warning("This is a warning message.")
Para destacar erros, você pode enviá-los para stderr
usando uma abordagem semelhante. Como alternativa, se estiver trabalhando com o Streamlit no Snowflake Notebooks, você pode usar as funções internas para obter uma formatação mais clara:
import streamlit as st st.warning("This is a warning message.")
st.write("This is a normal message.")
st.error("This is an error message.")
Não é possível executar o notebook¶
Quando você cria um notebook usando CREATE NOTEBOOK, o notebook não tem automaticamente uma versão ativa no estágio de versão. Se você tentar executar um notebook usando o EXECUTE NOTEBOOK sem antes definir uma versão ativa, ou se criar um notebook e ele for descartado, ocorrerá o seguinte erro:
Live version is not found.
Para resolver esse erro, use o seguinte comando para definir a versão ativa inicial:
ALTER NOTEBOOK <name> ADD LIVE VERSION FROM LAST;