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¶
L’erreur suivante se produit lorsque le nombre total de déléments 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 continuer à créer de nouveaux notebooks ; cependant, Snowflake recommande de retirer les notebooks qui ne sont plus utilisés par le compte.
Conflit de paquets snowflake.core¶
Pour utiliser des APIs Python Snowpark, utilisez snowflake.core
à partir du sélecteur de paquets. Si vous ajoutez à la fois snowflake.core
et snowflake
, mais que vous les placez dans des versions différentes, une erreur de conflit de paquets est renvoyée.
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.
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
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. Si votre notebook se déconnecte de manière imprévue avant le délai d’expiration d’1 heure, cela s’explique peut-être par le fait que votre ACCOUNTADMIN ou le propriétaire de l’entrepôt a défini le paramètre STATEMENT_TIMEOUT_IN_SECONDS sur une valeur spécifique (par exemple, 5 minutes), ce qui limite la durée pendant laquelle toutes les instructions peuvent s’exécuter sur l’entrepôt, y compris les sessions de 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 permettre au notebook de fonctionner plus longtemps, vous pouvez utiliser l’entrepôt par défaut SYSTEM$STREAMLIT_NOTEBOOK$WAREHOUSE ou régler le paramètre STATEMENT_TIMEOUT_IN_SECONDS sur une durée supérieure.
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’autorisations de votre réseau et que sa connexion à Snowflake est possible. 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.
Aucun entrepôt actif sélectionné¶
Pour résoudre cette erreur, indiquez un entrepôt pour la session à l’aide de la commande USE WAREHOUSE ou sélectionnez un entrepôt dans votre notebook. Pour savoir comment sélectionner un entrepôt pour votre notebook, consultez Recommandations de l’entrepôt pour l’utilisation de Snowflake Notebooks.
En outre, vous verrez cette erreur si vous utilisez un rôle qui n’a pas les privilèges nécessaires pour accéder à l’entrepôt, à la base de données ou au schéma utilisé par le notebook. Vous devez passer à un rôle qui a accès à ces ressources, afin de pouvoir poursuivre votre travail.
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, l’étape suivante consiste à ouvrir le sélecteur de paquets et à vérifier si tous les paquets installés sont toujours 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¶
Voici l’avertissement que vous recevez lorsque vous essayez d’utiliser 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.
Le code suivant définit la variable MPLCONFIGDIR
en /tmp/
pour résoudre cet avertissement :
import os
os.environ["MPLCONFIGDIR"] = '/tmp/'
import matplotlib.pyplot as plt
Exemple Huggingface¶
Voici l’avertissement renvoyé lorsque vous essayez d’utiliser 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")
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
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é.
data = session.table("BIG_TABLE")
df = data.to_pandas() # This may lead to memory error
En général, pour les jeux de données volumineux, Snowflake recommande d’éviter d’utiliser df.to_pandas()
. Au lieu de cela, pour exploiter vos données avec Pandas, utilisez l’API Pandas Snowpark. L”API Pandas Snowpark vous permet d’exécuter votre code Pandas directement sur vos données dans Snowflake avec le calcul pushdown vers SQL, afin que vous ne soyez pas contraint(e) de travailler uniquement sur les données qui tiennent dans la mémoire.
L’exemple ci-dessous montre comment 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()
Pour plus de détails, voir Pandas Snowpark dans les notebooks.