首页 > 数据库 > 数据库开发技术 > 发现一个Azure Databricks Bug

最近在调整数据处理逻辑的代码,有一个任务就是切换从Azure Data Lake里读写数据时的协议,从原来的WASB协议切换到新的协议:ABFS
WASB:Windows Azure Storage Blob
ABFS:Azure Blob File System
根据微软官网声明,WASB已经弃用这种协议了,推荐使用最新的ABFS协议,特别是如果你使用了Azure Data Lake Gen2服务,那是墙裂推荐使用ABFS协议读写。
类比的话,你就当好比普通硬盘(WASB)和固态硬盘(ABFS)就行了。
话说回来,继续说发现的这个bug,就是在切换到新协议(ABFS)之后,根据微软官方的说明,相应的配置方式也有改变,具体请参考之前的一篇文章:
如何从Azure Databricks访问Azure存储账户
就是在配置SAS token的时候,有两种方式:
一种是你直接在下面代码的第4行里,sasToken这里直接将你的SAS token明文直接放在这里,肯定没问题。但是这很不安全,不是麽?直接将你的密码放到代码里,这太不专业了,做测试还行。
// configue spark with SAS token access wayspark.conf.set("fs.azure.account.auth.type.%s.dfs.core.windows.net".format(storageAccountName ), "SAS")spark.conf.set("fs.azure.sas.token.provider.type.%s.dfs.core.windows.net".format(storageAccountName ), "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")spark.conf.set("fs.azure.sas.fixed.token.%s.dfs.core.windows.net".format(storageAccountName ), sasToken)
这里我们推荐另外一种方式:Secrets。这种方式也是Databricks推荐的方式,只不过呢需要额外做一些操作。什么原理呢?其实就是你把你的密码、各种token都放在一个安全的地方(微软搞了一个Key vault服务),然后你给你的密码、token起个别名,再说明一下用这个密码或者token都能做什么事情。你在代码里就直接告诉Databricks你要使用哪个密码或者token的别名就可以了,不需要将密码或者token的明文写在代码里。是不是更安全了?
具体如何使用,请先参考微软的文档吧!
https://learn.microsoft.com/en-us/azure/databricks/security/secrets/secrets
在我的环境里呢,我已经创建好了secret和secret scope,Databricks提供了一个命令行工具:dbutils,可以直接在Databricks的Notebook里使用和运行,来获取你设置的密码或者token的具体值。
命令如下:
dbutils.secrets.get(scope="my-scope", key="my-key")
可以看到,上面的Output其实只显示:'[REDACTED]',被加密了,看不到明文了。但是Databricks知道如何解密。
所以回到配置SAS token的最后一行代码,把里面的sasToken这里替换成:dbutils.secrets.get(scope="my-scope", key="my-key")即可。这也是在真实项目中所推荐的配置方式。
spark.conf.set("fs.azure.sas.fixed.token.%s.dfs.core.windows.net".format(storageAccountName ), dbutils.secrets.get(scope="my-scope", key="my-key"))配置好spark,正常情况下,我们就可以从Azure Data Lake Gen2来读写数据了,但是我遇到了下面的错误:
AbfsRestOperationException: Operation failed:'A query parameter that's mandatory for this request is not specified.',400, HEAD, https://storageaccountname.dfs.core.windows.net/containername-dev/rootfolder-dev/subfolder-dev?upn=false&action=getStatus&timeout=90&?sv=2017-07-29&ss=b&srt=sco&sp=rl&se=2024-01-03&st=2023-01-03&spr=https&sig=XXXX
比较奇怪的是,使用dbutils.secrets.get(scope="my-scope", key="my-key")命令获取sas token的值,然后把获取的sas token值里的开头的'?'去掉,放到sas token那个位置使用就不会报错了,就可以正常访问了。这个真是比较奇葩,所以给Azure Databricks报了一个case,微软的人又和Databricks的人确认了一下,说这个是一个bug,他们已经在修复了,说过几天有个hotfix会修复这个问题。
到时候再测测告诉大家吧!
点击关注本公众号,且听下回分解!
👇
原文作者:BPShare;如有侵权,请联系管理员删除。