Databricks 第8篇:把Azure Data Lake Storage Gen2 (ADLS Gen 2)挂载到DBFS

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是区分大小写的。

//<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": "//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)

Azure Data Lake Storage Gen2

Secret management