我正在将Azure Databricks与Databricks Runtime 5.2和Spark 2.4.0一起使用。我以两种不同的方式设置了外部Hive表: -Databricks Delta表,数据存储在第2代Azure Data Lake Storage(ADLS)中,该表是使用位置设置创建的,该位置指向ADLS第2代中的已安装目录。 -常规的DataFrame,以表格形式保存到ADLS Gen 2,这次不使用安装,而是使用 spark.sparkContext.hadoopConfiguration
在集群级别设置的OAuth2凭据已使用OAuth2凭据和Azure AD服务主体配置了挂载点和直接访问(hadoopConfiguration),该主体具有对Data Lake的必要访问权限。
两个表都可以正确显示在Databricks UI中,并且可以查询。
这两个表在BI工具(Looker)中也可见,在这里我已经成功配置了到Databricks实例的JDBC连接。之后,差异开始:
1)使用安装点配置的表不允许我在BI工具中运行DESCRIBE操作,更不用说查询了。一切都失败,并显示错误“ com.databricks.backend.daemon.data.common.InvalidMountException:使用路径/ mnt / xxx / yyy / zzz解析安装在'/ mnt / xxx'内的路径'/ yyy / zzz'时出错。 “
2)配置为不使用挂载点的表允许我运行DESCRIBE操作,但是查询失败,错误为“ java.util.concurrent.ExecutionException:java.io.IOException:UGI没有主要组(基本令牌) )(auth:SIMPLE)”。
从BI工具到Databricks中的托管表的JDBC连接和查询工作正常。
据我所知,创建外部表,配置安装点或OAuth2凭据时,我可以进行任何配置。在我看来,当使用JDBC时,挂载根本不可见,因此对基础数据源(ADLS Gen 2)的请求无法成功。另一方面,第二种情况(上面的数字2)有些令人费解,在我看来,这似乎是在幕后的某个深处,我不知道该怎么办。
我的用户名也是一个奇特的事情,它出现在方案2中。我不知道该用户名来自哪里,因为使用服务主体设置ADLS Gen 2访问时不涉及该用户名。
答案 0 :(得分:2)
我遇到了类似的问题,我通过在Databricks集群中添加此参数来解决了这个问题:
spark.hadoop.hive.server2.enable.doAs为假
请参阅:https://docs.databricks.com/user-guide/faq/access-blobstore-odbc.html
RB