我想创建一个可以访问ADLSg1和ADLSg2数据湖的Azure HDI集群。支持这个吗?
这在Spark 2.4 (HDI 4.0)有限制的情况下是可能的:
- 集群的主存储必须be Azure Blob
- 集群将通过服务主体+客户端秘密与ADLSg1和ADLSg2进行身份验证。服务主体和秘密必须手工管理。
- 这不能通过Azure门户完成。您必须通过Ambari UI或ssh手动更改集群的
core-site.xml
配置。
步骤:
- 查找Azure AD租户ID
- 在Azure AD中注册应用程序,并为每个ADLS帐户创建服务主体。请注意申请ID。
- 为步骤1中创建的每个AAD应用程序创建一个新的应用程序秘密。注意生成的客户端秘密。
- 将Owner角色授予与ADLSg1帐户关联的服务主体
- 将存储Blob数据所有者角色授予与ADLSg2帐户关联的服务主体。
- 部署HDI集群,仅将Azure Blob作为主存储。
- 打开HDI集群的Ambari UI
- 导航到HDFS→配置选项卡UI→高级选项卡
- 展开"自定义核心站点"部分
- 添加以下设置:
For ADLS Gen 1:
fs.adl.oauth2.access.token.provider.type = ClientCredential
fs.adl.oauth2.client.id = <ADLSg1 Application ID>
fs.adl.oauth2.credential = <ADLSg1 Client Secret>
fs.adl.oauth2.refresh.url = https://login.microsoftonline.com/<Tenant ID>/oauth2/token
对于ADLS Gen 2:
fs.azure.account.auth.type.<ADLSg2 storage account name>.dfs.core.windows.net = OAuth
fs.azure.account.oauth.provider.type.<ADLSg2 storage account name>.dfs.core.windows.net = org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
fs.azure.account.oauth2.client.id.<ADLSg2 storage account name>.dfs.core.windows.net = <ADLSg2 Application ID>
fs.azure.account.oauth2.client.secret.<ADLSg2 storage account name>.dfs.core.windows.net = <ADLSg1 Client Secret>
fs.azure.account.oauth2.client.endpoint.<ADLSg2 storage account name>.dfs.core.windows.net = https://login.microsoftonline.com/<Tenant ID>/oauth2/token
- 保存更改
- 重启集群中所有受影响的服务(HDFS、YARN等)
从集群访问文件:
使用完全限定名。使用这种方法,您可以提供要访问的文件的完整路径。
- ADLSg1:
adl://<data_lake_account>.azuredatalakestore.net/<cluster_root_path>/<file_path>
- ADLSg2:
abfs://<containername>@<accountname>.dfs.core.windows.net/<file.path>/