使用Azure处理大量数据

时间:2017-07-13 07:52:31

标签: c# .net azure parallel-processing azure-storage-blobs

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

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

我们尝试使用函数将作业分成微小的50个值块,但它在某些时候变得混乱,造成巨大的成本,失去控制。

所以我们正在寻找的是:

  • 可以通过Web触发器/队列/ db条目按需运行
  • 付费使用什么,因为这种情况会在随机时间发生,并且(我们希望)很少发生。
  • 能够以最低成本公平有效地处理大量数据
  • 易于维护和跟踪。由于数量和并行处理,职能工作只是火和祈祷 - 混乱 -

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

2 个答案:

答案 0 :(得分:2)

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

批处理中的概念非常简单,但根据我的经验,它需要花费一些时间才能让它第一次运行。我会尽力解释它涉及的内容。欢迎任何建议或意见。

以下概念很重要:

  1. 游泳池。这是您配置为工作的所有节点(即虚拟机)的抽象。这些可以运行Linux,Windows Server或Azure拥有的任何其他产品。您可以通过API配置池。
  2. 工作。这是一个抽象,您可以放置​​您需要执行的“任务”。每个任务都是可执行文件的命令行执行,可能带有一些参数。
  3. 您的任务由池中的可用节点逐个挑选,并执行任务指定的命令。节点上可用的是您的可执行文件和您分配给任务的文件,其中包含一些标识的数据,例如,在您的情况下哪个用户应该由任务处理。

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

    • 您将所有应用程序文件上传到blob(以下名称为“application blob”)。这包括您的主可执行文件以及任何依赖项。一旦配置,它将全部到达池中每个节点(虚拟机)上的文件夹中。该文件夹通过在池中每个节点上创建的环境变量来识别,以便您可以轻松找到它。 请参阅https://docs.microsoft.com/en-us/azure/batch/batch-compute-node-environment-variables
    • 在此示例中,您将创建10个输入文件,每个文件包含应处理的10个userIds(总共100个userIds)。每个命令行任务一个文件。每个文件可以包含1个用户ID或10个用户ID,它通常取决于您希望主要可执行文件解析此文件并处理输入。您将这些上传到'input'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.使用命令行工具获取所需内容,例如在Ubuntu上安装apt-get。

    希望能让您了解Batch的概况。在我看来,最好的入门方法是做一些非常简单的事情,即在单个节点上的单个任务中打印环境变量。

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

    显然还有很多,但这是一个基本指南。您可以创建链接任务和许多其他漂亮的东西,但如果需要,您可以阅读它。

答案 1 :(得分:0)

假设很多人正在寻找满足此类需求的解决方案,那么新版本的ADLA(Azure Data Lake Analytics)现在支持Parquet格式。 U-SQL将支持此功能。现在,使用不到100行的代码,您可以将这些小文件读取为大文件,而使用较少数量的资源(顶点),则可以将数据压缩为Parquet文件。例如,您可以将3TB数据存储到10000个实木复合地板文件中。读取这些文件也非常简单,根据要求,您可以立即创建csv文件。当然,这将为您节省过多的成本和时间。