Aracılığıyla paylaş


NoSQL için Azure Cosmos DB spark 3 bağlayıcısı ile hizmet sorumlusu kullanma

Bu makalede, rol tabanlı erişim denetimiyle kullanılabilecek bir Microsoft Entra uygulaması ve hizmet sorumlusu oluşturmayı öğreneceksiniz. Ardından bu hizmet sorumlusunu Kullanarak Spark 3'ten NoSQL için Azure Cosmos DB hesabına bağlanabilirsiniz.

Önkoşullar

Gizli dizi oluşturma ve kimlik bilgilerini kaydetme

Bu bölümde, bir istemci gizli dizisi oluşturacak ve değeri daha sonra kullanmak üzere kaydedacaksınız.

  1. Azure portalını açın.

  2. Mevcut Microsoft Entra uygulamanıza gidin.

  3. Sertifikalar ve gizli diziler sayfasına gidin. Ardından yeni bir gizli dizi oluşturun. Bu makalenin devamında kullanmak için İstemci Gizli Anahtarı değerini kaydedin.

  4. Genel Bakış sayfasına gidin. Uygulama (istemci) Kimliği, Nesne Kimliği ve Dizin (kiracı) Kimliği değerlerini bulun ve kaydedin. Bu değerleri bu makalenin devamında da kullanacaksınız.

  5. Mevcut NoSQL için Azure Cosmos DB hesabınıza gidin.

  6. Genel Bakış sayfasında URI değerini kaydedin. Ayrıca Abonelik Kimliği ve Kaynak Grubu değerlerini de kaydedin. Bu değerleri bu makalenin devamında kullanacaksınız.

Tanım ve atama oluşturma

Bu bölümde bir Microsoft Entra Id rol tanımı oluşturacaksınız. Ardından bu rolü kapsayıcılardaki öğeleri okuma ve yazma izinleriyle atarsınız.

  1. komutunu kullanarak az role definition create bir rol oluşturun. NoSQL için Azure Cosmos DB hesap adını ve kaynak grubunu ve ardından özel rolü tanımlayan JSON gövdesini geçirin. Rolün kapsamı da kullanılarak /hesap düzeyine göre belirlenir. İstek gövdesinin özelliğini kullanarak RoleName rolünüz için benzersiz bir ad sağladığınızdan emin olun.

    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. JSON çıkışında benzersiz tanımlayıcısını getirmek için oluşturduğunuz rol tanımını listeleyin. id JSON çıkışının değerini kaydedin.

    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. Rol ataması oluşturmak için kullanın az cosmosdb sql role assignment create . değerini, bu makalenin önceki bölümlerinde kaydettiğiniz Nesne Kimliği ile değiştirin<aad-principal-id>. Ayrıca değerini, önceki adımda komutu çalıştırıldığından az cosmosdb sql role definition list getirilen değerle id değiştirin<role-definition-id>.

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

Hizmet sorumlusu kullanma

Artık bir Microsoft Entra uygulaması ve hizmet sorumlusu oluşturduğunuza, özel bir rol oluşturduğunuza ve bu rol izinlerini NoSQL için Azure Cosmos DB hesabınıza atadığınıza göre, bir not defteri çalıştırabilmeniz gerekir.

  1. Azure Databricks çalışma alanınızı açın.

  2. Çalışma alanı arabiriminde yeni bir küme oluşturun. Kümeyi en az şu ayarlarla yapılandırın:

    Sürüm Değer
    Çalışma zamanı sürümü 13.3 LTS (Scala 2.12, Spark 3.4.1)
  3. Maven Central'dan Grup Kimliği ile Maven paketlerini aramak için çalışma alanı arabirimini com.azure.cosmos.sparkkullanın. Paketi özellikle Spark 3.4 için kümeye ön ekli bir Yapıt Kimliği ile azure-cosmos-spark_3-4 yükleyin.

  4. Son olarak yeni bir not defteri oluşturun.

    İpucu

    Varsayılan olarak, not defteri son oluşturulan kümeye eklenir.

  5. Not defterinde NoSQL hesap uç noktası, veritabanı adı ve kapsayıcı adı için Azure Cosmos DB Spark bağlayıcı yapılandırma ayarlarını yapın. Bu makalenin önceki bölümlerinde kaydedilen Abonelik Kimliği, Kaynak Grubu, Uygulama (istemci) Kimliği, Dizin (kiracı) Kimliği ve İstemci Gizli Anahtarı değerlerini kullanın.

    # 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. Spark kullanarak NoSQL kaynaklarının API'sini yönetmek için Katalog API'sini yapılandırın.

    # 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. kullanarak CREATE DATABASE IF NOT EXISTSyeni bir veritabanı oluşturun. Veritabanı adınızı sağladığınızdan emin olun.

    # 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. Belirttiğiniz veritabanı adını, kapsayıcı adını, bölüm anahtarı yolunu ve aktarım hızı değerlerini kullanarak yeni bir kapsayıcı oluşturun.

    # 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. Örnek bir veri kümesi oluşturun.

    # 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. Hedef kapsayıcıya örnek veriler eklemek için ve daha önce kaydedilmiş çevrimiçi işlem işleme (OLTP) yapılandırmasını kullanın spark.createDataFrame .

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

    İpucu

    Bu hızlı başlangıç örneğinde, kimlik bilgileri değişkenlere düz metin olarak atanır. Güvenlik için gizli dizileri kullanmanızı öneririz. Gizli dizileri yapılandırma hakkında daha fazla bilgi için bkz . Spark yapılandırmanıza gizli dizi ekleme.