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
- Mevcut bir NoSQL için Azure Cosmos DB hesabı.
- Mevcut bir Azure aboneliğiniz varsa yeni bir hesap oluşturun.
- Azure aboneliği yok mu? Kredi kartı gerektirmeden Azure Cosmos DB'i ücretsiz deneyebilirsiniz.
- Mevcut bir Azure Databricks çalışma alanı.
- Kayıtlı Microsoft Entra uygulaması ve hizmet sorumlusu.
- Hizmet sorumlunuz ve uygulamanız yoksa Azure portalını kullanarak bir uygulamayı kaydedin.
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.
Azure portalını açın.
Mevcut Microsoft Entra uygulamanıza gidin.
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.
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.
Mevcut NoSQL için Azure Cosmos DB hesabınıza gidin.
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.
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 kullanarakRoleName
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/*" ] }] }'
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": [] } ], ... } ]
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ığındanaz cosmosdb sql role definition list
getirilen değerleid
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.
Azure Databricks çalışma alanınızı açın.
Ç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)
Maven Central'dan Grup Kimliği ile Maven paketlerini aramak için çalışma alanı arabirimini
com.azure.cosmos.spark
kullanın. Paketi özellikle Spark 3.4 için kümeye ön ekli bir Yapıt Kimliği ileazure-cosmos-spark_3-4
yükleyin.Son olarak yeni bir not defteri oluşturun.
İpucu
Varsayılan olarak, not defteri son oluşturulan kümeye eklenir.
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>" )
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>")
kullanarak
CREATE DATABASE IF NOT EXISTS
yeni 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>;")
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>')")
Ö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) )
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.
İlgili içerik
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin