将 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 查询输出。
我目前正在开展一个项目,我们将数据存储在 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 查询输出。