Použití instančního objektu s konektorem Spark 3 pro Azure Cosmos DB for NoSQL
V tomto článku se dozvíte, jak vytvořit aplikaci Microsoft Entra a instanční objekt, který lze použít s řízením přístupu na základě role. Tento instanční objekt pak můžete použít k připojení k účtu Azure Cosmos DB for NoSQL ze Sparku 3.
Požadavky
- Existující účet Azure Cosmos DB for NoSQL.
- Pokud máte existující předplatné Azure, vytvořte nový účet.
- Žádné předplatné Azure? Službu Azure Cosmos DB můžete vyzkoušet zdarma bez nutnosti platební karty.
- Existující pracovní prostor Azure Databricks.
- Zaregistrovaná aplikace Microsoft Entra a instanční objekt
- Pokud nemáte instanční objekt a aplikaci, zaregistrujte aplikaci pomocí webu Azure Portal.
Vytvoření tajného klíče a přihlašovacích údajů k záznamu
V této části vytvoříte tajný klíč klienta a zaznamenáte hodnotu pro pozdější použití.
Otevřete Azure Portal.
Přejděte do existující aplikace Microsoft Entra.
Přejděte na stránku Certifikáty a tajné kódy . Pak vytvořte nový tajný klíč. Uložte hodnotu Tajný klíč klienta, abyste ji mohli použít dále v tomto článku.
Přejděte na stránku Přehled . Vyhledejte a poznamenejte hodnoty ID aplikace (klienta), ID objektu a ID adresáře (tenanta). Tyto hodnoty také použijete dále v tomto článku.
Přejděte ke svému stávajícímu účtu Azure Cosmos DB for NoSQL.
Na stránce Přehled zaznamenejte hodnotu identifikátoru URI. Poznamenejte si také ID předplatného a hodnoty skupiny prostředků. Tyto hodnoty použijete dále v tomto článku.
Vytvoření definice a přiřazení
V této části vytvoříte definici role ID Microsoft Entra. Potom přiřadíte tuto roli s oprávněními ke čtení a zápisu položek v kontejnerech.
Pomocí příkazu vytvořte roli
az role definition create
. Předejte název účtu Azure Cosmos DB for NoSQL a skupinu prostředků následovaný textem JSON, který definuje vlastní roli. Role je také vymezena na úroveň účtu pomocí ./
Pomocí vlastnosti textu požadavku se ujistěte, že pro svou roliRoleName
zadáte jedinečný název.az cosmosdb sql role definition create \ --resource-group "<resource-group-name>" \ --account-name "<account-name>" \ --body '{ "RoleName": "<role-definition-name>", "Type": "CustomRole", "AssignableScopes": ["/"], "Permissions": [{ "DataActions": [ "Microsoft.DocumentDB/databaseAccounts/readMetadata", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*" ] }] }'
Vypište definici role, kterou jste vytvořili pro načtení jeho jedinečného identifikátoru ve výstupu JSON.
id
Zaznamená hodnotu výstupu JSON.az cosmosdb sql role definition list \ --resource-group "<resource-group-name>" \ --account-name "<account-name>"
[ { ..., "id": "/subscriptions/<subscription-id>/resourceGroups/<resource-grou-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/sqlRoleDefinitions/<role-definition-id>", ... "permissions": [ { "dataActions": [ "Microsoft.DocumentDB/databaseAccounts/readMetadata", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*" ], "notDataActions": [] } ], ... } ]
Slouží
az cosmosdb sql role assignment create
k vytvoření přiřazení role. Nahraďte<aad-principal-id>
ID objektu, které jste si poznamenali dříve v tomto článku. Nahraďte<role-definition-id>
id
také hodnotu načtenou ze spuštěníaz cosmosdb sql role definition list
příkazu v předchozím kroku.az cosmosdb sql role assignment create \ --resource-group "<resource-group-name>" \ --account-name "<account-name>" \ --scope "/" \ --principal-id "<account-name>" \ --role-definition-id "<role-definition-id>"
Použití instančního objektu
Teď, když jste vytvořili aplikaci a instanční objekt Microsoftu Entra, vytvořili vlastní roli a přiřadili jí oprávnění k vašemu účtu Azure Cosmos DB for NoSQL, měli byste být schopni spustit poznámkový blok.
Otevřete pracovní prostor Azure Databricks.
V rozhraní pracovního prostoru vytvořte nový cluster. Nakonfigurujte cluster s těmito nastaveními minimálně:
Verze Hodnota Verze modulu runtime 13.3 LTS (Scala 2.12, Spark 3.4.1)
Pomocí rozhraní pracovního prostoru vyhledejte balíčky Maven z Maven Central s ID
com.azure.cosmos.spark
skupiny . Nainstalujte balíček speciálně pro Spark 3.4 s ID artefaktu předponouazure-cosmos-spark_3-4
clusteru.Nakonec vytvořte nový poznámkový blok.
Tip
Ve výchozím nastavení je poznámkový blok připojený k nedávno vytvořenému clusteru.
V poznámkovém bloku nastavte nastavení konfigurace konektoru Spark služby Azure Cosmos DB pro koncový bod účtu NoSQL, název databáze a název kontejneru. Použijte ID předplatného, skupinu prostředků, ID aplikace (klienta), ID adresáře (tenanta) a hodnoty tajných kódů klienta zaznamenané dříve v tomto článku.
# Set configuration settings config = { "spark.cosmos.accountEndpoint": "<nosql-account-endpoint>", "spark.cosmos.auth.type": "ServicePrincipal", "spark.cosmos.account.subscriptionId": "<subscription-id>", "spark.cosmos.account.resourceGroupName": "<resource-group-name>", "spark.cosmos.account.tenantId": "<entra-tenant-id>", "spark.cosmos.auth.aad.clientId": "<entra-app-client-id>", "spark.cosmos.auth.aad.clientSecret": "<entra-app-client-secret>", "spark.cosmos.database": "<database-name>", "spark.cosmos.container": "<container-name>" }
// Set configuration settings val config = Map( "spark.cosmos.accountEndpoint" -> "<nosql-account-endpoint>", "spark.cosmos.auth.type" -> "ServicePrincipal", "spark.cosmos.account.subscriptionId" -> "<subscription-id>", "spark.cosmos.account.resourceGroupName" -> "<resource-group-name>", "spark.cosmos.account.tenantId" -> "<entra-tenant-id>", "spark.cosmos.auth.aad.clientId" -> "<entra-app-client-id>", "spark.cosmos.auth.aad.clientSecret" -> "<entra-app-client-secret>", "spark.cosmos.database" -> "<database-name>", "spark.cosmos.container" -> "<container-name>" )
Nakonfigurujte rozhraní API katalogu pro správu prostředků API pro NoSQL pomocí Sparku.
# Configure Catalog Api spark.conf.set("spark.sql.catalog.cosmosCatalog", "com.azure.cosmos.spark.CosmosCatalog") spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.accountEndpoint", "<nosql-account-endpoint>") spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.auth.type", "ServicePrincipal") spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.account.subscriptionId", "<subscription-id>") spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.account.resourceGroupName", "<resource-group-name>") spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.account.tenantId", "<entra-tenant-id>") spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.auth.aad.clientId", "<entra-app-client-id>") spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.auth.aad.clientSecret", "<entra-app-client-secret>")
// Configure Catalog Api spark.conf.set(s"spark.sql.catalog.cosmosCatalog", "com.azure.cosmos.spark.CosmosCatalog") spark.conf.set(s"spark.sql.catalog.cosmosCatalog.spark.cosmos.accountEndpoint", "<nosql-account-endpoint>") spark.conf.set(s"spark.sql.catalog.cosmosCatalog.spark.cosmos.auth.type", "ServicePrincipal") spark.conf.set(s"spark.sql.catalog.cosmosCatalog.spark.cosmos.account.subscriptionId", "<subscription-id>") spark.conf.set(s"spark.sql.catalog.cosmosCatalog.spark.cosmos.account.resourceGroupName", "<resource-group-name>") spark.conf.set(s"spark.sql.catalog.cosmosCatalog.spark.cosmos.account.tenantId", "<entra-tenant-id>") spark.conf.set(s"spark.sql.catalog.cosmosCatalog.spark.cosmos.auth.aad.clientId", "<entra-app-client-id>") spark.conf.set(s"spark.sql.catalog.cosmosCatalog.spark.cosmos.auth.aad.clientSecret", "<entra-app-client-secret>")
Vytvořit novou databázi pomocí .
CREATE DATABASE IF NOT EXISTS
Ujistěte se, že zadáte název databáze.# Create a database using the Catalog API spark.sql("CREATE DATABASE IF NOT EXISTS cosmosCatalog.{};".format("<database-name>"))
// Create a database using the Catalog API spark.sql(s"CREATE DATABASE IF NOT EXISTS cosmosCatalog.<database-name>;")
Vytvořte nový kontejner pomocí názvu databáze, názvu kontejneru, cesty klíče oddílu a hodnot propustnosti, které zadáte.
# Create a products container using the Catalog API spark.sql("CREATE TABLE IF NOT EXISTS cosmosCatalog.{}.{} USING cosmos.oltp TBLPROPERTIES(partitionKeyPath = '{}', manualThroughput = '{}')".format("<database-name>", "<container-name>", "<partition-key-path>", "<throughput>"))
// Create a products container using the Catalog API spark.sql(s"CREATE TABLE IF NOT EXISTS cosmosCatalog.<database-name>.<container-name> using cosmos.oltp TBLPROPERTIES(partitionKeyPath = '<partition-key-path>', manualThroughput = '<throughput>')")
Vytvořte ukázkovou datovou sadu.
# Create sample data products = ( ("68719518391", "gear-surf-surfboards", "Yamba Surfboard", 12, 850.00, False), ("68719518371", "gear-surf-surfboards", "Kiama Classic Surfboard", 25, 790.00, True) )
// Create sample data val products = Seq( ("68719518391", "gear-surf-surfboards", "Yamba Surfboard", 12, 850.00, false), ("68719518371", "gear-surf-surfboards", "Kiama Classic Surfboard", 25, 790.00, true) )
Použití
spark.createDataFrame
a dříve uložená konfigurace online zpracování transakcí (OLTP) k přidání ukázkových dat do cílového kontejneru.# Ingest sample data spark.createDataFrame(products) \ .toDF("id", "category", "name", "quantity", "price", "clearance") \ .write \ .format("cosmos.oltp") \ .options(config) \ .mode("APPEND") \ .save()
// Ingest sample data spark.createDataFrame(products) .toDF("id", "category", "name", "quantity", "price", "clearance") .write .format("cosmos.oltp") .options(config) .mode("APPEND") .save()
Tip
V tomto příkladu rychlého startu se přihlašovací údaje přiřazují proměnným ve formátu prostého textu. Pro zabezpečení doporučujeme používat tajné kódy. Další informace o konfiguraci tajných kódů najdete v tématu Přidání tajných kódů do konfigurace Sparku.