我正在尝试将 MS Azure databricks 与数据湖存储 v2 连接,但无法匹配客户端、秘密范围和密钥。
我在 Azure 数据湖 v2 中有数据。我正在尝试遵循以下说明:
我创建了一个“服务原则”,角色为“存储 Blob 数据贡献者”,获得
我已经在 Azure Keyvault 和 Databricks 中使用键和值创建了秘密范围
当我尝试下面的代码时,身份验证无法识别秘密范围和密钥。从文档中我不清楚是否有必要使用 Azure Keyvault 或 Databricks 秘密范围。
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" -> "<CLIENT-ID>",
"fs.azure.account.oauth2.client.secret" -> dbutils.secrets.get(scope = "<SCOPE-NAME>", key = "<KEY-VALUE>"),
"fs.azure.account.oauth2.client.endpoint" -> "https://login.microsoftonline.com/XXXXXXXXXX/oauth2/token")
Run Code Online (Sandbox Code Playgroud)
如果有人可以提供帮助,请告知/确认:
CLIENT-ID 应该是什么:我知道这是来自存储帐户;
应在 Azure Keyvault 或 Databricks 中的何处创建 SCOPE-NAME 和 KEY-VALUE?
我已启用 API 管理服务的日志记录,并且日志存储在存储帐户中。现在,我尝试在 Azure Databricks 工作区中处理它们,但在访问这些文件时遇到困难。
问题似乎是自动生成的虚拟文件夹结构如下所示:
/insights-logs-gatewaylogs/resourceId=/SUBSCRIPTIONS/<subscription>/RESOURCEGROUPS/<resource group>/PROVIDERS/MICROSOFT.APIMANAGEMENT/SERVICE/<api service>/y=*/m=*/d=*/h=*/m=00/PT1H.json
Run Code Online (Sandbox Code Playgroud)
我已将insights-logs-gatewaylogs容器安装在下面/mnt/diags,并dbutils.fs.ls('/mnt/diags')正确列出了该resourceId=文件夹,但未dbutils.fs.ls('/mnt/diags/resourceId=')找到声明文件
如果我沿着虚拟文件夹结构创建空标记 blob,我可以列出每个后续级别,但该策略显然会失败,因为路径的最后部分是按年/月/日/小时动态组织的。
例如一个
spark.read.format('json').load("dbfs:/mnt/diags/logs/resourceId=/SUBSCRIPTIONS/<subscription>/RESOURCEGROUPS/<resource group>/PROVIDERS/MICROSOFT.APIMANAGEMENT/SERVICE/<api service>/y=*/m=*/d=*/h=*/m=00/PT1H.json")
Run Code Online (Sandbox Code Playgroud)
此错误的产量:
java.io.FileNotFoundException: File/resourceId=/SUBSCRIPTIONS/<subscription>/RESOURCEGROUPS/<resource group>/PROVIDERS/MICROSOFT.APIMANAGEMENT/SERVICE/<api service>/y=2019 does not exist.
Run Code Online (Sandbox Code Playgroud)
很明显,通配符已经找到了第一年文件夹,但拒绝进一步向下。
我在 Azure 数据工厂中设置了一个复制作业,该作业成功复制同一 Blob 存储帐户中的所有 json Blob 并删除前缀resourceId=/SUBSCRIPTIONS/<subscription>/RESOURCEGROUPS/<resource group>/PROVIDERS/MICROSOFT.APIMANAGEMENT/SERVICE/<api service>(因此根文件夹以年份组件开头),并且可以一路成功访问,而无需创建空标记斑点。
因此,问题似乎与长虚拟文件夹结构有关,该结构大部分为空。
是否有另一种方法可以在 databricks 中处理此类文件夹结构?
更新:我也尝试在安装时提供路径作为安装的一部分source,但这也没有帮助
我正在 Databricks 集群中执行 Spark 作业。我通过 Azure 数据工厂管道触发该作业,它以 15 分钟的间隔执行,因此在它successful execution of three or four times失败并抛出异常之后"java.lang.OutOfMemoryError: GC overhead limit exceeded"。虽然上述问题有很多答案,但在大多数情况下,他们的作业没有运行,但在我的情况下,在成功执行一些先前的作业后,它会失败。我的数据大小仅不到 20 MB。
所以我的问题是我应该在服务器配置中进行哪些更改。如果问题出在我的代码上,那么为什么它大多数时候都能成功。请给我建议并提出解决方案。
我使用以下代码将数据帧数据直接插入到 databricks 增量表中:
eventDataFrame.write.format("delta").mode("append").option("inferSchema","true").insertInto("some delta table"))
Run Code Online (Sandbox Code Playgroud)
但是,如果创建 detla 表的列顺序与数据帧列顺序不同,则值会变得混乱,然后不会写入正确的列。如何维持秩序?是否有标准方法/最佳实践来做到这一点?
我正在做一个相当大的项目。我需要使用 azure-security-keyvault-secrets,因此我在 pom.xml 文件中添加了以下内容:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-security-keyvault-secrets</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当我运行此示例代码时:
object Test {
def main(args: Array[String]): Unit = {
// get vault name from system env -> databricks
val secretClient = new SecretClientBuilder()
.vaultUrl("https://myVault.vault.azure.net/")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient
val secret = secretClient.getSecret("AzureAccountName")
println("===================== " + secret.getValue)
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
java.lang.NoSuchMethodError: com.fasterxml.jackson.datatype.jsr310.deser.JSR310DateTimeDeserializerBase.findFormatOverrides(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;Ljava/lang/Class;)Lcom/fasterxml/jackson/annotation/JsonFormat$Value;
at com.fasterxml.jackson.datatype.jsr310.deser.JSR310DateTimeDeserializerBase.createContextual(JSR310DateTimeDeserializerBase.java:79)
at com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer.createContextual(InstantDeserializer.java:241)
at com.fasterxml.jackson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:669)
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:430)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:947)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:439)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:296)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:428)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:947)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:439)
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用文档提供的示例代码将 Spark 数据帧转换为增量格式,但总是收到这个奇怪的错误。您能帮忙或指导一下吗?
df_sdf.write.format("delta").save("/mnt/.../delta/")
Run Code Online (Sandbox Code Playgroud)
错误看起来像:
org.apache.spark.SparkException: Job aborted.
--------------------------------------------------------------------------- Py4JJavaError Traceback (most recent call last) <command-3011941952225495> in <module> ----> 1 df_sdf.write.format("delta").save("/mnt/.../delta/") /databricks/spark/python/pyspark/sql/readwriter.py in save(self, path, format, mode, partitionBy, **options) 737 self._jwrite.save() 738 else: --> 739 self._jwrite.save(path) 740 741 @since(1.4)
/databricks/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py in call(self, *args) 1255 answer = self.gateway_client.send_command(command) 1256 return_value = get_return_value( -> 1257 answer, self.gateway_client, self.target_id, self.name) 1258 1259 for temp_arg in temp_args:
/databricks/spark/python/pyspark/sql/utils.py in deco(a, *kw)
Run Code Online (Sandbox Code Playgroud) Databricks 文档展示了如何从 UI 中的 JDBC/ODBC 选项卡获取集群的主机名、端口、HTTP 路径和 JDBC URL 参数。看图片:

