Verwalten von Snowpark Container Services mit Python

Sie können Python verwenden, um Snowpark Container Services zu verwalten, einen vollständig verwalteten Containerdienst, über den Sie containerisierte Anwendungen bereitstellen, verwalten und skalieren können. Eine Übersicht zu Snowpark Container Services finden Sie unter Allgemeine Informationen zu Snowpark Container Services.

Mit der Snowflake-Python-API können Sie Computepools, Image-Repositorys und Dienste verwalten.

Die Beispiele unter diesem Thema gehen davon aus, dass Sie Code hinzugefügt haben, um eine Verbindung zu Snowflake herzustellen und ein Root-Objekt zu erstellen, von dem aus Sie die Snowflake-Python-API verwenden können. Weitere Informationen dazu finden Sie unter Verbinden mit Snowflake über die Snowflake-Python-API.

Der Code im folgenden Beispiel verwendet die in einer Konfigurationsdatei definierten Verbindungsparameter, um eine Verbindung zu Snowflake herzustellen. Unter Verwendung des resultierenden Session-Objekts erstellt der Code ein Root-Objekt, das die Typen und Methoden der API verwendet.

from snowflake.core import Root
from snowflake.snowpark import Session

session = Session.builder.config("connection_name", "myconnection").create()
root = Root(session)
Copy

Verwalten von Computepools

Sie können Computepools verwalten, bei denen es sich um Sammlungen von VM-Knoten (virtuelle Maschinen) handelt, auf denen Snowflake Ihre Snowpark Container Services-Jobs und -Dienste ausführt.

Die Snowflake-Python-API repräsentiert Computepools mit zwei verschiedenen Typen:

  • ComputePool: Zeigt die Eigenschaften eines Computepools an, z. B. sein Warehouse, die maximale und minimale Anzahl von Knoten sowie die Einstellungen für das automatische Anhalten und Fortsetzen.

  • ComputePoolResource: Stellt Methoden für das Ausführen von Aktionen auf Computepools zur Verfügung, wie z. B. das Abrufen eines entsprechenden ComputePool-Objekts und das Anhalten, Fortsetzen und Beenden von Pools.

Weitere Informationen zu Computepools finden Sie unter Snowpark Container Services: Verwenden von Computepools.

Erstellen von Computepools

Sie können einen Computepool erstellen, indem Sie die Methode ComputePoolCollection.create aufrufen und ein ComputePool-Objekt übergeben, das den zu erstellenden Computepool repräsentiert.

Um einen Computepool aus einer in einem Stagingbereich gespeicherten Spezifikationsdatei zu erstellen, erstellen Sie zunächst ein ComputePool-Objekt, das Pool-Eigenschaften wie die folgenden angibt:

  • Name des Computepools

  • Maximale und minimale Anzahl von Knoten, aus denen der Pool besteht

  • Name der Instanz-Familie, die den Maschinentyp angibt, der für die Knoten im Pool bereitgestellt werden soll

  • Ob der Pool automatisch fortgesetzt werden soll, wenn ein Dienst oder Job an ihn übermittelt wird

Der Code im folgenden Beispiel erstellt ein ComputePool-Objekt, das einen Pool namens my_compute_pool repräsentiert. Der Code erstellt dann den Computepool, indem das ComputePool-Objekt an die Methode ComputePoolCollection.create übergeben und so der Pool erstellt wird.

from snowflake.core import Root
from snowflake.core.compute_pool import ComputePool

compute_pool = ComputePool("my_compute_pool", min_node=1, max_node=2, instance_family="STANDARD_1", auto_resume=False)
root.compute_pools.create(compute_pool)
Copy

Abrufen von Details zum Computepool

Sie können Informationen zu einem Computepool erhalten, indem Sie die Methode ComputePoolResource.fetch aufrufen, die ein ComputePool-Objekt zurückgibt.

Der Code im folgenden Beispiel ruft Informationen zu einem Computepool namens my_compute_pool ab.

from snowflake.core import Root
from snowflake.core.compute_pool import ComputePool

compute_pool = root.compute_pools["my_compute_pool"].fetch()
Copy

Erstellen und Aktualisieren von Computepools

Sie können die Merkmale eines vorhandenen Computepools aktualisieren, indem Sie die Eigenschaften eines ComputePool-Objekts festlegen, das einen vorhandenen Pool repräsentiert, und dann das aktualisierte Objekt mit der Methode create_or_update, die ein ComputePoolResource-Objekt zurückgibt, an Snowflake übergeben.

Sie können auch ein ComputePool-Objekt übergeben, das einen neuen Pool beschreibt, wenn Sie den Pool erstellen möchten.

Der Code im folgenden Beispiel legt die maximal zulässige Anzahl von Knoten des Computepools my_compute_pool fest und aktualisiert dann den Pool in Snowflake.

from snowflake.core import Root
from snowflake.core.compute_pool import ComputePool

compute_pool = root.compute_pools["my_compute_pool"].fetch()
compute_pool.max_node = 3
compute_pool_res = root.compute_pools.create_or_update(compute_pool)
Copy

