Utilisation des volumes de zones de préparation Snowflake avec des services

Snowflake supports various storage volume types for your application containers, including internal stage, local storage, memory storage, and block storage volumes. This section explains how to configure volumes and volume mounts for internal stages. A An internal stage volume is a volume configured to use a Snowflake stage as persistent storage.

With stage volumes your service can access an internal stage’s objects as if they are files on your file system, simplifying your service code compared to using a Snowflake driver and GET and PUT SQL commands to access these objects. Stage volumes can also perform better for scenarios with streaming reads or writes of large data files.

If you file system operations can easily be translated to streaming GET and PUT operations, then Stage volumes will work well for your scenario. If your application needs to rename or move files, modify existing files, or perform file system based locking, then stage volume is not a good fit for your workload.

Note

There are currently two implementations of stage volumes; a generally available version and a deprecated version. Snowflake recommends that you use the generally available version for new services and that you migrate your existing applications from the deprecated version.

The stage volume implementation streams file contents directly to and from cloud storage, ensuring that you always get the latest contents. Consider the following points when you use a stage volume:

  • A stage volume is optimized for large, sequential reads and writes, providing strong performance for these access patterns. For best results, read and write data in large, contiguous chunks.

  • Reads always return the latest data, which lets data sharing occur between services.

  • Random writes or file appends aren’t supported. Attempting these operations results in an error. Snowflake recommends that you use block storage volumes for these workloads.

Configure a Snowflake stage as a storage volume in a service specification

To create a service where service containers use a stage volume, you perform two steps to specify the required settings in the service specification:

  • Define a stage volume that identifies the Snowflake stage to use as storage volume.

  • Specify where to mount the stage volume in your application container.

Step 1: Define a stage volume

To define a stage volume, add the spec.volumes field in the service specification as shown in the following example. The example shows only the minimum required fields:

spec:
  containers:
    ..
  volumes:
  - name: <name>
    source: stage
    stageConfig:
       name: <stage_name>
Copy

The following list defines the fields from the example:

  • name: Provides the name of the volume.

  • source: Identifies the type of the volume (stage).

  • stageConfig.name: Identifies the Snowflake internal stage or folder on a stage to mount; for example @my_stage, @my_stage/folder, or @my_db.my_schema.my_stage/folder/nestedfolder. Double quotes must surround this value.

You can include the following optional fields in stageConfig:

  • stageConfig.resources field: The Snowflake component that provides the mounted stage volume requires CPU and memory resources. Use this field to specify these CPU and memory requirements, similar to the resource specifications for your application containers. For more information, see champ containers.resources fields. If this field isn’t specified, the following default resource settings apply:

    • resources.requests.cpu: 0

    • resources.requests.memory: 0.5Gi

    • resources.limits.cpu: 0.5

    • resources.limits.memory: 1Gi

    For most applications with typical data traffic to stage volumes, you don’t need to set this field, because the default resource settings should be sufficient. However, if your application performs a high volume of reads and writes, the default settings might lead to performance constraints or read/write failures. For more information, see Instructions communes pour les deux implémentations des volumes de zones de préparation.

    To avoid these problems, check the CPU and memory metrics for the container (stage-mount-v2-sidecar-<stage-volume-name>). Snowflake adds this container to your service that provides the implementation of the stage volume you configured. This lets you to see exactly what resources your stage volume is using and determine if it is constrained by CPU or memory. Use these metrics to update the CPU and memory limits as needed.

  • stageConfig.metadataCache field: If your application frequently retrieves file metadata or lists files on a Snowflake stage in a loop, and you don’t expect the data to change often, you can enable metadata caching for the Snowflake stage storage volume to significantly improve performance. The cache stores this metadata for a specified time period, after which it is cleared. If the application then tries to access the metadata, Snowflake refreshes the cache. Use the hours, minutes, and seconds units to specify the metadataCache. For example 90s, 5m, 1h, 1h30m, 1h30m45s. If not specified, there is no caching.

    Note

    Configure metadata caching only when the data in your Snowflake stage doesn’t change for service lifetime; for example, a service that has read-only workloads that need to work on a static set of data in the stage. Don’t configure metadata caching for workloads where data in your Snowflake stage is updated while the service is running.

The following spec.volumes field defines a Snowflake stage volume. The field includes the optional stageConfig fields:

spec:
  containers:
    ..
  volumes:
  - name: <name>
    source: stage
    stageConfig:
        name: <stage_name>
        metadataCache: 1h
        resources:
            requests:
                cpu: 0.35
                memory: 0.4Gi
            limits:
                cpu: 2.0
                memory: 1Gi
Copy

Step 2: Specify where to mount the stage volume in the container

After you define a Snowflake stage storage volume by adding the spec.volumes field, use the spec.containers.volumeMounts field to describe where to mount the stage volume in your application containers, as shown in the following example:

spec:
  containers:
  name: ...
  image: ...
  volumeMounts:
  - name: <name>
    mountPath: <absolute_directory_path>
Copy

