无网络Azure Databricks集群安装ODBC驱动及Synapse只读访问咨询
从Azure Databricks访问Azure Synapse Analytics的权限与驱动问题
问题背景
我的目标是从Azure Databricks访问Azure Synapse Analytics。最初考虑使用Spark驱动com.databricks.spark.sqldw,但该驱动要求数据库用户拥有db_owner权限,这并不合适——用户可能会误操作Synapse,我仅希望用户用自身Active Directory账号读取Synapse数据。
随后尝试通过ODBC/JDBC驱动访问,就像本地Python脚本那样操作,但Databricks集群无网络访问权限,没法执行apt-get类命令安装ODBC驱动。
现在需要解决以下任一问题即可:
- 如何将Azure存储账户Gen2中的文件复制到Databricks集群本地文件系统?我已把ODBC Driver 17 for SQL Server(
msodbcsql17_17.10.1.1-1_amd64.deb)上传到存储账户容器,能通过dbutils查看,能不能复制到集群文件系统? - 是否可以使用默认Spark驱动
com.databricks.spark.sqldw,仅以SELECT权限访问Azure Synapse Analytics?
补充说明:没使用Synapse Apache Spark池是因为无法运行SELECT * FROM A INNER JOIN B...这类查询,且Databricks的UI体验更好。
解决方案
问题1:将存储账户Gen2的文件复制到Databricks集群本地
可以通过dbutils.fs.cp命令完成复制,步骤如下:
- 确认存储账户的ABFS路径格式:
abfss://<容器名>@<存储账户名>.dfs.core.windows.net/<deb文件路径> - 执行复制命令,将文件复制到集群临时目录(如
/tmp/):
dbutils.fs.cp("abfss://container@storageaccount.dfs.core.windows.net/msodbcsql17_17.10.1.1-1_amd64.deb", "file:/tmp/msodbcsql17_17.10.1.1-1_amd64.deb")
- 验证文件是否存在:
%sh ls /tmp/
注意:集群重启后本地临时目录的文件会被清空,建议将复制+安装步骤写入集群初始化脚本,确保节点启动时自动执行。
问题2:使用com.databricks.spark.sqldw仅以SELECT权限访问
完全可以实现,无需db_owner权限,关键是配置正确的权限和连接参数:
- 权限配置:
- 给AD账号在Synapse数据库分配
db_datareader角色,或针对特定表/视图分配精细的SELECT权限 - 确保AD账号拥有Synapse工作区访问权限,以及用于临时数据传输的Blob存储账户的读写权限(驱动需要临时存储中转数据)
- 给AD账号在Synapse数据库分配
- 连接示例代码:
df = spark.read \ .format("com.databricks.spark.sqldw") \ .option("url", "jdbc:sqlserver://<synapse服务器>.database.windows.net:1433;database=<数据库名>;Authentication=ActiveDirectoryIntegrated;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;") \ .option("tempDir", "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/temp") \ .option("forwardSparkAzureStorageCredentials", "true") \ .option("query", "SELECT * FROM your_table") \ .load()
内容的提问来源于stack exchange,提问作者Daniel Bonetti
相关产品推荐
相关产品推荐

