【问题标题】:Failed to run spark query in databricks notebook after storage configurations存储配置后无法在数据块笔记本中运行 spark 查询
【发布时间】:2023-01-11 12:53:53
【问题描述】:

我已经在笔记本中设置了密钥保管库范围,并使用以下步骤建立了与存储帐户的连接:

spark.conf.set("fs.azure.account.auth.type."+StorageAccountName+".dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type."+StorageAccountName+".dfs.core.windows.net","org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id."+StorageAccountName+".dfs.core.windows.net",clientId)
spark.conf.set("fs.azure.account.oauth2.client.secret."+StorageAccountName+".dfs.core.windows.net",clientSecret)
spark.conf.set("fs.azure.account.oauth2.client.endpoint."+StorageAccountName+".dfs.core.windows.net","https://login.microsoftonline.com/mytenantid/oauth2/token")

“StorageAccountName”、“clientId”、“clientSecret”的值都来自密钥保管库,我能够正确获取它们的值。在我的存储帐户访问控制中,我还分配了 我的服务主体的存储 Blob 数据贡献者角色。

在这些配置之后,我分配了一个连接变量:

var apptable = "abfss://container@"+StorageAccountName+".dfs.core.windows.net/path/to/data"

如果我运行以下命令,我就能看到 blob 存储中的文件

display(dbutils.fs.ls(apptable))

我还可以检查模式:

var df = spark.read.format("delta").load(apptable)
df.printSchema()

但是如果我尝试运行以下查询:

var last_appt = spark.sql(s"""select max(updateddate) from apptable""").collect()(0).getTimestamp(0)

我得到了错误:

KeyProviderException: Failure to initialize configuration
Caused by: InvalidConfigurationValueException: Invalid configuration value detected for fs.azure.account.key

我在网上进行了研究,似乎 spark 配置中存在一些问题。但是如果访问存储失败,为什么上面的显示命令运行良好?在这种情况下可能缺少什么?

我对数据块的经验有限。感谢任何帮助。

【问题讨论】:

    标签: azure-blob-storage azure-databricks azure-data-lake-gen2


    【解决方案1】:

    我试图在我的环境中重现相同的结果并得到以下结果,并且我按照上面提到的配置进行了相同的配置。

    请遵循以下代码:

    阅读火花数据框df

    var df = spark.read.format("delta").load(apptable)
    

    创建临时表:

    %scala
    
    temp_table_name = "demtb"
    df.createOrReplaceTempView(temp_table_name)
    

    现在,使用下面的代码。我得到了这个输出。

    %scala
    
    val aa= spark.sql("""select max(marks) from demtb""")
    display(aa)
    

    更新:

    如前所述,在下面评论它对我来说工作正常。

    df1.write.mode("overwrite").format("parquet").option("path","/FileStore/dd/").option("overwriteschema","true").saveAsTable("app") 
    

    【讨论】:

    • 我尝试了第二步,它说“错误:未找到:值 temp_table_name temp_table_name =“demtb”',另外,我尝试像这样立即保存 df,它失败并出现与我上面描述的相同的 key vault 异常错误。它对你有用吗? ``` df.write.mode("overwrite").format("parquet").option("path",s"$outputPath/app").option("overwriteschema","true").saveAsTable("应用程序”)```
    • 我发现即使我在运行那些 spark.conf.set() 命令时对这些值进行硬编码,例如显式粘贴 clientid 和 client secret,它仍然无法正常工作。
    • 嘿,我检查了驱动程序日志,看起来当它想要初始化文件系统时,它仍在使用旧配置而不是密钥库中的最新值,例如,StorageAccountName 的最新版本是“测试”,旧版本是'temp',当我打印值时,我可以看到我正在使用'test',但在驱动程序日志中它显示正在使用'temp'进行初始化
    • 你知道如何更改本地驱动器初始化的文件系统吗?我对为什么它总是使用错误/旧配置进行初始化感到困惑
    • 嗨@Vanderwood,请检查以上更新并按照link1 创建临时表。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2017-05-25
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多