gpt4 book ai didi

c# - 使用Azure处理大量数据

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:39 25 4
gpt4 key购买 nike

随着时间的推移,我们有一个应用程序可以为用户存储大量数据(在这里谈论数百TB或更多)。由于有新的欧盟指令,如果用户决定中止使用我们的服务,则其所有数据必须在接下来的80天内可供出口,此后必须彻底清除。数据存储在azure存储块blob中,元数据存储在sql数据库中。

可悲的是,数据不能按原样导出(采用专有格式),因此需要进行处理并将其转换为PDF以便导出。一个文件的大小约为240KB,因此请想象一下上述TB值的PDF数量。

我们尝试使用函数将作业分成50个很小的值块,但它在某个时候陷入了困境,并产生了巨大的成本,失去了控制。

因此,我们正在寻找的是:


可通过Web触发器/队列/数据库条目按需运行
付费使用,因为这将在随机时间发生,因此(我们希望如此)很少。
可以以最小的成本相当有效地处理大量数据
易于维护和跟踪。由于功能的数量和并行处理,功能工作只是开火和祈祷-完全混乱。


有人知道符合我们要求的服务吗?

最佳答案

这是.NET,python或node.js的入门链接:
https://docs.microsoft.com/en-us/azure/batch/batch-dotnet-get-started

批处理的概念非常简单,尽管以我的经验,要使它第一次生效需要一些摆弄。我将尽我所能解释其中涉及的内容。欢迎任何建议或评论。

以下概念很重要:


游泳池。这是您准备工作的所有节点(即虚拟机)的抽象。它们可能正在运行Linux,Windows Server或Azure提供的任何其他产品。您可以通过API设置池。
乔布斯。这是放置需要执行的“任务”的抽象。每个任务都是可执行文件的命令行执行,可能带有一些参数。


任务由池中的可用节点一个接一个地拾取,它执行任务指定的命令。节点上有可执行文件和分配给任务的文件,其中包含一些数据标识,例如任务应处理哪些用户。

因此,假设您需要为100个用户执行处理。每个单独的处理作业都是您创建的某些可执行文件的执行,例如ProcessUserData.exe。
举例来说,假设您的可执行文件除userId外还接受一个参数,该参数指定应在测试还是在生产中执行此操作,例如
ProcessUserData.exe“包含要处理的用户ID的文件的路径”-环境测试。
我们假设您的可执行文件除了用户ID和执行处理的环境外,不需要其他输入。


您将所有应用程序文件上传到Blob(以下称为“应用程序Blob”)。这由您的主要可执行文件以及所有依赖项组成。设置完成后,它们将全部存储在池中每个节点(虚拟机)上的文件夹中。通过在池中每个节点上创建的环境变量来标识该文件夹,以便您可以轻松找到它。
https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables
在此示例中,您创建10个输入文件,每个文件包含10个应处理的userId(总共100个userId)。每个命令行任务一个文件。每个文件可以包含1个用户ID或10个用户ID,这完全取决于您希望主可执行文件解析此文件并处理输入的方式。您将它们上传到“输入” blob容器。
它们还将最终位于每个节点上的环境变量标识的目录中,因此也很容易在每个节点上的命令行活动中构造路径。


当上载到输入容器时,您将收到每个输入文件的引用(ResourceFile)。一个输入文件应与一个“任务”相关联,并且在作业执行时,每个任务都将传递到可用节点。

从入门链接可以清楚地了解到如何执行此操作的细节,我试图将重点放在概念上,因此我将不再赘述。

现在,您将创建要执行的任务(CloudTask),指定在命令行上应运行的任务,然后将其添加到作业中。在这里,您引用了每个任务应作为输入的输入文件。
一个示例(假设Windows cmd):

cmd /c %AZ_BATCH_NODE_SHARED_DIR%\ProcessUserdata.exe %AZ_BATCH_TASK_DIR%\userIds1.txt --environment test


在这里,userIds1.txt是上载输入文件时第一个ResourceFile返回的文件名。下一条命令将指定userIds2.txt等。

创建包含命令的CloudTask对象列表后,您可以将它们添加到作业中,例如在C#中。

await batchClient.JobOperations.AddTaskAsync(jobId, tasks);


现在,您等待工作完成。

现在发生的是,Azure批处理查看池中的节点,并且在任务列表中有更多任务时,它将任务分配给一个可用(空闲)节点。

完成后(可以通过API进行轮询),您可以删除池,作业并仅为使用的计算付费。

最后一点:您的任务可能取决于外部软件包,即默认情况下未在您选择的操作系统上安装执行环境,因此有几种解决方法:
1.上载一个应用程序包,该程序包在进入池时将分发到每个节点(同样,有一个指向它的环境变量)。可以通过Azure门户完成此操作。
2.使用命令行工具获取所需的信息,例如apt-get在Ubuntu上安装。

希望能给您概述什么是批次。我认为最好的入门方法是做一些非常简单的事情,即在单个节点上的单个任务中打印环境变量。

您可以在执行过程中再次通过门户检查每个节点的stdout和stderr。

显然,要完成的工作还不止这些,但这是基本指南。您可以创建链接的任务和许多其他精美的东西,但是如果需要,可以继续阅读。

关于c# - 使用Azure处理大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45074587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com