我们有一个应用程序,随着时间的推移为我们的用户存储大量数据(在这里谈论数百TB或更多)。由于新的欧盟指令,如果用户决定停止使用我们的服务,他们的所有数据必须在接下来的80天内可供出口,之后必须完全根除。数据存储在azure存储块blob中,元数据存储在sql数据库中。
可悲的是,数据无法按原样导出(它采用专有格式),因此需要对其进行处理并转换为PDF以供导出。文件大小约为240KB,因此想象一下上面描述的TB值的PDF数量。
我们尝试使用函数将作业分成微小的50个值块,但它在某些时候变得混乱,造成巨大的成本,失去控制。
所以我们正在寻找的是:
有没有人知道符合我们要求的服务?
答案 0 :(得分:2)
这是.NET,python或node.js的入门链接: https://docs.microsoft.com/en-us/azure/batch/batch-dotnet-get-started
批处理中的概念非常简单,但根据我的经验,它需要花费一些时间才能让它第一次运行。我会尽力解释它涉及的内容。欢迎任何建议或意见。
以下概念很重要:
您的任务由池中的可用节点逐个挑选,并执行任务指定的命令。节点上可用的是您的可执行文件和您分配给任务的文件,其中包含一些标识的数据,例如,在您的情况下哪个用户应该由任务处理。
因此,假设您需要为100个用户执行处理。每个单独的处理作业都是您创建的某些可执行文件的执行,例如ProcessUserData.exe。 例如,假设您的可执行文件除了userId之外还包含一个参数,该参数指定是否应该在test或prod中执行此操作,例如, ProcessUserData.exe“包含要处理的用户ID的文件的路径” - 环境测试。 我们假设您的可执行文件不需要除用户ID和执行处理的环境之外的其他输入。
上传到输入容器时,您将收到每个输入文件的引用(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.使用命令行工具获取所需内容,例如在Ubuntu上安装apt-get。
希望能让您了解Batch的概况。在我看来,最好的入门方法是做一些非常简单的事情,即在单个节点上的单个任务中打印环境变量。
您可以在执行过程中检查每个节点的stdout和stderr,再次通过门户网站。
显然还有很多,但这是一个基本指南。您可以创建链接任务和许多其他漂亮的东西,但如果需要,您可以阅读它。
答案 1 :(得分:0)
假设很多人正在寻找满足此类需求的解决方案,那么新版本的ADLA(Azure Data Lake Analytics)现在支持Parquet格式。 U-SQL将支持此功能。现在,使用不到100行的代码,您可以将这些小文件读取为大文件,而使用较少数量的资源(顶点),则可以将数据压缩为Parquet文件。例如,您可以将3TB数据存储到10000个实木复合地板文件中。读取这些文件也非常简单,根据要求,您可以立即创建csv文件。当然,这将为您节省过多的成本和时间。