Aracılığıyla paylaş


mssparkutils kullanarak bağlı hizmetlerle kimlik bilgilerinin güvenliğini sağlama

Dış kaynaklardan verilere erişmek yaygın bir desendir. Dış veri kaynağı anonim erişime izin vermediği sürece, bağlantınızın güvenliğini bir kimlik bilgileri, gizli dizi veya bağlantı dizesi ile sağlamanız gerekebilir.

Azure Synapse Analytics, kaynaklar arasında kimlik doğrulaması için varsayılan olarak Microsoft Entra geçişi kullanır. Başka kimlik bilgilerini kullanarak bir kaynağa bağlanmanız gerekiyorsa, doğrudan mssparkutils kullanın. mssparkutils paketi SAS belirteçlerini, Microsoft Entra belirteçlerini, bağlantı dizesi'leri ve bağlı bir hizmette veya Azure Key Vault'tan depolanan gizli dizileri alma işlemini basitleştirir.

Microsoft Entra geçişi, Synapse'e veya ayrı bir hizmet sorumlusuna atanan izinler yerine Microsoft Entra Kimliği'nde size kullanıcı olarak atanan izinleri kullanır. Örneğin, depolama hesabındaki bir bloba erişmek için Microsoft Entra geçişini kullanmak istiyorsanız bu depolama hesabına gidip blob katkıda bulunan rolünü kendinize atamanız gerekir.

Azure Key Vault'tan gizli dizileri alırken Azure Key Vault'unuza bağlı bir hizmet oluşturmanızı öneririz. Synapse çalışma alanı yönetilen hizmet kimliğinin (MSI) Azure Key Vault'unuzda Gizli Dizi Alma ayrıcalıklarına sahip olduğundan emin olun. Synapse, Synapse çalışma alanı yönetilen hizmet kimliğini kullanarak Azure Key Vault'ta kimlik doğrulaması yapar. Bağlı hizmet olmadan doğrudan Azure Key Vault'a bağlanırsanız, kullanıcı Microsoft Entra kimlik bilgilerinizi kullanarak kimlik doğrulaması yaparsınız.

Daha fazla bilgi için bkz . bağlı hizmetler.

Kullanım

belirteçler ve gizli diziler için mssparkutils yardımı

Bu işlev Synapse'te gizli diziler ve belirteç yönetimi için yardım belgelerini görüntüler.

mssparkutils.credentials.help()
mssparkutils.credentials.help()
Console.WriteLine(TokenLibrary.help());

Sonucu al:

 getToken(audience: String, name: String): returns AAD token for a given audience, name (optional)
 isValidToken(token: String): returns true if token hasn't expired
 getConnectionStringOrCreds(linkedService: String): returns connection string or credentials for the linked service
 getFullConnectionString(linkedService: String): returns full connection string with credentials for the linked service
 getPropertiesAll(linkedService: String): returns all the properties of the linked service
 getSecret(akvName: String, secret: String, linkedService: String): returns AKV secret for a given AKV linked service, akvName, secret key using workspace MSI
 getSecret(akvName: String, secret: String): returns AKV secret for a given akvName, secret key using user credentials
 getSecretWithLS(linkedService: String, secret: String): returns AKV secret for a given linked service, secret key
 putSecret(akvName: String, secretName: String, secretValue: String): puts AKV secret for a given akvName, secretName
 putSecret(akvName: String, secretName: String, secretValue: String, linkedService: String): puts AKV secret for a given akvName, secretName
 putSecretWithLS(linkedService: String, secretName: String, secretValue: String): puts AKV secret for a given linked service, secretName

Azure Data Lake Storage 2. Nesil Erişimi

ADLS 2. Nesil Birincil Depolama

Birincil Azure Data Lake Depolama dosyalara erişmek için varsayılan olarak kimlik doğrulaması için Microsoft Entra geçişi kullanılır ve mssparkutils'in açıkça kullanılması gerekmez. Geçiş kimlik doğrulamasında kullanılan kimlik, birkaç faktöre göre farklılık gösterir. Varsayılan olarak, etkileşimli not defterleri kullanıcının kimliği kullanılarak yürütülür, ancak çalışma alanı tarafından yönetilen hizmet kimliğine (MSI) değiştirilebilir. Toplu işler ve not defterinin etkileşimli olmayan yürütmeleri Çalışma Alanı MSI'sini kullanır.

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")
display(df.limit(10))
df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')
display(df.limit(10))

