Dépanner les erreurs de Snowflake Notebooks

Les scénarios suivants peuvent vous aider à résoudre les problèmes qui peuvent survenir lors de l’utilisation de Snowflake Notebooks.

Le nombre total de notebooks dépasse la limite de l”Snowsight

L’erreur suivante se produit lorsque le nombre total de notebooks dans votre compte dépasse 6 000 et que vous actualisez la liste Notebooks :

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

Les utilisateurs peuvent toujours créer de nouveaux notebooks ; cependant, Snowflake vous recommande de supprimer les notebooks qui ne sont plus utilisés par le compte.

Erreur (de runtime d’entrepôt) Notebooks lors de la mise à jour d’un paquet

Snowflake a rendu obsolète le paquet snowflake-ml plus ancien, qui n’est plus pris en charge. Il a été retiré du sélecteur de paquets et n’est pas disponible sur le canal Anaconda Snowflake. Si vous utilisez snowflake-ml et si vous tentez d’ajouter, de retirer ou de mettre à jour des paquets dans vos notebooks, ces notebooks échoueront, car snowflake-ml n’est plus accessible.

Pour éviter les problèmes, passez à snowflake-ml-python, qui est le paquet correct pour Snowflake ML.

Erreur Plotly

st.plotly_chart(fig, render_mode='svg')

WebGL is not supported by your browser - visit https://get.webgl.org for more info.

Plotly passera à webgl s’il y a plus de 1 000 points de données.

AttributeError : NoneType

L’erreur suivante se produit lorsqu’une cellule est renommée à l’aide du même nom que celui d’une variable existante dans le notebook :

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

Par exemple, vous avez ce qui suit dans une cellule Python appelée cell1 :

session = get_active_session() #establishing a Snowpark session
Copy

Si vous renommez ensuite cell2 en lui donnant le nom « session » et si vous référencez « session » dans cell3, Notebooks tente de référencer « session » (le nom de la cellule) et non la session Snowpark, ce qui provoque une erreur.

Déconnexion précoce

La session de notebook s’exécute sous forme de procédure stockée. Le délai d’expiration est de 30 minutes pour l’environnement d’exécution de l’entrepôt et de 60 minutes pour l’environnement d’exécution du conteneur. Si votre notebook se déconnecte inopinément avant le délai d’expiration, il se peut que votre ACCOUNTADMIN ou le propriétaire de l’entrepôt ait défini le paramètre STATEMENT_TIMEOUT_IN_SECONDS sur une valeur particulière (par exemple, 5 minutes), ce qui limite la durée d’exécution de toutes les instructions sur l’entrepôt, y compris les sessions du notebook. Ce paramètre est défini au niveau de l’entrepôt ou du compte et lorsqu’il est défini à la fois pour un entrepôt et une session, la valeur la plus basse différente de zéro est appliquée.

Pour plus de détails sur le paramètre du temps d’inactivité, voir Temps d’inactivité et reconnexion.

Échec de la reconnexion

Si les cookies ne sont pas activés dans votre navigateur, vous ne pouvez pas vous reconnecter automatiquement à la session du notebook alors qu’elle devrait encore être active (avant d’être interrompue pour cause d’inactivité). Lorsque vous rouvrez le notebook, un message d’erreur s’affiche :

Notebook connection lost and cannot reconnect. Restart or end session.

Le redémarrage de la session met fin à la requête EXECUTE NOTEBOOK en cours et démarre une nouvelle session. La clôture de la session met fin à la requête en cours sur le site EXECUTE NOTEBOOK.

Si vous ne prenez aucune de ces actions, la requête EXECUTE NOTEBOOK en cours continuera à s’exécuter sur l’entrepôt, comme le montre l’illustration suivante : Query History.

Impossible de se connecter en raison d’un pare-feu

La fenêtre suivante apparaît lorsque vous essayez de démarrer votre notebook :

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

Assurez-vous que *.snowflake.app figure sur la liste d’autorisation de votre réseau, y compris des systèmes de filtrage de contenu, et qu’il peut se connecter à Snowflake. Lorsque ce domaine est sur la liste d’autorisations, vos applications peuvent communiquer avec les serveurs Snowflake sans aucune restriction.

De plus, pour éviter tout problème de connexion au backend Snowflake, assurez-vous que les WebSockets ne sont pas bloqués dans votre configuration réseau.

Paquets manquants

Le message suivant apparaît dans une sortie de cellule si vous essayez d’utiliser un paquet qui n’est pas installé dans l’environnement de votre 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.

Importez le paquet nécessaire en suivant les instructions à la page Importer des paquets Python pour les utiliser dans les notebooks.

Paquet manquant dans un notebook existant