(来源:databricks.com)
有没有办法以编程方式获取相同的信息?我的意思是使用 Databricks API 或 Databricks CLI。HTTP path我对包含Workspace Id 的内容特别感兴趣。
我尝试使用此连接器 - com.microsoft.azure:spark-mssql-connector_2.12_3.0:1.0.0 将数据从 Azure Databricks 写入 Azure SQL,但收到以下错误消息 -
作业因阶段失败而中止:阶段 1.0 中的任务 0 失败 4 次,最近一次失败:阶段 1.0 中丢失任务 0.3(TID 4、10.139.64.4、执行器 0):java.lang.NoClassDefFoundError:com/microsoft/sqlserver/ jdbc/ISQLServerBulkData
此 Spark 连接器是否可以与 Azure Databricks 一起使用到 Azure SQL?有人测试过这个吗?
我尝试访问{{secrets/secrectScope/Key}}databricks 集群的高级选项卡中的秘密,它工作正常。但是当我尝试在 databricks init 脚本中使用相同的内容时,它不起作用。
做到这一点的步骤是什么?
我是 Python 和 Spark 世界的新手。我正在尝试构建一个 pyspark 代码以从 Databricks 发送电子邮件以及来自安装点位置的附件。我使用下面的代码来实现相同的 -
import smtplib
from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders
def send_mail(send_from = <from_email>, send_to = <to_email>, subject = "Test", message = "Test", files=["/mnt/<Mounted Point Directory>/"],
server="<SMTP Host>", port=<SMTP Port>, username='<SMTP Username>', password='<SMTP Password>',
use_tls=True):
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach(MIMEText(message))
for path …Run Code Online (Sandbox Code Playgroud) azure-databricks ×10
apache-spark ×5
databricks ×5
azure ×3
pyspark ×2
dataframe ×1
delta-lake ×1
email ×1
jackson ×1
jdbc ×1
maven ×1
oauth-2.0 ×1
scala ×1