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

Connecting C# Application to Azure Databricks

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

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

我的问题是,我们是否采取了正确的方法,或者是否有我们没有看到的东西?如果这是要走的路,那么您从 C# 应用程序成功地 运行 Azure Databricks 作业中提取结果的经验是什么。

Microsoft 有一个 nice architecture reference solution 也可以帮助您获得更多见解。

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

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

通过 REST API 的数据传输容量也有限。 例如:根据 the docs,输出 api 只会 returns 运行 输出的前 5MB。如果您想要更大的结果,您必须先将其存储在其他地方,然后才能从 C# 应用程序中获取它。

替代检索方法

简而言之:通过 blobstorage 和 eventgrid 充分利用 Azure PaaS。

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

您可以将作业 运行 的结果写入连接到数据块的某种形式的云存储,然后稍后从该存储位置获取结果。 this tutorial that shows the basic concept for storing the results of a job with SQL data warehouse, but you can use any storage you like, for example Blob storage

有个步骤

假设您将结果存储在 blobstorage 中。每次将新作业输​​出写入 blob 时,您都可以引发事件。您可以通过 Azure Eventgrid and consume them in your application. 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,否则您 运行 存储中的作业输出不再附加到进程的风险在您的应用中。

您的用例是将数据块用作计算引擎(类似于 MySQL)并将输出输出到 C# 应用程序。因此,最好的方法是在数据块中创建表,并通过 ODBC 连接 运行 这些查询。 https://docs.microsoft.com/en-us/azure/databricks/integrations/bi/jdbc-odbc-bi 这样您就可以更好地控制 sql 查询输出。