De nouvelles versions des notebooks sont continuellement publiées et les notebooks sont automatiquement mis à niveau vers la dernière version. Parfois, lors de la mise à niveau d’un ancien notebook, les paquets de l’environnement du notebook ne sont pas compatibles avec la mise à niveau. Cela peut entraîner l’échec du démarrage du notebook.

Voici un exemple de message d’erreur lorsque le paquet Libpython est manquant :

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}

Pour résoudre cette erreur, procédez comme suit :

  • Actualisez la page Web et recommencez le notebook.

  • Si le problème persiste, ouvrez le sélecteur de paquets et vérifiez que tous les paquets installés sont valides. Dans le menu déroulant de chaque paquet, vous pouvez voir les versions disponibles. La sélection de la dernière version du paquet fait généralement disparaître l’erreur.

Problème de système de fichiers en lecture seule

Certaines bibliothèques Python téléchargent ou mettent en cache des données dans un répertoire utilisateur local. Cependant, le répertoire utilisateur par défaut /home/udf est en lecture seule. Pour contourner ce problème, définissez le chemin sur /tmp, qui est un emplacement accessible en écriture. Notez que la variable d’environnement utilisée pour définir le répertoire d’écriture peut varier en fonction de la bibliothèque que vous utilisez. Vous trouverez ci-dessous une liste des bibliothèques connues qui présentent ce problème :

  • matplotlib

  • HuggingFace

  • catboost

exemple matplotlib

Vous pouvez voir cet avertissement lorsque vous utilisez 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.

Résolvez cet avertissement à l’aide du code suivant, qui donne à la variable MPLCONFIGDIR la valeur /tmp/ :

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

Exemple Huggingface

Il se peut que vous voyiez cet avertissement lorsque vous utilisez Huggingface :

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

Le code suivant définit les variables HF_HOME et SENTENCE_TRANSFORMERS_HOME à /tmp/ pour se départir de cette erreur :

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

Le message de sortie est trop volumineux lorsque vous utilisez df.collect()

Le message suivant s’affiche dans la sortie de la cellule lorsque vous exécutez 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.

Les Snowflake Notebooks tronquent automatiquement les résultats dans la sortie de la cellule pour les grands ensembles de données dans les cas suivants :

  • Tous les résultats de la cellule SQL.

  • Résultats de la cellule Python s’il s’agit d’un snowpark.Dataframe.

Le problème avec la cellule ci-dessus est que df.collect() renvoie une List au lieu d’un snowpark.Dataframe. Les listes ne sont pas automatiquement tronquées. Pour contourner ce problème, envoyez directement les résultats du DataFrame.

df
Copy

Le notebook plante lors de l’utilisation de df.to_pandas() sur des DataFrames Snowpark

Lors de l’exécution de df.to_pandas(), toutes les données sont chargées en mémoire et peuvent entraîner la fin de la session du notebook si la taille des données dépasse la limite de mémoire de l’entrepôt de notebook associé.

Exemple 1 : Exporter une table Snowpark vers un DataFrame Pandas

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

Solution pour l’exemple 1

L’exemple suivant montre comment vous pouvez réécrire le code pour lire la table avec Pandas Snowpark.

# 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

Exemple 2 : Référencer une cellule SQL contenant de grands résultats

Si vous avez le code suivant dans une cellule SQL appelée cell1, le résultat de la sortie est 500 M de lignes.

SELECT * from BIG_TABLE
Copy

Ensuite, lorsque vous récupérez les résultats dans un DataFrame Pandas, le notebook se bloque car les données sont trop volumineuses pour tenir dans la mémoire :

df = cell1.to_pandas() # This may lead to memory error
Copy

En général, pour les grands ensembles de données, Snowflake recommande d’éviter d’utiliser df.to_pandas(). Au lieu de cela, pour opérer sur vos données avec Pandas, utilisez l’API Pandas Snowpark et un entrepôt optimisé pour Snowpark. L’API Pandas Snowpark vous permet d’exécuter votre code Pandas directement sur vos données dans Snowflake avec la requête effectuée dans SQL. Cela vous permet d’exécuter du code Pandas sur des données qui ne tiennent pas dans la mémoire du notebook.

Solution pour l’exemple 2

Dans le deuxième exemple de référencement de cellule ci-dessus, vous pouvez d’abord convertir le résultat de votre cellule SQL en une cellule DataFrame Snowpark. Vous pouvez ensuite les convertir dans Pandas Snowpark.

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
Copy

Pour plus de détails, voir pandas on Snowflake dans les notebooks.

Impossible de se connecter en raison du fractionnement de tunnel VPN

Si votre VPN est configuré pour utiliser le fractionnement de tunnel, vous devez ajouter *.snowflake.com et *.snowflake.app à la liste d’autorisations de votre politique réseau.