Bağlı hizmetlerle ADLS 2. Nesil depolama

Azure Synapse Analytics, Azure Data Lake Storage 2. Nesil bağlanırken tümleşik bir bağlı hizmetler deneyimi sağlar. Bağlı hizmetler Hesap Anahtarı, Hizmet Sorumlusu, Yönetilen Kimlik veya Kimlik Bilgileri kullanılarak kimlik doğrulaması yapmak üzere yapılandırılabilir.

Bağlı hizmet kimlik doğrulama yöntemi Hesap Anahtarı olarak ayarlandığında, bağlı hizmet sağlanan depolama hesabı anahtarını kullanarak kimlik doğrulaması yapar, bir SAS anahtarı talep eder ve LinkedServiceBasedSASProvider kullanarak bunu depolama isteğine otomatik olarak uygular.

Synapse, kullanıcıların belirli bir depolama hesabı için bağlı hizmeti ayarlamasına olanak tanır. Bu, tek bir Spark uygulamasında/sorgusunda birden çok depolama hesabından veri okumayı/yazmayı mümkün kılar. Spark.storage.synapse.{ Kullanılacak her depolama hesabı için source_full_storage_account_name}.linkedServiceName, Synapse belirli bir okuma/yazma işlemi için hangi bağlı hizmetin kullanılacağını anlar. Ancak Spark işimiz yalnızca tek bir depolama hesabıyla ilgileniyorsa depolama hesabı adını atlayabilir ve spark.storage.synapse.linkedServiceName kullanabiliriz

val sc = spark.sparkContext
val source_full_storage_account_name = "teststorage.dfs.core.windows.net"
spark.conf.set(s"spark.storage.synapse.$source_full_storage_account_name.linkedServiceName", "<LINKED SERVICE NAME>")
sc.hadoopConfiguration.set(s"fs.azure.account.auth.type.$source_full_storage_account_name", "SAS")
sc.hadoopConfiguration.set(s"fs.azure.sas.token.provider.type.$source_full_storage_account_name", "com.microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedSASProvider")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark
# Set the required configs
source_full_storage_account_name = "teststorage.dfs.core.windows.net"
spark.conf.set(f"spark.storage.synapse.{source_full_storage_account_name}.linkedServiceName", "<lINKED SERVICE NAME>")
sc._jsc.hadoopConfiguration().set(f"fs.azure.account.auth.type.{source_full_storage_account_name}", "SAS")
sc._jsc.hadoopConfiguration().set(f"fs.azure.sas.token.provider.type.{source_full_storage_account_name}", "com.microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedSASProvider")

# Python code
df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<DIRECTORY PATH>')

df.show()

Bağlı hizmet kimlik doğrulama yöntemi Yönetilen Kimlik veya Hizmet Sorumlusu olarak ayarlandığında, bağlı hizmet LinkedServiceBasedTokenProvider sağlayıcısıyla Yönetilen Kimlik veya Hizmet Sorumlusu belirtecini kullanır.

val sc = spark.sparkContext
val source_full_storage_account_name = "teststorage.dfs.core.windows.net"
spark.conf.set(s"spark.storage.synapse.$source_full_storage_account_name.linkedServiceName", "<LINKED SERVICE NAME>")
sc.hadoopConfiguration.set(s"fs.azure.account.oauth.provider.type.$source_full_storage_account_name", "com.microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedTokenProvider") 
val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark
# Python code
source_full_storage_account_name = "teststorage.dfs.core.windows.net"
spark.conf.set(f"spark.storage.synapse.{source_full_storage_account_name}.linkedServiceName", "<LINKED SERVICE NAME>")
sc._jsc.hadoopConfiguration().set(f"fs.azure.account.oauth.provider.type.{source_full_storage_account_name}", "com.microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedTokenProvider")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<DIRECTORY PATH>')

df.show()

Bağlı hizmetler olmadan ADLS 2. Nesil depolama

