Veröffentlichen von Features in einem Onlinespeicher

In diesem Artikel wird beschrieben, wie Features in einem Onlinespeicher für die Echtzeitbereitstellung veröffentlicht werden.

Databricks-Featurespeicher unterstützt diese Onlinespeicher:

Onlinespeicheranbieter Veröffentlichen mit Feature Engineering im Unity Catalog Veröffentlichen mit dem Feature Store im Arbeitsbereich Featuresuche in der Legacy-MLflow-Modellbereitstellung Featuresuche in der Modellbereitstellung
Azure Cosmos DB [1] X X (Feature Store-Client v0.5.0 und höher) X X
Azure MySQL (Einzelserver) X X
Azure SQL Server X

Kompatibilitätshinweise für Cosmos DB

Dieser Abschnitt enthält einige wichtige Punkte, die Sie bei der Verwendung des Databricks-Featurespeichers mit Cosmos DB beachten sollten.

Arbeitsbereiche mit Unity Catalog-Unterstützung

In Databricks Runtime 12.2 LTS ML und niedriger ist der Cosmos DB-Onlinespeicheranbieter nicht mit Arbeitsbereichen mit Unity Catalog-Unterstützung kompatibel. Sowohl Unity Catalog als auch der offizielle Cosmos DB Spark-Connector ändern Spark-Kataloge. Wenn Sie Features in Cosmos DB aus einem Unity Catalog-fähigen Arbeitsbereich in einem Cluster veröffentlichen, in dem Databricks Runtime 12.2 LTS ML oder niedriger ausgeführt wird, entsteht möglicherweise ein Schreibkonflikt, durch den die Veröffentlichung des Featurespeichers in Cosmos DB fehlschlägt.

Um Cosmos DB in einem Unity Catalog-fähigen Arbeitsbereich zu verwenden, müssen Sie einen Cluster mit Databricks Runtime 13.0 ML oder höher oder einen Cluster mit Databricks Runtime 11.3 LTS ML oder höher mit der Clusterrichtlinie Uneingeschränkt oder Freigegebene Computeressourcen verwenden.

Spark-Connector

Zur Verwendung von Azure Cosmos DB muss das Konto mit der Core-API (SQL) erstellt und die Netzwerkkonnektivitätsmethode auf Alle Netzwerke festgelegt werden. Der entsprechende Azure Cosmos DB Spark 3-OLTP-Connector für SQL-API muss im Cluster installiert sein. Databricks empfiehlt, die neueste Connectorversion für Spark 3.2 zu installieren, bis ein Connector für Spark 3.3 veröffentlicht wird.

Verwenden von publish_table(), anstatt eine Datenbank oder einen Container manuell zu erstellen

Der Cosmos DB-Onlinespeicher arbeitet mit einem anderen Schema als der Offlinespeicher. Konkret werden im Onlinespeicher Primärschlüssel als kombinierter Schlüssel in der Spalte _feature_store_internal__primary_keys gespeichert.

Um sicherzustellen, dass der Featurespeicher auf den Cosmos DB-Onlinespeicher zugreifen kann, müssen Sie die Tabelle mithilfe von publish_table() im Onlinespeicher erstellen. Erstellen Sie eine Datenbank oder einen Container nicht manuell in Cosmos DB. publish_table() führt dies automatisch für Sie aus.

Veröffentlichen von Features in einem Onlinefeaturespeicher

Sie können einen Databricks-Auftrag erstellen und planen, um regelmäßig aktualisierte Features zu veröffentlichen. Dieser Auftrag kann auch den Code zum Berechnen der aktualisierten Features enthalten, oder Sie können separate Aufträge erstellen und ausführen, um Featureupdates zu berechnen und zu veröffentlichen.

Im folgenden Code wird für SQL-Speicher davon ausgegangen, dass eine Onlinedatenbank mit dem Namen „recommender_system“ bereits im Onlinespeicher vorhanden ist und mit dem Namen des Offlinespeichers übereinstimmt. Wenn in der Datenbank keine Tabelle mit dem Namen „customer_features“ vorhanden ist, erstellt dieser Code eine Tabelle. Außerdem wird davon ausgegangen, dass Features jeden Tag berechnet und als partitionierte Spalte _dtgespeichert werden.

Im folgenden Code wird davon ausgegangen, dass Sie Geheimnisse für den Zugriff auf diesen Onlineshop erstellt haben.

Cosmos DB

Cosmos DB-Unterstützung ist in allen Versionen von Feature Engineering im Unity Catalog-Client und Feature Store-Client v0.5.0 und höher verfügbar.

import datetime
from databricks.feature_engineering.online_store_spec import AzureCosmosDBSpec
# or databricks.feature_store.online_store_spec for Workspace Feature Store
online_store = AzureCosmosDBSpec(
  account_uri='<account-uri>',
  read_secret_prefix='<read-scope>/<prefix>',
  write_secret_prefix='<write-scope>/<prefix>'
)

