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

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í.

  1. Otevřete Azure Portal.

  2. Přejděte do existující aplikace Microsoft Entra.

  3. 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.

  4. 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.

  5. Přejděte ke svému stávajícímu účtu Azure Cosmos DB for NoSQL.

  6. 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.

  1. 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 roli RoleName 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/*"
                ]
            }]
        }'
    
  2. 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": []
          }
        ],
        ...
      }
    ]
    
  3. 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.

  1. Otevřete pracovní prostor Azure Databricks.

  2. 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)
  3. Pomocí rozhraní pracovního prostoru vyhledejte balíčky Maven z Maven Central s ID com.azure.cosmos.sparkskupiny . Nainstalujte balíček speciálně pro Spark 3.4 s ID artefaktu předponou azure-cosmos-spark_3-4 clusteru.

  4. 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.

  5. 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>" 
    )
    
  6. 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>")
    
  7. 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>;")
    
  8. 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>')")
    
  9. 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)
    )
    
  10. 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.