DBFS使用dbutils實現儲存服務的裝載(mount、掛載),使用者可以把Azure Data Lake Storage Gen2和Azure Blob Storage 賬戶裝載到DBFS中。mount是data lake storage和 blob storage的指標,因此資料不會同步到本地。
一,建立Azure Data Lake Storage Gen2
從Azure Portal中搜尋Storage Account,開始建立Data Lake V2
1,建立Data Lake V2的詳細步驟
Step1:從Basics選項卡中,選擇Account Kind為:StorageV2(General purpose v2)
Step2:Networking 使用預設值
Step3:Data Protection 使用預設值
Step4:Advanced選項卡,啟用"Hierarchical namespace"
2,為Data Lake V2建立檔案系統
進入到Data Lake V2的資源頁面中,從“Tools and SDKs”中選擇“Storage Explorer”,
進入到Storage Explorer中,右擊CONTAINERS,選擇“Create file system”:
二,建立App registraation
為了在ADLS Gen 2和Azure Databricks之間建立連線,需要應用程式連線,如果在Azure Active Directory中將應用程式註冊配置為“是”,則非管理員使用者可以註冊自定義開發的應用程式以在此目錄中使用。
1,建立App
從Azure Portal中搜尋“Azure Active Directory”,選擇“App registration”,建立vic_test_app
建立完成之後,點選“App registrations”,從“Owned applications”中點選vic_test_app。
2,為該app新增app secret(驗證金鑰),以訪問該app
複製Client Secret 的Value欄位,因為執行其他操作之後,這個值將無法再檢視到。
3,得到的資料
三,把Service Principal的許可權授予Data Lake V2賬戶
我們需要為Service Principal分配訪問角色,該Service Principal是在註冊App時自動建立,以訪問儲存賬戶中的資料。
四,建立Key Vault
Key Vault服務用於安全地儲存key、密碼、證書等secret,需要把從已註冊的app中獲取到的金鑰儲存到Key Vault中。
1:建立Key Vault
在Key Vault建立完成之後,向Key Vault中新增一個Secret,
2:儲存Secret
定義Secret的Name,把從已註冊的app中獲取到的Client Secret儲存到Secret的Value中。
3,從Key Vault得到的資料
從Key Vault的Settings中點選“Properties”
五,建立Azure Key Vault-backed的Secret Scope
使用Secret Scope來管理Secret,Secret Scope是Secret構成的,該Secret是由name來唯一標識的。
Step1,導航到建立Secret Scope的頁面
根據Databricks例項,導航到建立Secret Scope的頁面,注意該URI是區分大小寫的。
https://<databricks-instance>#secrets/createScope
Step2,輸入Secret Scope的屬性
ScopeName是區分大小寫的,並且DNS Name和Resource ID都必須從Key Vault中複製。
六 ,掛載Data Lake Storage Gen2
通過建立 Azure Data Lake Storage Gen2的檔案系統,註冊App、建立Key Vault、建立Secret Scope,我們完成了把Data Lake Gen2掛載到DBFS的所有準備工作,並獲得了以下資料:
- Client ID (a.k.a. Application ID)
- Client Secret (a.k.a. Application Secret)
- Directory ID (a.k.a Tenant ID)
- Databricks Secret Scope Name
- Key Name for Service Credentials (from Azure Key Vault, it is the secret's name)
- File System Name
- Storage Account Name
- Mount Name
Databricks提供了掛載命令:dbutils.mount(),通過該命令,我們可以把Azure Data Lake Storage Gen2掛載到DBFS中。掛載操作是一次性的操作,一旦掛載操作完成,就可以把遠端的Data Lake Gen2的file system當作本地檔案來使用。
1,掛載Azure Data Lake Storage Gen2
使用服務主體(Service Principal)和OAuth 2.0進行身份驗證,把Azure Data Lake Storage Gen2帳戶裝載到DBFS,該裝載點(mount pointer)是資料湖儲存的指標,資料不需要同步到本地,但是隻要遠端檔案系統中的資料有更新,我們就能獲得資料的更新。
掛載Data Lake Storage Gen2檔案系統,目前只支援OAuth 2.0 Credential:
###################################################################################### # Set the configurations. Here's what you need: ## 1.) Client ID (a.k.a Application ID) ## 2.) Client Secret (a.k.a. Application Secret) ## 3.) Directory ID ## 4.) File System Name ## 5.) Storage Account Name ## 6.) Mount Name ###################################################################################### configs = {"fs.azure.account.auth.type": "OAuth", "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider", "fs.azure.account.oauth2.client.id": "<client-id>", "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"), "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<directory-id>/oauth2/token"} ###################################################################################### # Optionally, you can add <directory-name> to the source URI of your mount point. ###################################################################################### dbutils.fs.mount( source = "abfss://<file-system-name>@<storage-account-name>.dfs.core.windows.net/", mount_point = "/mnt/<mount-name>", extra_configs = configs)
引數註釋:
- <Client-id>:App ID
- <scope-name>:Secret Scope的名稱
- <key-name-for-service-credential>:Azure Key Vault
- <directory-id>:tenant Id
<mount-name>
:是DBFS path,表示Data Lake Store或其中的一個Folder在DBFS中裝載的位置dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>")
:從Secret Scope中的Secret中獲取服務憑證- <file-system-name>:檔案系統的名稱
- <storage-account-name>:儲存賬戶的名稱
2,訪問掛載點
訪問掛載點中的檔案,可以通過pyspark.sql來訪問:
df = spark.read.text("/mnt/%s/...." % <mount-name>) df = spark.read.text("dbfs:/mnt/<mount-name>/....")
或者通過SQL命令來訪問:
%sql select * from csv.`/mnt/mount_datalakeg2/stword.csv`
3,重新整理掛載點
dbutils.fs.refreshMounts()
4,解除安裝掛載點:
dbutils.fs.unmount("/mnt/<mount-name>")
參考文件:
Mounting & accessing ADLS Gen2 in Azure Databricks using Service Principal and Secret Scopes
Mount an ADLS Gen 2 to Databricks File System Using a Service Principal and OAuth 2.0 (Ep. 5)