fe.publish_table( # or fs.publish_table for Workspace Feature Store
  name='ml.recommender_system.customer_features',
  online_store=online_store,
  filter_condition=f"_dt = '{str(datetime.date.today())}'",
  mode='merge'
)

SQL-Speicher

import datetime
from databricks.feature_engineering.online_store_spec import AzureMySqlSpec
# or databricks.feature_store.online_store_spec for Workspace Feature Store
online_store = AzureMySqlSpec(
  hostname='<hostname>',
  port='<port>',
  read_secret_prefix='<read-scope>/<prefix>',
  write_secret_prefix='<write-scope>/<prefix>'
)

fs.publish_table(
  name='recommender_system.customer_features',
  online_store=online_store,
  filter_condition=f"_dt = '{str(datetime.date.today())}'",
  mode='merge'
)

Veröffentlichen von Features in einem Onlinespeicher

Legen Sie streaming=True fest, um Features kontinuierlich an den Onlineshop zu streamen.

fe.publish_table( # or fs.publish_table for Workspace Feature Store
  name='ml.recommender_system.customer_features',
  online_store=online_store,
  streaming=True
)

Veröffentlichen ausgewählter Features in einem Onlinespeicher

Geben Sie mit dem features-Argument den oder die zu veröffentlichenden Featurenamen an, um nur ausgewählte Features im Onlineshop zu veröffentlichen. Primärschlüssel und Zeitstempelschlüssel werden immer veröffentlicht. Wenn Sie das Argument features nicht angeben oder der Wert „None“ ist, werden alle Features der Offinefeaturetabelle veröffentlicht.

fe.publish_table( # or fs.publish_table for Workspace Feature Store
  name='ml.recommender_system.customer_features',
  online_store=online_store,
  features=["total_purchases_30d"]
)

Veröffentlichen einer Featuretabelle in einer bestimmten Datenbank

Geben Sie in der Spezifikation des Onlineshops den Datenbanknamen (database_name) und den Tabellennamen (table_name) an. Wenn Sie diese Parameter nicht angeben, werden der Offlinedatenbankname und der Name der Featuretabelle verwendet. database_name muss bereits im Onlineshop vorhanden sein.

online_store = AzureMySqlSpec(
  hostname='<hostname>',
  port='<port>',
  database_name='<database-name>',
  table_name='<table-name>',
  read_secret_prefix='<read-scope>/<prefix>',
  write_secret_prefix='<write-scope>/<prefix>'
)

Überschreiben einer vorhandenen Onlinefeaturetabelle oder bestimmter Zeilen

Verwenden Sie mode='overwrite' im publish_table-Aufruf. Die Onlinetabelle wird vollständig durch die Daten in der Offlinetabelle überschrieben.

Hinweis

Azure Cosmos DB unterstützt den Überschreibmodus nicht.

fs.publish_table(
  name='recommender_system.customer_features',
  online_store=online_store,
  mode='overwrite'
)

Verwenden Sie das filter_condition-Argument, um nur bestimmte Zeilen zu überschreiben:

fs.publish_table(
  name='recommender_system.customer_features',
  online_store=online_store,
  filter_condition=f"_dt = '{str(datetime.date.today())}'",
  mode='merge'
)

Löschen einer veröffentlichten Tabelle aus einem Onlinespeicher

Mit dem Feature Store-Client v0.12.0 und höher können Sie mit drop_online_table eine veröffentlichte Tabelle aus einem Onlinespeicher löschen. Wenn Sie eine veröffentlichte Tabelle mit drop_online_table löschen, wird sie aus Ihrem Onlinespeicheranbieter gelöscht, und die Metadaten des Onlinespeichers werden aus Databricks entfernt.

fe.drop_online_table( # or fs.drop_online_table for Workspace Feature Store
  name='recommender_system.customer_features',
  online_store = online_store
)

Hinweis

  • drop_online_table löscht die veröffentlichte Tabelle aus dem Onlinespeicher. Die Featuretabelle in Databricks wird nicht gelöscht.
  • Bevor Sie eine veröffentlichte Tabelle löschen, sollten Sie sicherstellen, dass die Tabelle nicht für die Featuresuche bei der Modellbereitstellung verwendet wird und keine anderen Downstreamabhängigkeiten vorhanden sind. Das Löschen kann nicht rückgängig gemacht werden und kann dazu führen, dass bei Abhängigkeiten Fehler auftreten.
  • Um nach Abhängigkeiten zu suchen, sollten Sie die Schlüssel für die veröffentlichte Tabelle, die Sie löschen möchten, einen Tag lang rotieren, bevor Sie drop_online_table ausführen.