Megosztás a következőn keresztül:


Szolgáltatásnév használata a Spark 3-összekötővel az Azure Cosmos DB for NoSQL-hez

Ebből a cikkből megtudhatja, hogyan hozhat létre szerepköralapú hozzáférés-vezérléssel használható Microsoft Entra-alkalmazást és szolgáltatásnevet. Ezután ezzel a szolgáltatásnévvel csatlakozhat egy Azure Cosmos DB for NoSQL-fiókhoz a Spark 3-ból.

Előfeltételek

Titkos kulcs létrehozása és hitelesítő adatok rögzítése

Ebben a szakaszban létrehoz egy ügyfélkulcsot, és rögzíti a későbbi használatra szánt értéket.

  1. Nyissa meg az Azure Portalt.

  2. Nyissa meg a meglévő Microsoft Entra-alkalmazást.

  3. Lépjen a Tanúsítványok > titkos kódok lapra. Ezután hozzon létre egy új titkos kulcsot. Mentse az Ügyfél titkos kód értékét a cikk későbbi részében való használathoz.

  4. Nyissa meg az Áttekintés lapot. Keresse meg és rögzítse az alkalmazás-(ügyfél-) azonosító, az objektumazonosító és a címtár-(bérlői) azonosító értékeit. Ezeket az értékeket a cikk későbbi részében is használhatja.

  5. Nyissa meg a meglévő Azure Cosmos DB for NoSQL-fiókját.

  6. Jegyezze fel az URI-értéket az Áttekintés lapon. Jegyezze fel az előfizetés azonosítóját és az erőforráscsoport értékeit is. Ezeket az értékeket a cikk későbbi részében használhatja.

Definíció és hozzárendelés létrehozása

Ebben a szakaszban egy Microsoft Entra ID szerepkördefiníciót hoz létre. Ezután hozzárendelheti ezt a szerepkört a tárolókban lévő elemek olvasásához és írásához szükséges engedélyekkel.

  1. Hozzon létre egy szerepkört a az role definition create parancs használatával. Adja meg az Azure Cosmos DB for NoSQL-fiók nevét és erőforráscsoportját, majd az egyéni szerepkört meghatározó JSON-törzset. A szerepkör a fiókszintre is kiterjed a használatával /. Győződjön meg arról, hogy a kérelem törzsének tulajdonságával egyedi nevet ad meg a RoleName szerepkörnek.

    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. Listázza a létrehozott szerepkördefiníciót, hogy lekérje annak egyedi azonosítóját a JSON-kimenetben. Jegyezze fel a id JSON-kimenet értékét.

    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. Szerepkör-hozzárendelés létrehozásához használható az cosmosdb sql role assignment create . Cserélje le <aad-principal-id> a cikkben korábban rögzített objektumazonosítóra . Cserélje le <role-definition-id> a id parancs előző lépésben való futtatásából az cosmosdb sql role definition list beolvasott értékre is.

    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>"
    

Szolgáltatásnév használata

Most, hogy létrehozott egy Microsoft Entra-alkalmazást és szolgáltatásnevet, létrehozott egy egyéni szerepkört, és hozzárendelte a szerepkör-engedélyeket az Azure Cosmos DB for NoSQL-fiókjához, képesnek kell lennie jegyzetfüzet futtatására.

  1. Nyissa meg az Azure Databricks-munkaterületet.

  2. A munkaterület felületén hozzon létre egy új fürtöt. Konfigurálja a fürtöt az alábbi beállításokkal, legalább:

    Verzió Érték
    Futtatókörnyezet verziója 13.3 LTS (Scala 2.12, Spark 3.4.1)
  3. A munkaterületi felületen maven-csomagokat kereshet a Maven Centralból a csoportazonosítóvalcom.azure.cosmos.spark. Telepítse a csomagot kifejezetten a Spark 3.4-hez a fürthöz előtaggal ellátott Artifact ID azonosítóvalazure-cosmos-spark_3-4.

  4. Végül hozzon létre egy új jegyzetfüzetet.

    Tipp.

    Alapértelmezés szerint a jegyzetfüzet a nemrég létrehozott fürthöz van csatolva.

  5. A jegyzetfüzeten belül adja meg az Azure Cosmos DB Spark-összekötő konfigurációs beállításait a NoSQL-fiókvégponthoz, az adatbázis nevéhez és a tároló nevéhez. Használja a cikk korábbi részében rögzített előfizetés-azonosítót, erőforráscsoport-, alkalmazás- (ügyfél-) azonosítót, címtár- (bérlői) azonosítót és ügyfélkulcs-értékeket .

    # 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. Konfigurálja a Catalog API-t a NoSQL-erőforrások API-jának kezelésére a Spark használatával.

    # 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. Hozzon létre egy új adatbázist a következő használatával CREATE DATABASE IF NOT EXISTS: . Győződjön meg arról, hogy megadja az adatbázis nevét.

    # 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. Hozzon létre egy új tárolót a megadott adatbázisnév, tárolónév, partíciókulcs elérési útja és átviteli sebesség értékei alapján.

    # 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. Hozzon létre egy mintaadatkészletet.

    # 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. A korábban mentett online tranzakciófeldolgozási (OLTP) konfigurációval spark.createDataFrame mintaadatokat adhat hozzá a céltárolóhoz.

    # 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()
    

    Tipp.

    Ebben a rövid útmutatóban a hitelesítő adatok világos szövegben vannak hozzárendelve a változókhoz. A biztonság érdekében javasoljuk, hogy titkos kulcsokat használjon. A titkos kódok konfigurálásáról további információt a Titkos kódok hozzáadása a Spark-konfigurációhoz című témakörben talál.