当前位置: 首页 > 知识库问答 >
问题:

在闪亮的Databricks连接中支持Azure Data Lake Gen 2凭据传递需要额外的配置?

令狐昂雄
2023-03-14

我有一个Azure Databricks (Databricks 6.4(包括Apache Spark 2.4.5、Scala 2.11))标准集群,配置了Active Directory passthrough来支持查询Azure Data Lake Gen 2存储帐户。

ADLS是通过蟒蛇安装的:

configs = {
  "fs.azure.account.auth.type": "CustomAccessToken",
  "fs.azure.account.custom.token.provider.class":   spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
}


dbutils.fs.mount(
  source = "abfss://taxi@purelyexample.dfs.core.windows.net/",
  mount_point = "/mnt/taxi",
  extra_configs = configs)

使用databricks笔记本中的{sparkR}返回结果。

taxiall <- read.df("/mnt/taxi/yellow",source="parquet")
collect(mean(rollup(taxiall, "vendorID", "puLocationId"), "totalAmount"))

使用 {sparklyr} 会使令牌出现问题。

library(sparklyr)
library(dplyr)
sc <- spark_connect(method = "databricks")
yellowtaxi <- spark_read_parquet(path="/mnt/taxi/yellow",sc=sc)
yellow_taxi %>%
  group_by(vendorID, puLocationId) %>%
  summarise(avgFare= mean(totalAmount), n= n()) ->
  fares

collect(fares)

错误:com . databricks . back end . daemon . data . client . ADL . azurecredentialnotfoundexception:找不到ADLS Gen2令牌

是否需要其他额外的东西来确保sparkyr与凭证传递一起工作?

共有2个答案

笪建章
2023-03-14

注意:仅支持使用OAuth凭据安装Azure Data Lake Storage Gen2。不支持使用帐户访问密钥装载。

原因:Sparklyr 中的spark_read_csv函数无法提取 ADLS 令牌以启用身份验证和读取数据。

解决方案:解决方法是使用 Azure 应用程序 ID、应用程序密钥和目录 ID 在 DBFS 中装载 ADLS 位置。

**挂载Azure Data Lake Storage Gen2文件系统:**

若要装载 Azure 数据湖存储 Gen2 文件系统或其中的文件夹,请使用以下命令:

Scala代码:

val configs = Map(
  "fs.azure.account.auth.type" -> "OAuth",
  "fs.azure.account.oauth.provider.type" -> "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
  "fs.azure.account.oauth2.client.id" -> "<application-id>",
  "fs.azure.account.oauth2.client.secret" -> dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
  "fs.azure.account.oauth2.client.endpoint" -> "https://login.microsoftonline.com/<directory-id>/oauth2/token")

// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<file-system-name>@<storage-account-name>.dfs.core.windows.net/",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

Python代码:

configs = {"fs.azure.account.auth.type": "OAuth",
           "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
           "fs.azure.account.oauth2.client.id": "<application-id>",
           "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
           "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<file-system-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)

参考:使用Sparklyr和“使用服务主体和OAuth 2.0挂载Azure Data Lake Storage Gen2帐户”从ADLS Gen1/gen2读取数据时出错。

慕永年
2023-03-14

为了使用AD passthrough,您必须在scala的单用户模式下使用集群,或者在多用户模式下使用Python和SQL不幸的是,它没有提到R,可能根本不支持!

您可以尝试高并发集群,看看它是否正常工作。这都是因为每个用户的进程都需要隔离,以确保安全。因为R是JVM之上的互操作,所以可以以支持Python的方式来支持它,尽管文档中没有这样说,并且当您在集群配置中选中此选项时,它在自动配置中看起来没有启用。他们可能只是没有时间去做,因为绝大多数用户现在都在这个平台上使用python。

这里详细介绍了它 - 但不是最好的书面文档。

https://learn . Microsoft . com/en-us/azure/databricks/security/credential-pass through/adls-pass through

 类似资料:
  • 26.8. 增加对额外元数据API的支持 如果你希望提供对其它元数据API的支持,这很容易实现。 简单实现org.springframework.metadata.Attributes接口,并把它作为你的元数据API的门面。你就可以像前文所示那样在你的bean定义中包含这个对象。 所有象AOP元数据驱动自动代理这样的使用元数据的框架服务,都自动能使用你新建的元数据提供者。

  • 问题内容: 我的Node Web应用程序需要一个持久的MySQL连接。问题是每天大约发生几次这种情况: 这是我的连接代码: 如您所见,handleDisconnect代码不起作用。 问题答案: 使用mysql连接池。当连接断开时它将重新连接,您将获得额外的好处,即能够同时进行多个sql查询。如果您不使用数据库池,则您的应用将在等待当前运行的数据库请求完成时阻止数据库请求。 我通常定义一个数据库模块

  • 当我尝试使用Google Cloud Spanner开源JDBC驱动程序进行连接时,我得到以下错误消息: 我不认为模拟器需要任何凭据才能在本地工作。有办法绕过这个错误吗?谢谢你。

  • 问题内容: 我最近有一个关于如何在另一个类的主方法中打开登录面板的问题。因为我还没有在Swing中上过任何课(仅是基本的Java编程),所以我已经偶然发现了另一个问题。 我如何检测用户是否按下了JPanel中的按钮并使它执行某项操作。 例如:用户按下了登录-> if(textfield1.getText()==“ user”){打开另一个JFrame}->等等。 这是我的主要代码: 这是Login

  • 问题内容: 我在尝试将url中的额外变量传递给我的WordPress安装时遇到了麻烦。 例如 出于某种原因,它仅在网站根目录上有效,但是如果url中包含更多信息,则它将无效。我的主题目录中的functions.php文件中包含以下代码。 有任何想法吗? 问题答案: 要在“前端”上进行“ The WordPress Way”(在的上下文中不起作用wp-admin),您需要使用3个WordPress函

  • 在MSDN中,有这样一段话: 但我不知道加粗文字的确切含义,所以我似乎不需要更多的帮助。那么,为什么它在不使用线程的情况下变为异步呢? 来源:http://msdn.microsoft.com/en-us/library/hh191443.aspx