You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,具体步骤如下:

  1. 在ADF v1中创建Azure Data Lake Store链接服务,选择认证方式(服务主体或用户凭据)并配置ADLS账户信息。
  2. 创建按需HDInsight集群链接服务,在「数据源」选项卡中选择刚才创建的ADLS链接服务作为集群的默认存储。
  3. 创建Spark/Hive活动,直接指定ADLS中的路径作为输入和输出路径,ADF v1会自动配置HDInsight集群访问ADLS,无需额外复制操作。

⚠️ 注意:ADF v1已经处于退休阶段(微软仅维护到2024年9月,不再提供新功能),如果是新项目,强烈建议使用ADF v2的方案。


内容的提问来源于stack exchange,提问作者Siddiqui Mind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:32:46