将数百万个文件从根 AZStorageBlob 复制到子文件夹

Posted

技术标签:

【中文标题】将数百万个文件从根 AZStorageBlob 复制到子文件夹【英文标题】:Copy millions of files form root AZStorage Blob to subfolders 【发布时间】:2020-04-14 09:07:47 【问题描述】:

我有多个 Azure 存储 blob 容器,每个容器都有超过 100 万个 JSON 文件,包括根。无法使用(不令人震惊),因此尝试使用数据工厂将它们移动到多个文件夹,使用文件中的时间戳创建 YYYY-MM-DD/HH 文件夹设置作为分区系统。但是我尝试过的每种方法都因超时/项目限制过多而失败。需要打开每个文件,获取时间戳,并使用时间戳数据将文件移动到动态路径。想法?

更新:我能够解决这个问题,但我不会将其称为“答案”,所以我将更新问题。为了创建更小的集合,我将管道参数化为接受文件名通配符。然后,我创建了另一个管道,它使用 0-9、a-z 的数组将其用作数据集的参数。蛮力解决方法...假设必须有更好的解决方案,但目前可行。

【问题讨论】:

【参考方案1】:

阅读文档:Move data to and from Azure Blob storage

以下文章介绍了如何使用不同的技术将数据移入和移出 Azure Blob 存储。

Azure Storage-Explorer AzCopy Python-SDK(其他:.NET, Java, Node.js, Python, Go, php, Ruby.) SSIS

在你的情况下,我建议你使用支持.NET, Java, Node.js, Python, Go, PHP, Ruby.的SDK

相信我,如果你想从 AzureBlob 迁移你的数据,DataFactory 不是一个好方法,它会使问题变得更加复杂。 (这是我从 AzureBlob 迁移超过 1 亿个 JSON 文件(超过 2TB)后的建议)

【讨论】:

【参考方案2】:

如果你有时间......我会做以下事情:

创建一个 Azure 函数来读取文件并获取您的时间戳并执行您的移动操作。范围函数只是为了使用单个文件。然后使用存储帐户中的事件 (EventGrid) 来触发创建 blob 的功能。然后您知道对于任何新文件,它会将文件移动到正确的位置。 (请记住,您需要在消费模型中达到 100 万次执行才能开始计费功能,所以这是一个低成本的选择)。

对于当前文件,创建另一个函数(或者,如果您想要更多控制,请使用逻辑应用程序,但您的成本会更高一些)并将函数或逻辑应用程序的并行度设置为较低的量(到密切关注你的处决)。为每个运行一个简单的函数,并限制运行你的第一个函数。这将慢慢地将您的文件移出该容器,最终使您进入一个合理的项目数,以便使用 ADF 之类的东西。从长远来看,这可能只会解决您的问题,因为任何新文件都会相应地进行分类,并且您的积压工作会根据需要慢慢移动。如果您需要使用指向文件所在位置的指针更新数据库,您可以将该段代码也放入您的函数或逻辑应用程序中。只是我的两分钱:)

【讨论】:

【参考方案3】:

不清楚你是否使用Azure Data Lake Storage Gen2提供的hierarchical folder structure,第一代模拟了文件夹结构但不是最优的。

ADLSV2 有几个优点可以帮助您解决主要与移动操作相关的情况。

要从 ADLS Gen 1 迁移到 ADLS Gen 2,请查看 here。

此外,您可以通过以下论文here 探索针对您的特定情况的优化。

【讨论】:

以上是关于将数百万个文件从根 AZStorageBlob 复制到子文件夹的主要内容,如果未能解决你的问题,请参考以下文章

哪种语言可以将数百万个脏地址稳定地处理为标准格式?

将数百万份文档传输到外部硬盘驱动器

将数百万次写入文件会损坏我的硬盘吗?

将 S3 上的数百万个小文件存档到 S3 Glacier Deep Archive

数百万个 3D 点:如何找到最接近给定点的 10 个?

使用 python 快速有效地更新数百万个 MongoDB 文档的技巧?