【问题标题】:Connecting C# Application to Azure Databricks将 C# 应用程序连接到 Azure Databricks
【发布时间】:2020-03-17 07:48:00
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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,否则您将面临存储中的作业输出不再附加到应用程序中的进程的风险。

    【讨论】:

    • 您好,感谢您的回复。因此,据我了解,Azure Databricks 的创建并非旨在充当 Web 应用程序的数据存储区,对吗?因此,让我们考虑一下我将所有这些数据存储在连接到 Databricks 的 Datalake 中,从您的回复来看,我认为最好的办法是忘记从 Databricks 运行作业,并设置某种数据存储并拥有所有数据在导出到此数据存储的 Databricks 中,对吗?
    • 是的。 DataBricks 是一个非常酷的分析平台,而不是数据存储 微软的好处是它们为许多天蓝色服务提供参考架构示例。 This onethis one 都提供了一些很好的见解。
    • 感谢您提供的见解!
    【解决方案2】:

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

    【讨论】:

    • 这种方法的局限性在于,您不能在 Azure App 服务中托管您的 C# 应用程序。因为您需要在运行应用程序的机器上安装驱动程序。在这方面有什么解决方案吗?
    • 那是 azure 的坏处。它们支持 sql server 驱动程序,但不支持其他驱动程序。所以选项是使用 windows 容器或简单地将您的代码迁移到 Java 或 python 并使用 jdbc jar 驱动程序进行 azure function 。对 Spark 的 C# 支持非常有限。
    猜你喜欢
    • 2021-07-11
    • 2018-09-24
    • 1970-01-01
    • 2019-04-02
    • 2015-12-24
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多