通过 JDBC 访问非托管(外部)Azure Databricks Hive table

Access unmanaged (external) Azure Databricks Hive table via JDBC

我将 Azure Databricks 与 Databricks Runtime 5.2 和 Spark 2.4.0 一起使用。我以两种不同的方式设置了外部 Hive tables: - Databricks Delta table,其中数据存储在 Azure Data Lake Storage (ADLS) Gen 2 中,table 是使用位置设置创建的,它指向 ADLS Gen 2 中的已安装目录。 - 一个常规 DataFrame,保存为 ADLS Gen 2 的 table,这次不使用挂载,而是使用我在集群级别上使用 spark.sparkContext.hadoopConfiguration[= 设置的 OAuth2 凭据32=]

挂载点和直接访问 (hadoopConfiguration) 均已使用 OAuth2 凭据和 Azure AD 服务主体配置,后者具有数据湖的必要访问权限。

两个 table 都在 Databricks UI 中正确显示并且可以查询。

这两个 table 在 BI 工具 (Looker) 中也可见,我已在其中成功配置了与我的 Databricks 实例的 JDBC 连接。此后差异开始:

1) table 使用挂载点配置不允许我在 BI 工具中 运行 DESCRIBE 操作,更不用说查询了。一切都失败并出现错误 "com.databricks.backend.daemon.data.common.InvalidMountException: Error while using path /mnt/xxx/yyy/zzz for resolving path '/yyy/zzz' within mount at '/mnt/xxx'."

2) table 配置使用没有安装点允许我 运行 DESCRIBE 操作,但查询失败并出现错误 "java.util.concurrent.ExecutionException: java.io.IOException: There is no primary group for UGI (Basic token) (auth:SIMPLE)"。

JDBC 从 BI 工具到 Databricks 中的 managed table 的连接和查询工作正常。

据我所知,在创建外部 tables、配置挂载点或 OAuth2 凭据时,我无法进行任何不同的配置。在我看来,当使用 JDBC 时,挂载根本不可见,因此对底层数据源(ADLS Gen 2)的请求无法成功。另一方面,第二种情况(上面的第 2 种情况)有点令人费解,在我看来似乎是某种隐藏在深处的东西,我不知道该怎么做。

我的用户名也很奇怪,它出现在场景 2 中。我不知道它从何而来,因为在使用服务主体设置 ADLS Gen 2 访问时不涉及它。

我有一个类似的问题,我通过在我的 Databricks 集群中添加这个参数解决了这个问题:

spark.hadoop.hive.server2.enable.doAs 假

参见:https://docs.databricks.com/user-guide/faq/access-blobstore-odbc.html

RB