Auflisten von Computepools

Sie können Computepools mit der Methode iter auflisten. Diese Methode gibt einen PagedIter-Iterator zurück.

Der Code im folgenden Beispiel listet alle Computepools auf, deren Name mit „abc“ beginnen, und gibt den Namen jedes einzelnen Pools aus.

from snowflake.core import Root

compute_pools = root.compute_pools.iter(like="abc%")
for compute_pool in compute_pools:
  print(compute_pool.name)
Copy

Ausführen von Computepool-Operationen

Mit einem ComputePoolResource-Objekt können Sie allgemeine Computepool-Operationen wie das Anhalten, Fortsetzen und Beenden von Pools ausführen. Sie können ein ComputePoolResource-Objekt mit der Methode ComputePool.fetch erhalten.

Der Code im folgenden Beispiel hält den Computepool my_compute_pool an, setzt ihn fort und beendet ihn. Mit der Methode Root.compute_pools wird ein Objekt ComputePool erstellt, das den Computepool repräsentiert. Über das ComputePool-Objekt wird ein ComputePoolResource-Objekt abgerufen, mit dem Computepool-Operationen ausgeführt werden können.

from snowflake.core import Root
from snowflake.core.compute_pool import ComputePool

compute_pool = root.compute_pools["my_compute_pool"]
compute_pool_res = compute_pool.fetch()
compute_pool_res.suspend()
compute_pool_res.resume()
compute_pool_res.stop_all_services()
Copy

Verwalten von Image-Repositorys

Sie können Image-Repositorys verwalten, in denen Images für Anwendungen gespeichert werden, die Sie in Containerdiensten ausführen.

Ein Image-Repository ist ein Objekt auf Schemaebene. Wenn Sie eine Tabelle erstellen oder auf diese verweisen, tun Sie dies im Kontext des zugehörigen Schemas.

Die Snowflake-Python-API repräsentiert Image-Repositorys mit zwei verschiedenen Typen:

  • ImageRepository: Zeigt die Eigenschaften eines Image-Repository wie Datenbank- und Schemanamen, Repository-URL und Eigentümer an.

  • ImageRepositoryResource: Stellt Methoden zur Verfügung, mit denen Sie ein entsprechendes ImageRepository-Objekt abrufen und die Image-Repository-Ressource löschen können.

Weitere Informationen zu Image-Repositorys finden Sie unter Snowpark Container Services: Verwenden von Image-Registry und Image-Repository.

Erstellen von Image-Repositorys

Um ein Image-Repository aus einer in einem Stagingbereich gespeicherten Spezifikationsdatei zu erstellen, erstellen Sie zunächst ein ImageRepository-Objekt, das Repository-Eigenschaften wie die folgenden angibt:

Der Code im folgenden Beispiel erstellt ein ImageRepository-Objekt, das ein Repository namens my_repo repräsentiert. Der Code erstellt dann das Image-Repository, indem das ImageRepository-Objekt an die Methode ImageRepositoryCollection.create übergeben und so das Image-Repository in der Datenbank my_db und dem Schema my_schema erstellt wird.

from snowflake.core import Root
from snowflake.core.image_repository import ImageRepository

my_repo = ImageRepository("my_repo")
root.databases["my_db"].schemas["my_schema"].image_repositories.create(my_repo)
Copy

Abrufen von Details zu Image-Repositorys

Sie können Informationen zu einem Image-Repository abrufen, indem Sie die Methode ImageRepositoryResource.fetch aufrufen, die ein ImageRepository-Objekt zurückgibt.

Der Code im folgenden Beispiel ruft ein ImageRepository-Objekt ab, das das Image-Repository my_repo repräsentiert, und gibt dann den Namen des Eigentümers des Repositorys aus.

from snowflake.core import Root
from snowflake.core.image_repository import ImageRepository

my_repo_res = root.databases["my_db"].schemas["my_schema"].image_repositories["my_repo"]
my_repo = my_repo_res.fetch()
print(my_repo.owner)
Copy

Auflisten von Image-Repositorys

Sie können die Image-Repositorys in einem bestimmten Schema mit der Methode iter auflisten. Die Methode gibt einen PagedIter-Iterator für ImageRepository-Objekte zurück.

Der Code im folgenden Beispiel listet die Repositorys in der Datenbank my_db und im Schema my_schema auf und gibt den Namen jedes Repositorys aus.

from snowflake.core import Root

repo_list = root.databases["my_db"].schemas["my_schema"].image_repositories.iter()
for repo_obj in repo_list:
  print(repo_obj.name)
Copy

Löschen von Image-Repositorys

Sie können ein Image-Repository mit der Methode ImageRepositoryResource.delete löschen.

Der Code im folgenden Beispiel löscht das Repository my_repo.

from snowflake.core import Root
from snowflake.core.image_repository import ImageRepository

my_repo_res = root.databases["my_db"].schemas["my_schema"].image_repositories["my_repo"]
my_repo_res.delete()
Copy

Verwalten von Diensten

