c# - 将 C# 应用程序连接到 Azure Databricks

标签 c# azure databricks azure-data-lake azure-databricks

我目前正在开发一个项目,我们将数据存储在 Azure Datalake 上。 Datalake 连接到 Azure Databricks。

该要求要求 Azure Databricks 连接到 C# 应用程序,以便能够运行查询并从 C# 应用程序获取所有结果。我们目前解决该问题的方法是在 Databricks 上创建一个工作区,其中包含许多需要执行的查询。我们创建了一个链接到上述工作区的作业。从 C# 应用程序中,我们调用列出的许多 API here in this documentation调用作业的实例并等待其执行。但是,我无法从文档中列出的任何 API 中提取结果。

我的问题是,我们是否采取了正确的方法,还是有什么我们没有看到的?如果这是可行的方法,您在从 C# 应用程序在 Azure Databricks 上成功运行的作业中提取结果方面有何经验。

最佳答案

微软有一个 nice architecture reference solution这也可能会帮助您获得更多见解。

我不确定使用 REST API 是从 Azure DataBricks 获取作业输出的最佳方式。

首先,REST API 有一个 rate limit每个数据 block 实例。每秒 30 个请求并不是那么糟糕,但它在很大程度上取决于应用程序的规模以及 databrick 实例的其他用途(如果这足够的话)。它对于创建作业来说应该足够了,但如果您想轮询作业状态以完成它可能还不够。

通过 REST API 传输数据的能力也有限。 例如:按照the docs输出 api 将仅返回运行输出的前 5MB。如果您想要更大的结果,则必须先将其存储在其他位置,然后再从 C# 应用程序获取它。

替代检索方法

简而言之:将 Azure PaaS 与 blobstorage 和 eventgrid 结合使用,发挥您的优势。

这绝不是一个详尽的解决方案,我相信有人可以想出更好的解决方案,但是这在类似的用例中对我有用。

您可以做的是将作业运行的结果写入连接到 databricks 的某种形式的云存储,然后稍后从该存储位置获取结果。 this tutorial中有一个步骤它显示了使用 SQL 数据仓库存储作业结果的基本概念,但您可以使用您喜欢的任何存储,例如 Blob storage

假设您将结果存储在 blobstorage 中。每次将新作业输​​出写入 blob 时,您都可以引发一个事件。您可以通过 Azure Eventgrid 订阅这些事件并在您的应用程序中使用它们。 There is a .net SDK这会让你做到这一点。该事件将包含一个 blob uri,您可以使用它来将数据获取到您的应用程序中。

填写docs blobcreated 事件看起来像这样:

[{
  "topic": "/subscriptions/{subscription-id}/resourceGroups/Storage/providers/Microsoft.Storage/storageAccounts/my-storage-account",
  "subject": "/blobServices/default/containers/test-container/blobs/new-file.txt",
  "eventType": "Microsoft.Storage.BlobCreated",
  "eventTime": "2017-06-26T18:41:00.9584103Z",
  "id": "831e1650-001e-001b-66ab-eeb76e069631",
  "data": {
    "api": "PutBlockList",
    "clientRequestId": "6d79dbfb-0e37-4fc4-981f-442c9ca65760",
    "requestId": "831e1650-001e-001b-66ab-eeb76e000000",
    "eTag": "\"0x8D4BCC2E4835CD0\"",
    "contentType": "text/plain",
    "contentLength": 524288,
    "blobType": "BlockBlob",
    "url": "https://my-storage-account.blob.core.windows.net/testcontainer/new-file.txt",
    "sequencer": "00000000000004420000000000028963",
    "storageDiagnostics": {
      "batchId": "b68529f3-68cd-4744-baa4-3c0498ec19f0"
    }
  },
  "dataVersion": "",
  "metadataVersion": "1"
}]

使用作业 Id 和运行 Id 等所需信息来命名 Blob 非常重要。您还可以创建自定义事件,这会增加解决方案的复杂性,但允许您向事件添加更多详细信息。

一旦您的应用程序中拥有了blob 创建事件数据,您就可以使用存储 SDK 来获取 blob 数据以在您的应用程序中使用。根据您的应用程序逻辑,您还必须管理作业 ID 并在应用程序中运行 ID,否则您将面临存储中作业输出不再附加到应用程序中进程的风险。

关于c# - 将 C# 应用程序连接到 Azure Databricks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60718193/

相关文章:

azure - 将更改注入(inject) Azure 包

azure - 在 Azure Databricks 中找不到 Unity 目录 "Create Metastore"

r - SparkR 和 sparklyr 之间导入 Parquet 文件所需的时间差异

c# - 将图像从 Windows Phone 上传到 Azure Blob 存储。不创建

c# - sql ExecuteNonQuery 不更新 C# 中的数据库

azure - 从第三方 OAuth 提供商检索访问 token

azure - Databricks 池可以跨不同工作区使用吗?

c# - DataGridView CheckBox 行返回 null,直到单击复选框

c# - 使用 ref 而不是返回相同类型的性能成本?

linux - 如何获取安全扫描后受影响的azure容器镜像列表?