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, bir depolama hesabındaki bir bloba erişmek için Microsoft Entra geçişini kullanmak istiyorsanız, önce o depolama hesabına giderek kendinize blob katkıda bulunan rolünü atamanız gerekir.

Azure Key Vault'tan sırları 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 Alma izinlerine 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ı bir hizmet olmadan doğrudan Azure Key Vault'a bağlandığınızda, kullanıcı Microsoft Entra kimlik bilgilerinizi kullanarak kimlik doğrulaması yapın.

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

Kullanım

belirteçler ve gizliler için mssparkutils yardımı

Bu işlev, Synapse'te gizli veriler ve belirteç yönetimi için yardım belgelerini gösterir.

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 Nesil 2'ye Erişim

ADLS 2. Nesil Birincil Depolama

Birincil Azure Data Lake Storage'dan dosyalara erişmek, varsayılan olarak kimlik doğrulaması için Microsoft Entra geçişini kullanır ve mssparkutils'in açıkça kullanılmasını gerektirmez. 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ı isteyin ve LinkedServiceBasedSASProvider kullanarak bunu depolama isteğine otomatik olarak uygulayın.

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. Kullanılacak her depolama hesabı için ayarlama spark.storage.synapse.{source_full_storage_account_name}.linkedServiceName yaptığımızda Synapse, belirli bir okuma/yazma işlemi için hangi bağlı hizmetin kullanılacağını belirler. Ancak Spark işimiz yalnızca tek bir depolama hesabıyla ilgileniyorsa depolama hesabı adını atlayabilir ve kullanabiliriz spark.storage.synapse.linkedServiceName.

Not

Varsayılan ABFS depolama kapsayıcısının kimlik doğrulama yöntemini değiştirmek mümkün değildir.

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

Spark yapılandırması aracılığıyla kimlik doğrulama ayarlarını belirleme

Kimlik doğrulama ayarları spark deyimlerini çalıştırmak yerine Spark yapılandırmaları aracılığıyla da belirtilebilir. Tüm Spark yapılandırmalarına ön ek spark. eklenmelidir ve tüm hadoop yapılandırmalarına ön ek spark.hadoop.eklenmelidir.

Spark yapılandırma adı Yapılandırma değeri
spark.storage.synapse.teststorage.dfs.core.windows.net.linkedServiceName BAĞLı HIZMET ADı
spark.hadoop.fs.azure.account.oauth.provider.type.teststorage.dfs.core.windows.net microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedTokenProvider

Bağlı hizmetler olmadan ADLS 2. Nesil depolama

SAS anahtarı kullanarak ADLS 2. Nesil depolamaya doğrudan bağlanın. ConfBasedSASProvider kullanın ve spark.storage.synapse.sas yapılandırma ayarına 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))

Belirteçleri almak için MSAL kullanma (özel uygulama kimlik bilgilerini kullanarak)

ABFS depolama sürücüsü kimlik doğrulamaları için MSAL'yi doğrudan kullanacak şekilde yapılandırıldığında , sağlayıcı belirteçleri önbelleğe almaz. Bu, güvenilirlik sorunlarına neden olabilir. ClientCredsTokenProvider'ın Synapse Spark'ın bir parçası olarak kullanılmasını öneririz.

%%spark
val source_full_storage_account_name = "teststorage.dfs.core.windows.net"
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.$source_full_storage_account_name", "<Entra AppId>")
spark.conf.set("fs.azure.account.oauth2.client.secret.$source_full_storage_account_name", "<Entra app secret>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint.$source_full_storage_account_name", "https://login.microsoftonline.com/<tenantid>")

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

display(df.limit(10))
%%pyspark
source_full_storage_account_name = "teststorage.dfs.core.windows.net"
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ClientCredsTokenProvider")
spark.conf.set(f"fs.azure.account.oauth2.client.id.{source_full_storage_account_name}.linkedServiceName", "<Entra AppId>")
spark.conf.set(f"fs.azure.account.oauth2.client.secret.{source_full_storage_account_name}.linkedServiceName", "<Entra app secret>")
spark.conf.set(f"fs.azure.account.oauth2.client.endpoint.{source_full_storage_account_name}.linkedServiceName", "https://login.microsoftonline.com/<tenantid>")

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

SAS belirteci ile ADLS 2. Nesil depolama (Azure Key Vault'tan)

Azure Key Vault gizli dizisinde depolanan bir SAS belirtecini kullanarak ADLS 2. Nesil depolamaya bağlanın.

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

getConnectionString()

Bağlantı dizesini almak için getConnectionString 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'ta saklanan gizli bir bilgiyi almak için, Synapse çalışma alanında Azure Key Vault'a bağlı bir hizmet oluşturmanızı tavsiye ederiz. Synapse çalışma alanı yönetilen hizmet kimliğine Azure Key Vault için GET Gizli Dizileri izni verilmesi gerekir. Bağlı hizmet, Azure Key Vault hizmetine bağlanarak sırrı almak için yönetilen hizmet kimliği 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 Anahtar Al izinleri verilmelidir.

Kamu bulutlarında keyvault'un tam etki alanı adını sağlayın.

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

Azure Key Vault'tan bir 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
  • Döküm Araçları
  • 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 Storage Storage
Azure Key Vault Vault
Azure Management AzureManagement
Azure SQL Data Warehouse (Dedicated and Serverless) DW
Azure Synapse Synapse
Azure Data Lake Store DataLakeStore
Azure Data Factory ADF
Azure Data Explorer AzureDataExplorer

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 bağlantılar (UAMI)
  • Defteriniz/SparkJobDefinition yönetilen kimlik olarak çalıştığında KeyVault kaynağına taşıyıcı belirteci alma
    • Alternatif olarak, erişim belirteci almak yerine Keyvault'a bağlı bir hizmet oluşturabilir ve gizliyi Not Defterinizden veya toplu iş görevinizden alabilirsiniz.
  • 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ğlantılı bir hizmet kullanarak belirteç/gizli anahtar 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 Azure portalından Microsoft Azure Desteği'ne başvurun.