SAS anahtarı kullanarak doğrudan ADLS 2. Nesil depolamaya Bağlan. ConfBasedSASProvider ve komutunu kullanın ve yapılandırma ayarına spark.storage.synapse.sas SAS anahtarını sağlayın. SAS belirteçleri kapsayıcı düzeyinde, hesap düzeyinde veya genel olarak ayarlanabilir. İş birden fazla depolama hesabından okuma/yazma işlemi gerçekleştiremeyeceğinden SAS anahtarlarını genel düzeyde ayarlamanızı önermeyiz.

Depolama kapsayıcısı başına SAS yapılandırması

%%spark
sc.hadoopConfiguration.set("fs.azure.account.auth.type.<ACCOUNT>.dfs.core.windows.net", "SAS")
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.<CONTAINER>.<ACCOUNT>.dfs.core.windows.net.sas", "<SAS KEY>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark

sc._jsc.hadoopConfiguration().set("fs.azure.account.auth.type.<ACCOUNT>.dfs.core.windows.net", "SAS")
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.<CONTAINER>.<ACCOUNT>.dfs.core.windows.net.sas", "<SAS KEY>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')

display(df.limit(10))

Depolama hesabı başına SAS yapılandırması

%%spark
sc.hadoopConfiguration.set("fs.azure.account.auth.type.<ACCOUNT>.dfs.core.windows.net", "SAS")
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.<ACCOUNT>.dfs.core.windows.net.sas", "<SAS KEY>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark

sc._jsc.hadoopConfiguration().set("fs.azure.account.auth.type.<ACCOUNT>.dfs.core.windows.net", "SAS")
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.<ACCOUNT>.dfs.core.windows.net.sas", "<SAS KEY>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')

display(df.limit(10))

Tüm depolama hesaplarının SAS yapılandırması

%%spark
sc.hadoopConfiguration.set("fs.azure.account.auth.type", "SAS")
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.sas", "<SAS KEY>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark

sc._jsc.hadoopConfiguration().set("fs.azure.account.auth.type", "SAS")
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.sas", "<SAS KEY>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')

display(df.limit(10))

Azure Key Vault ile ADLS 2. Nesil depolama

Azure Key Vault gizli dizisinde depolanan sas belirtecini kullanarak ADLS 2. Nesil depolama alanına Bağlan.