Les informations que vous fournissez dans ce champ sont cohérentes pour tous les types de volumes de stockage pris en charge et s’appliquent aux deux implémentations des volumes de zone de préparation.

Exemple

In the example service specification, the app container mounts an internal stage @ai_models_stage:

spec:
  containers:
  - name: app
    image: <image1-name>
    volumeMounts:
    - name: ai-models
      mountPath: /opt/ai-model
  volumes:
  - name: ai-models
    source: stage
    stageConfig:
      name: "@ai_models_stage"
Copy

Exigences en matière de contrôle d’accès

Le rôle de propriétaire du service est le rôle utilisé pour créer le service. C’est également le rôle que les services utilisent lors de leur interaction avec Snowflake. Le rôle de propriétaire détermine les permissions accordées aux conteneurs d’applications pour accéder à une zone de préparation montée. Le rôle de propriétaire doit avoir le privilège READ sur la zone de préparation.

Si le rôle de propriétaire ne dispose pas du privilège WRITE sur une zone de préparation, le montage de cette zone de préparation est en lecture seule. En d’autres termes, les conteneurs ne peuvent lire que les fichiers de la zone de préparation. Le rôle de propriétaire nécessite le privilège WRITE sur une zone de préparation pour que le montage de la zone de préparation prenne en charge à la fois la lecture et l’écriture.

About the deprecated implementation

The deprecated stage-volume implementation uses a shared cache for reads and writes. Although this works well for some scenarios, you can’t control whether data is read from the cache or directly from the stage, which might not be suitable for all applications. Additionally, when you use the cache for reads and writes, this can introduce performance overhead.

Migrating code from the deprecated implementation

The newer implementation replaces the deprecated implementation, with the following behavioral changes:

  • The newer stage-volume implementation streams file contents directly to and from cloud storage, ensuring that you always get the latest contents. This provides predictable behavior and significantly faster throughput. The deprecated stage-volume implementation caches chunks of file data, making it difficult to know if you are reading the latest data.

  • Les performances de lecture aléatoire peuvent être inférieures avec la nouvelle implémentation, en raison de la suppression de la mise en cache. Cependant, sans cache de disque local, la cohérence entre les volumes est améliorée. Les modifications de fichier sont écrites directement dans la zone de préparation de sauvegarde lorsque le fichier est fermé, sans mise en mémoire tampon du disque local.

  • Les lectures renvoient toujours les données les plus récentes, ce qui rend cette configuration meilleure pour le partage de données entre les services.

  • Random writes or file appends aren’t supported. Attempting these operations results in an error. Snowflake recommends that you use block storage volumes for these workloads.

Specify a Snowflake stage volume in a service specification (deprecated)

To create a service where service containers use Snowflake stage volume, specify the required settings in the service specification as shown in the following steps:

  1. To specify the stage volume, use the spec.volumes field as shown in the following example:

    volumes:
    - name: <name>
      source: <stage_name>
    
    Copy

    Les champs suivants sont obligatoires :

    • name: The name of the volume.

    • source: The Snowflake internal stage or folder on the stage to mount; for example @my_stage, @my_stage/folder. Quotes must surround this value.

  2. To describe where to mount the stage volume in your application containers, use the spec.containers.volumeMounts field, as shown in the following example:

    volumeMounts:
    - name: <name>
      mountPath: <absolute_directory_path>
    
    Copy

    Les informations que vous fournissez dans ce champ sont cohérentes pour tous les types de volumes de stockage pris en charge et s’appliquent aux deux implémentations des volumes de zone de préparation.

Example (deprecated)

In the example service specification, the app container mounts an internal stage @model_stage by using the deprecated stage volume implementations:

spec:
  containers:
  - name: app
    image: <image1-name>
    volumeMounts:
    - name: models-legacy
      mountPath: /opt/model-legacy
  volumes:
  - name: models-legacy
    source: "@model_stage"
Copy

The volumeMounts field specifies where inside the container to mount the stage volume. This specification remains the same for both the stage volume implementations.

Instructions pour l’utilisation des volumes de zone de préparation

This section provides you with guidelines to follow when you implement application code in which a container uses a Snowflake stage as storage volume.

Instructions communes pour les deux implémentations des volumes de zones de préparation

  • Le montage de zone de préparation est optimisé pour les lectures et écritures séquentielles.

  • Les opérations d’E/S de montage de zone de préparation peuvent avoir des latences plus élevées que les opérations d’E/S sur le système de fichiers du conteneur et les volumes de stockage en blocs. Vous devez toujours vérifier le code de statut des opérations d’E/S pour vous assurer qu’elles ont réussi.

  • Les montages de zone de préparation téléchargent les mises à jour de fichiers de manière asynchrone. Les modifications apportées aux fichiers sur un montage de zone de préparation ne sont garanties d’être conservées dans la zone de préparation qu’une fois le descripteur de fichier fermé ou vidé avec succès. Il peut y avoir un certain délai avant que les modifications apportées aux fichiers sur un montage de zone de préparation deviennent visibles pour les autres conteneurs et Snowflake.

  • Chaque répertoire d’une zone de préparation montée doit contenir moins de 100 000 fichiers. Attendez que la latence readdir augmente avec le nombre de fichiers dans le répertoire.

Guidelines when using the deprecated version of the stage volume implementation

  • Évitez d’écrire simultanément dans plusieurs fichiers au sein d’un montage de zone de préparation.

  • Le montage de zone de préparation n’est pas un système de fichiers réseau. N’utilisez pas de montages de zone de préparation pour la coordination multi-clients.

  • N’ouvrez pas plusieurs handles du même fichier simultanément. Utilisez les descripteurs de fichiers ouverts pour les opérations de lecture ou d’écriture, mais pas un mélange des deux. Pour lire un fichier après y avoir écrit, fermez le fichier, puis rouvrez-le avant de le lire.

Guidelines when using the generally available stage volume implementation

  • Les écritures simultanées sur le même fichier à partir de plusieurs montages de zones de préparation (même volume de zone de préparation monté sur différents conteneurs) ne sont pas recommandées.

  • L’absence de cache de disque local améliore la cohérence entre les montages. Les modifications de fichier sont transférées directement vers la zone de préparation de sauvegarde après fermeture du fichier, sans mise en mémoire tampon du disque local. Les lectures renvoient toujours les données les plus récentes, ce qui rend le nouveau montage de zone de préparation meilleur pour le partage des données entre les services.

  • Pour des performances optimales, lisez et écrivez des données par grands morceaux contigus. La perte de performances pour les petites lectures et écritures par rapport à l’implémentation des volumes de zone de préparation disponible de manière générale peut atténuer les gains de performances de la nouvelle implémentation.

Limitations lors de l’utilisation des volumes de zone de préparation

Cette section décrit les limitations dont vous devez avoir connaissance lorsque vous implémentez du code d’application dans lequel les conteneurs utilisent des volumes de zone de préparation. Si vous rencontrez des problèmes avec ces limites, contactez votre représentant de compte.

Limitations communes aux deux implémentations des volumes de zones de préparation

  • Vous ne pouvez monter qu’une zone de préparation ou un sous-répertoire dans une zone de préparation, par exemple @my_stage/folder. Vous ne pouvez pas monter un seul fichier dans une zone de préparation, par exemple @my_stage/folder/file.

  • Les zones de préparation externes ne sont pas prises en charge. Seuls les zones de préparation internes Snowflake sont prises en charge.

  • Un maximum de 5 volumes de zone de préparation est autorisé par service. Pour plus d’informations, consultez volumes.spéc..

  • Un maximum de 8 volumes de zones de préparation par nœud du pool de calcul est pris en charge. Snowflake gère la limite de montage de zone de préparation par nœud de la même manière qu’il gère la mémoire, le CPU, et la GPU. Le lancement d’une nouvelle instance de service peut amener Snowflake à lancer de nouveaux nœuds lorsqu’aucun nœud existant n’a la capacité de prendre en charge les montages de zone de préparation demandés.

  • Les montages de zones de préparation ne sont pas des systèmes de fichiers entièrement compatibles avec POSIX. Par exemple :

    • Les renommages de fichiers et de répertoires ne sont pas atomiques.

    • Les liens physiques ne sont pas pris en charge.

  • La notification d’inode du sous-système du noyau Linux (inotify) qui surveille les modifications apportées aux systèmes de fichiers ne fonctionne pas sur les montages en zone de préparation.

Limitations when using the deprecated version of the stage volume implementation

  • Les capacités des volumes de zone de préparation varient en fonction de la plateforme Cloud de votre compte Snowflake :

    • Les comptes sur AWS prennent en charge les zones de préparation internes avec les chiffrements des zones de préparation SNOWFLAKE_FULL et SNOWFLAKE_SSE. Pour plus d’informations, consultez Paramètres des zones de préparation internes.

    • Les comptes sur Azure prennent actuellement en charge les zones de préparation internes avec le chiffrement SNOWFLAKE_SSE. Lors de l’exécution de CREATE STAGE, utilisez le paramètre ENCRYPTION pour spécifier le type de chiffrement : CREATE STAGE my_stage ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');.

    • Les comptes sur Google Cloud ne sont pas pris en charge.

  • Les écritures simultanées sur le même fichier à partir de plusieurs montages de zones de préparation (c’est-à-dire le même volume de zone de préparation monté sur différents conteneurs) ne sont pas prises en charge.

Limitations lors de l’utilisation de la version disponible de manière générale de l’implémentation des volumes de zone de préparation

  • Les écritures aléatoires et les ajouts de fichiers ne sont pas pris en charge.

  • Chaque zone de préparation montée nécessite 512 MB de mémoire par zone de préparation. Cela signifie qu’il existe une limite du nombre de volumes de zones de préparation qui peuvent être utilisés en fonction de la taille de l’instance. Le montage du volume sur plusieurs conteneurs n’augmente pas la consommation de mémoire.