Microsoft 有一个nice architecture reference solution,它也可以帮助您获得更多见解。
我不确定使用 REST API 是否是从 Azure DataBricks 获取作业输出的最佳方式。
首先,REST API 的每个数据块实例都有一个 rate limit。每秒 30 个请求并没有那么糟糕,但它在很大程度上取决于您的应用程序的规模和 databrick 实例的其他用途(如果这足够的话)。创建作业应该足够了,但如果您想轮询作业状态以完成它可能还不够。
通过 REST API 进行数据传输的能力也有限。
例如:根据the docs,输出 api 将只返回运行输出的前 5MB。如果您想要更大的结果,则必须先将其存储在其他位置,然后才能从 C# 应用程序中获取。
替代检索方法
简而言之:通过 blobstorage 和 eventgrid 充分利用 Azure PaaS。
这绝不是一个详尽的解决方案,我相信有人能想出更好的解决方案,但是这在类似的用例中对我有用。
您可以做的是将作业运行的结果写入连接到数据块的某种形式的云存储,然后稍后从该存储位置获取结果。 this tutorial 中有一个步骤显示了使用 SQL 数据仓库 存储作业结果的基本概念,但您可以使用任何您喜欢的存储,例如 Blob storage
假设您将结果存储在 blobstorage 中。每次将新作业输出写入 blob 时,您都可以引发事件。您可以通过Azure Eventgrid 订阅这些事件并在您的应用程序中使用它们。 There is a .net SDK 这会让你做到这一点。该事件将包含一个 blob uri,您可以使用该 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 created event 数据后,您可以使用存储 SDK 获取 blobdata 以在您的应用中使用。根据您的应用程序逻辑,您还必须管理作业 ID 并在应用程序中运行 ID,否则您将面临存储中的作业输出不再附加到应用程序中的进程的风险。