【问题标题】:Setting data lake connection in cluster Spark Config for Azure Databricks在 Azure Databricks 的集群 Spark Config 中设置数据湖连接
【发布时间】:2020-12-08 00:04:47
【问题描述】:

我正在尝试在连接到 Azure Data Lake Gen2 帐户的 Azure Databricks 工作区中为开发人员/数据科学家简化笔记本创建。现在,每个笔记本的顶部都有这个:

    %scala
    spark.sparkContext.hadoopConfiguration.set("fs.azure.account.auth.type.<datalake.dfs.core.windows.net", "OAuth")
    spark.sparkContext.hadoopConfiguration.set("fs.azure.account.oauth.provider.type.<datalake>.dfs.core.windows.net",  "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
    spark.sparkContext.hadoopConfiguration.set("fs.azure.account.oauth2.client.id.<datalake>.dfs.core.windows.net", <SP client id>)
    spark.sparkContext.hadoopConfiguration.set("fs.azure.account.oauth2.client.secret.<datalake>.dfs.core.windows.net", dbutils.secrets.get(<SP client secret>))
    spark.sparkContext.hadoopConfiguration.set("fs.azure.account.oauth2.client.endpoint.<datalake>.dfs.core.windows.net", "https://login.microsoftonline.com/<tenant>/oauth2/token")

我们的实现试图避免在 DBFSS 中挂载,因此我一直在尝试查看是否可以在集群上使用 Spark Config 来定义这些值(每个集群可以访问不同的数据湖)。

但是,我还不能让它工作。当我尝试各种口味时:

org.apache.hadoop.fs.azure.account.oauth2.client.id.<datalake>.dfs.core.windows.net <sp client id>
org.apache.hadoop.fs.azure.account.auth.type.<datalake>.dfs.core.windows.net OAuth
org.apache.hadoop.fs.azure.account.oauth.provider.type.<datalake>.dfs.core.windows.net "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider"
org.apache.hadoop.fs.azure.account.oauth2.client.secret.<datalake>.dfs.core.windows.net {{secrets/secret/secret}}
org.apache.hadoop.fs.azure.account.oauth2.client.endpoint.<datalake>.dfs.core.windows.net "https://login.microsoftonline.com/<tenant>"

我得到“初始化配置失败”上面的版本看起来默认尝试使用存储帐户访问密钥而不是 SP 凭据(这只是使用简单的 ls 命令进行测试以确保它有效)。

ExecutionError: An error occurred while calling z:com.databricks.backend.daemon.dbutils.FSUtils.ls.
: Failure to initialize configuration
    at shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.services.SimpleKeyProvider.getStorageAccountKey(SimpleKeyProvider.java:51)
    at shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.AbfsConfiguration.getStorageAccountKey(AbfsConfiguration.java:412)
    at shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.initializeClient(AzureBlobFileSystemStore.java:1016)

我希望有办法解决这个问题,尽管如果唯一的答案是“你不能这样做”,那当然是可以接受的答案。

【问题讨论】:

标签: apache-spark azure-databricks azure-data-lake-gen2


【解决方案1】:

如果要在Azure Databricks集群Spark配置中添加Azure Data Lake gen2配置,请参考如下配置

spark.hadoop.fs.azure.account.oauth2.client.id.<datalake>.dfs.core.windows.net <sp client id>
spark.hadoop.fs.azure.account.auth.type.<datalake>.dfs.core.windows.net OAuth
spark.hadoop.fs.azure.account.oauth.provider.type.<datalake>.dfs.core.windows.net org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
org.apache.hadoop.fs.azure.account.oauth2.client.secret.<datalake>.dfs.core.windows.net {{secrets/secret/secret}}
spark.hadoop.fs.azure.account.oauth2.client.endpoint.<datalake>.dfs.core.windows.net https://login.microsoftonline.com/<tenant>/oauth2/token

更多详情请参考herehere

【讨论】:

  • 这行得通。我不得不将秘密更改为也使用spark.hadoop 而不是org.apache 顺便说一句。非常感谢。
  • @Jim-Xu 在{{secrets/secret/secret}} 我假设第一个secrets 是一个文字字符串,对吗?假设是,我可以在 Azure 的哪些部分找到第二个和第三个 secret 的值?例如,如果我创建了一个名为 foo 的全新 KeyVault 并在其中创建了一个名为 mySecret 的秘密,那么我从哪里获得第二个和第三个 secret 的值?谢谢。
【解决方案2】:

您可能需要将集群配置为Access ADLS Gen2 directly

请注意以下访问机密的格式:Read a secret

Spark 配置属性或环境变量路径值的语法必须是 {{secrets//}}。该值必须以 {{secrets/ 开头并以 }} 结尾。

所以这一行:

spark.hadoop.fs.azure.account.oauth2.client.secret..dfs.core.windows.net

应该是这样的:

spark.hadoop.fs.azure.account.oauth2.client.secret.yourstorageaccountname.dfs.core.windows.net {{secrets/yoursecretscope/yoursecretname}}

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 2022-01-24
    • 1970-01-01
    • 2019-04-22
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多