ADF中使用按需HDInsight Spark集群访问Data Lake的高效方法咨询
好问题!针对你遇到的ADF v2按需HDInsight Spark集群访问Azure Data Lake Storage(ADLS)的痛点,确实有更高效的方案,不用先把数十亿文件复制到Blob Storage。下面分两部分给你解答:
ADF v2:直接通过Spark脚本访问ADLS
ADF v2虽然不支持直接为按需HDInsight集群配置ADLS链接服务,但你可以在Spark作业脚本中直接认证并访问ADLS,完全绕开复制数据的步骤。具体分两种ADLS版本来说:
1. 访问ADLS Gen2(ABFS协议)
你可以用ABFS(Azure Blob File System)协议直接在Spark脚本中读写ADLS Gen2,推荐用Azure AD服务主体或托管标识(MSI)认证,避免硬编码密钥:
用服务主体认证的Python脚本示例:
# 配置ADLS Gen2访问参数 spark.conf.set("fs.azure.account.auth.type.your-adls-account.dfs.core.windows.net", "OAuth") spark.conf.set("fs.azure.account.oauth.provider.type.your-adls-account.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") spark.conf.set("fs.azure.account.oauth2.client.id.your-adls-account.dfs.core.windows.net", "<你的服务主体Client ID>") spark.conf.set("fs.azure.account.oauth2.client.secret.your-adls-account.dfs.core.windows.net", "<你的服务主体密钥>") spark.conf.set("fs.azure.account.oauth2.client.endpoint.your-adls-account.dfs.core.windows.net", "https://login.microsoftonline.com/<你的租户ID>/oauth2/token") # 直接读取ADLS Gen2中的文件(支持批量匹配,比如通配符) df = spark.read.parquet("abfss://your-container@your-adls-account.dfs.core.windows.net/path/to/billions-of-files/*.parquet") # 处理逻辑... df.write.parquet("abfss://your-container@your-adls-account.dfs.core.windows.net/path/to/output/")
用托管标识(更安全):
如果给按需HDInsight集群启用了系统分配或用户分配的MSI,只需调整配置:
spark.conf.set("fs.azure.account.auth.type.your-adls-account.dfs.core.windows.net", "OAuth") spark.conf.set("fs.azure.account.oauth.provider.type.your-adls-account.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider") spark.conf.set("fs.azure.account.oauth2.msi.endpoint.your-adls-account.dfs.core.windows.net", "http://localhost:50342/oauth2/token") # 如果是用户分配的MSI,需要添加下面这行 spark.conf.set("fs.azure.account.oauth2.msi.client.id.your-adls-account.dfs.core.windows.net", "<你的MSI Client ID>")
2. 访问ADLS Gen1
对于ADLS Gen1,用ADL协议直接访问,同样通过服务主体认证:
# 配置ADLS Gen1访问 spark.conf.set("fs.adl.account.your-adls-account.oauth2.access.token.provider.type", "ClientCredential") spark.conf.set("fs.adl.account.your-adls-account.oauth2.client.id", "<服务主体Client ID>") spark.conf.set("fs.adl.account.your-adls-account.oauth2.credential", "<服务主体密钥>") spark.conf.set("fs.adl.account.your-adls-account.oauth2.refresh.url", "https://login.microsoftonline.com/<租户ID>/oauth2/token") # 读取ADLS Gen1文件 df = spark.read.csv("adl://your-adls-account.azuredatalakestore.net/path/to/files/*.csv")
关键注意事项:
- 权限配置:给服务主体/MSI分配ADLS的对应权限(比如ADLS Gen2的
Storage Blob Data Contributor,Gen1的Data Lake Store Contributor)。 - 性能优化:处理数十亿文件时,尽量用通配符批量读取、合并小文件、利用Spark分区并行处理,避免逐个文件遍历。
- 密钥管理:不要硬编码密钥,建议把服务主体密钥存在Azure Key Vault,通过ADF的Spark活动传递参数,或者让HDInsight集群直接访问Key Vault。
ADF v1:支持直接配置ADLS链接服务
ADF v1确实支持直接为按需HDInsight集群配置ADLS作为存储源,不需要复制数据到Blob,具体步骤如下:
- 在ADF v1中创建Azure Data Lake Store链接服务,选择认证方式(服务主体或用户凭据)并配置ADLS账户信息。
- 创建按需HDInsight集群链接服务,在「数据源」选项卡中选择刚才创建的ADLS链接服务作为集群的默认存储。
- 创建Spark/Hive活动,直接指定ADLS中的路径作为输入和输出路径,ADF v1会自动配置HDInsight集群访问ADLS,无需额外复制操作。
⚠️ 注意:ADF v1已经处于退休阶段(微软仅维护到2024年9月,不再提供新功能),如果是新项目,强烈建议使用ADF v2的方案。
内容的提问来源于stack exchange,提问作者Siddiqui Mind
相关产品推荐
相关产品推荐