Sie können Dienste verwalten, die Anwendungscontainer ausführen, bis Sie sie stoppen. Snowflake startet einen Dienst automatisch neu, wenn der Dienstcontainer stoppt. Auf diese Weise wird der Dienst praktisch ohne Unterbrechung ausgeführt.

Ein Dienst ist ein Objekt auf Schemaebene. Wenn Sie einen Dienst erstellen oder auf ihn verweisen, tun Sie dies im Kontext des zugehörigen Schemas.

Die Snowflake-Python-API repräsentiert Dienste mit zwei verschiedenen Typen:

  • Service: Zeigt die Eigenschaften eines Dienstes an, wie z. B. seine Spezifikation, die minimale und maximale Anzahl an Instanzen sowie die Namen von Datenbank und Schema.

  • ServiceResource: Stellt Methoden zur Verfügung, mit denen Sie ein entsprechendes Service-Objekt abrufen, den Dienst anhalten und fortsetzen sowie seinen Status abrufen können.

Weitere Informationen zu Diensten finden Sie unter Snowpark Container Services: Verwenden von Diensten.

Erstellen von Diensten

Um einen Dienst zu erstellen, führen Sie die Methode services.create aus und übergeben ein Service-Objekt, das den zu erstellenden Dienst repräsentiert.

Sie erstellen einen Dienst aus einer Dienstspezifikationsdatei .yaml, die in einen Stagingbereich hochgeladen wurde. Weitere Informationen zum Erstellen einer Dienstspezifikation finden Sie unter Referenz der Dienstspezifikation.

Hochladen der Spezifikation

Wenn Sie einen Dienst aus einer Spezifikation erstellen, die noch nicht in einen Stagingbereich hochgeladen wurde, können Sie die Spezifikation mit einem Snowpark-FileOperation-Objekt hochladen.

Der Code im folgenden Beispiel verwendet die Methode FileOperation.put, um eine Spezifikation als Datei hochzuladen.

session.file.put("/local_location/my_service_spec.yaml", "@my_stage")
Copy

Der Code im folgenden Beispiel verwendet die Methode FileOperation.put_stream, um eine Spezifikation als Zeichenfolge (String) hochzuladen.

service_spec_string = """
// Specification as a string.
"""
session.file.put_stream(StringIO(sepc_in_string), "@my_stage/my_service_spec.yaml")
Copy

Erstellen des Dienstes

Um einen Dienst aus einer in einem Stagingbereich gespeicherten Spezifikationsdatei zu erstellen, erstellen Sie zunächst ein Service-Objekt, das Diensteigenschaften wie die folgenden angibt:

  • Name des Dienstes

  • Maximale und minimale Anzahl von Dienstinstanzen, die Snowflake erstellen kann

  • Computepool, zu dem der Dienst hinzugefügt werden soll

  • Speicherort des Stagingbereichs und Name der Spezifikation

Der Code im folgenden Beispiel erstellt ein Service-Objekt, das einen Dienst namens my_service aus einer Spezifikation in @my_stage/my_service_spec.yaml repräsentiert. Der Code erstellt dann den Dienst, indem das Service-Objekt an die Methode ServiceCollection.create übergeben und so der Dienst in der Datenbank my_db und dem Schema my_schema erstellt wird.

from snowflake.core import Root
from snowflake.core.service import Service

my_service = Service("my_service", min_instances=1, max_instances=2,compute_pool="my_compute_pool", from_stage="@my_stage", spec="my_service_spec.yaml")
root.databases["my_db"].schemas["my_schema"].services.create(my_service)
Copy

Abrufen von Details zum Dienst

Sie können Informationen zu einem Snowflake-Dienst erhalten, indem Sie die Methode ServiceResource.fetch aufrufen, die ein Service-Objekt zurückgibt.

Der Code im folgenden Beispiel ruft Informationen zu einem Dienst namens my_service ab.

from snowflake.core import Root
from snowflake.core.service import Service

my_service = root.databases["my_db"].schemas["my_schema"].services["my_service"].fetch()
Copy

Auflisten von Diensten

Sie können die Dienste eines bestimmten Schemas mit der Methode iter auflisten. Die Methode gibt einen PagedIter-Iterator für Service-Objekte zurück.

Der Code im folgenden Beispiel listet alle Dienste auf, deren Name mit „abc“ beginnen, und gibt den Namen jedes einzelnen Dienstes aus.

from snowflake.core import Root

services = root.databases["my_db"].schemas["my_schema"].services.iter(like="abc%")
for service_obj in services:
  print(service_obj.name)
Copy

Ausführen von Dienstoperationen

Mit einem ServiceResource-Objekt können Sie allgemeine Dienstoperationen wie Anhalten, Fortsetzen und Abrufen des Dienststatus ausführen.

Der Code im folgenden Beispiel hält den Dienst my_service an und setzt ihn dann fort. Er ruft außerdem den Status des Dienstes ab.

from snowflake.core import Root
from snowflake.core.service import Service

my_service_res = root.databases["my_db"].schemas["my_schema"].services["my_service"]

my_service_res.suspend()
my_service_res.resume()
status = my_service_res.get_service_status(10)
Copy