%%spark
sc.hadoopConfiguration.set("fs.azure.account.auth.type", "SAS")
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.AkvBasedSASProvider")
spark.conf.set("spark.storage.synapse.akv", "<AZURE KEY VAULT NAME>")
spark.conf.set("spark.storage.akv.secret", "<SECRET KEY>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark
sc._jsc.hadoopConfiguration().set("fs.azure.account.auth.type", "SAS")
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.AkvBasedSASProvider")
spark.conf.set("spark.storage.synapse.akv", "<AZURE KEY VAULT NAME>")
spark.conf.set("spark.storage.akv.secret", "<SECRET KEY>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')

display(df.limit(10))

Diğer bağlı hizmetler için TokenLibrary

Diğer bağlı hizmetlere bağlanmak için TokenLibrary'ye doğrudan çağrı yapabilirsiniz.

get Bağlan ionString()

bağlantı dizesi almak için get Bağlan ionString işlevini kullanın ve bağlı hizmet adını geçirin.

%%spark
// retrieve connectionstring from mssparkutils

mssparkutils.credentials.getFullConnectionString("<LINKED SERVICE NAME>")
%%pyspark
# retrieve connectionstring from mssparkutils

mssparkutils.credentials.getFullConnectionString("<LINKED SERVICE NAME>")
%%csharp
// retrieve connectionstring from TokenLibrary

using Microsoft.Spark.Extensions.Azure.Synapse.Analytics.Utils;

string connectionString = TokenLibrary.GetConnectionString(<LINKED SERVICE NAME>);
Console.WriteLine(connectionString);

getPropertiesAll()

getPropertiesAll, bağlı bir hizmetin tüm özelliklerini almak için Scala ve Python'da kullanılabilen bir yardımcı işlevdir

%%pyspark
import json
# retrieve connectionstring from mssparkutils

json.loads(mssparkutils.credentials.getPropertiesAll("<LINKED SERVICE NAME>"))

Çıkış şuna benzer olacaktır:

{
    'AuthType': 'Key',
    'AuthKey': '[REDACTED]',
    'Id': None,
    'Type': 'AzureBlobStorage',
    'Endpoint': 'https://storageaccount.blob.core.windows.net/',
    'Database': None
}

GetSecret()

Azure Key Vault'tan depolanan bir gizli diziyi almak için Synapse çalışma alanında Azure Key Vault'a bağlı bir hizmet oluşturmanızı öneririz. Synapse çalışma alanı yönetilen hizmet kimliğine Azure Key Vault için GET Gizli Dizileri izni verilmesi gerekir. Bağlı hizmet, gizli diziyi almak üzere Azure Key Vault hizmetine bağlanmak için yönetilen hizmet kimliğini kullanır. Aksi takdirde, doğrudan Azure Key Vault'a bağlanmak kullanıcının Microsoft Entra kimlik bilgilerini kullanır. Bu durumda kullanıcıya Azure Key Vault'ta Gizli Dizi Al izinlerinin verilmesi gerekir.

Kamu bulutlarında lütfen anahtar kasasının tam etki alanı adını belirtin.

mssparkutils.credentials.getSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>" [, <LINKED SERVICE NAME>])

Azure Key Vault'tan gizli dizi almak için mssparkutils.credentials.getSecret() işlevini kullanın.


mssparkutils.credentials.getSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>", "<LINKED SERVICE NAME>")

mssparkutils.credentials.getSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>", "<LINKED SERVICE NAME>")
using Microsoft.Spark.Extensions.Azure.Synapse.Analytics.Utils;

string connectionString = TokenLibrary.GetSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>", "<LINKED SERVICE NAME>");
Console.WriteLine(connectionString);

Spark çalışma zamanından desteklenen bağlı hizmet bağlantıları

Azure Synapse Analytics çeşitli bağlı hizmet bağlantılarını (işlem hatlarından ve diğer Azure ürünlerinden) desteklese de bunların tümü Spark çalışma zamanında desteklenmez. Desteklenen bağlı hizmetlerin listesi aşağıdadır:

  • Azure Blob Storage
  • Azure yapay zeka hizmetleri
  • Azure Cosmos DB
  • Azure Data Explorer
  • MySQL için Azure Veritabanı
  • PostgreSQL için Azure Veritabanı
  • Azure Data Lake Store (1. Nesil)
  • Azure Key Vault
  • Azure Machine Learning
  • Azure Purview
  • Azure SQL Veritabanı
  • Azure SQL Veri Ambarı (Ayrılmış ve Sunucusuz)
  • Azure Depolama

mssparkutils.credentials.getToken()

Hizmetlere doğrudan erişmek için OAuth taşıyıcı belirtecine getToken ihtiyacınız olduğunda yöntemini kullanabilirsiniz. Aşağıdaki kaynaklar desteklenir:

Hizmet Adı API çağrısında kullanılacak dize değişmez değeri
Azure Depolama Storage
Azure Key Vault Vault
Azure Yönetimi AzureManagement
Azure SQL Veri Ambarı (Ayrılmış ve Sunucusuz) DW
Azure Synapse Synapse
Azure Data Lake Store DataLakeStore
Azure Data Factory ADF
Azure Veri Gezgini AzureDataExplorer
MySQL için Azure Veritabanı AzureOSSDB
MariaDB için Azure Veritabanı AzureOSSDB
PostgreSQL için Azure Veritabanı AzureOSSDB

Spark çalışma zamanından desteklenmeyen bağlı hizmet erişimi

Aşağıdaki bağlı hizmetlere erişme yöntemleri Spark çalışma zamanında desteklenmez:

  • Bağımsız değişkenleri parametreli bağlı hizmete geçirme
  • Kullanıcı tarafından atanan yönetilen kimliklerle (UAMI) Bağlan
  • Sistem Tarafından Atanan Yönetilen kimlikler Keyvault kaynağında desteklenmiyor
  • Azure Cosmos DB bağlantıları için tek başına anahtar tabanlı erişim desteklenir. Belirteç tabanlı erişim desteklenmez.

Not defteri veya Spark işi çalıştırılırken, bağlı hizmet kullanarak belirteç/gizli dizi alma istekleri 'BadRequest' hata iletisiyle başarısız olabilir. Bunun nedeni genellikle bağlı hizmetle ilgili bir yapılandırma sorunudur. Bu hata iletisini görürseniz lütfen bağlı hizmetinizin yapılandırmasını denetleyin. Sorularınız varsa lütfen Azure portalından Microsoft Azure Desteği'ne başvurun.