在 AI/ML 工作负载中使用小型对象

随着 MinIO 企业级对象存储的使用成为云原生工作负载的主导存储,开发人员正在转向对象存储来满足越来越多的用例。这是现代对象存储属性的功能——性能、可扩展性、安全性、弹性和为 Kubernetes 量身定制的 RESTful API。特别是,MinIO 企业级对象存储体现了这些属性,并且可以支持各种位置的各种任务——本地、边缘或私有、公共或混合云。
早期的对象存储平台是为存档大型对象而设计和构建的,通常作为备份作业的目标。尽管非常适合大文件的带宽访问,但这些系统在处理涉及许多小文件操作的工作负载时遇到了困难(并且仍在继续遇到困难)。特别是,访问每个文件的数据需要首先访问元数据服务器(用于映射信息和其他设置),然后访问物理存储。对于大文件,与完全加载完整大文件所需的时间相比,一次性文件元数据访问引入的延迟几乎可以忽略不计。但是,对于许多小文件,元数据服务器访问基本上可以使数据访问延迟加倍,并成为整个对象存储系统的瓶颈。
并非每个对象存储系统都能在各种对象大小和访问模式下提供极佳的性能和弹性。许多小对象通过对低延迟读写操作的需求将传统的对象存储系统推向极限。以严格一致、性能优化和有效利用物理存储的方式提供数千个并发对象操作是一个具有挑战性的问题。随着越来越多的文件副本被复制,对系统征税以提供越来越多的文件元数据,这个问题变得更加复杂。为大型对象设计和优化的系统无法满足这些要求,并且在被迫使用时会提供次优体验。
依赖大量非结构化数据的工作负载,例如 AL/ML/DL,说明了对象存储的挑战。例如,机器学习工作负载可能会查找传感器数据中的异常,检查数百万或数十亿个小型日志文件。这需要大量的元数据和文件数据访问调用,这甚至不是复杂的工作负载,但对许多对象存储系统施加的需求可能会压垮元数据服务器和集群网络,从而无法实时利用工作负载的结果。
与其他对象存储解决方案不同,MinIO 企业级对象存储不依赖于外部元数据数据库。当面对跨大量对象的大量并发查询和操作时,元数据数据库可能会变得无响应。消除这种依赖性使 MinIO 能够更快地处理大量小对象。
MinIO 继续扩展其 在小型对象方面的主导地位,添加了几个功能以提供更好的性能和可扩展性,以用于小型对象的存储和检索。MinIO 企业级对象存储包括优化的带有内联元数据/数据的小对象存储,以及开箱即用的上传和自动提取 .tar 文件的功能。将元数据和小对象数据相结合可以大大提高性能,因为在元数据和数据之间来回切换不会引入延迟。自动提取 .tar 文件使处理许多小对象变得更加高效,只需将小数据文件一起归档,上传它们,它们就可以用于应用程序工作负载。
首先,让我们看看存储和检索大量小对象固有的某些困难,然后我们可以深入了解 MinIO 如何优化这些操作以及我们用于处理 MinIO 客户端和服务器上的 .tar 和 .zip 文件的新功能。
小对象面临的巨大挑战
使用大量的小对象而不是少量的大对象会对对象存储系统提出不同的要求。通常,存储管理员必须根据预期的使用情况和对象大小来设计和调整存储系统,例如调整块、块或缓存大小的属性以匹配典型的读/写模式。
此外,与大型对象工作负载相比,小型对象工作负载受元数据 I/O 的影响更大。MinIO 企业级对象存储通过消除对外部元数据数据库的依赖,减轻了大部分负担。MinIO 将元数据和数据直接存储在磁盘上,以提供更高的性能和可扩展性。
传统上,每个对象都存储在 MinIO 企业级对象存储中,如下所示
bucket/
object_path/
object-name/
xl.meta <<-- Metadata
data-uuid/
Part.1 <<-- Object content
Part.2 (up to 10000 parts for multipart objects)
这意味着为了读取数据,至少需要打开两个文件。要写入数据,将写入至少两个文件和一个文件夹。这种开销在处理较少的大文件时可以忽略不计,但在处理许多对象的许多部分时会开始累积。
更高效的小对象存储和检索
一些因素决定了何时执行此操作,但通常小于 128KiB 的文件可能会与元数据内联存储。这减少了读取和写入文件所需的 IOPS。
并非所有文件大小都启用了此功能,因为它会影响对象的变异速度。例如,当添加新标签或其他属性发生变化时,会发生变异。因此,为了保持合理的更新时间,并且不需要复制或重写许多兆字节的数据,这仅适用于小文件。
从客户端、用户和应用程序的角度来看,这会透明地发生。所有内容都由 MinIO 企业级对象存储管理,因此开始优化小对象存储所需的唯一操作是升级 MinIO 服务器。
自动提取 .tar 文件
该功能还包括在上传后自动提取 .tar 文件的功能。
将许多小型非结构化数据文件放到对象存储中以供应用程序和用户访问并非易事。在许多工作流程和环境中,这可能是整个过程中最耗时的部分。考虑一下机器学习分析所需的数百万个传感器日志的情况,或者另一个常见情况是来自 NAS 迁移的数千个小型 Microsoft Excel 或 Word 文档。如果您单独上传每个文件,那么在建立和拆除大量连接的同时放置数千个 API PutObject 调用时,您将产生大量的网络开销。一个常见的解决方案是将所有文件一起打包成一个大文件或 tarball,上传它,然后提取所有文件。
有了此功能,用户不再需要启动上传然后稍后再返回进行提取。上传 .tar 文件的脚本可以简化为上传和自动提取。对象可以立即供应用程序和用户使用,无需单独的提取步骤,从而使开发人员及其代码对对象存储的操作更高效和及时。重新审视传感器数据示例,.tar 文件自动提取可以通过更快地将非结构化日志数据公开给工作负载,从而实现实时异常检测。
小对象支持在行动
这是一个自动提取工作原理的示例。只需下载最新版本的 MinIO 企业级对象存储和 MinIO 企业级客户端并安装它们。您甚至可以通过下载 mc 来尝试使用我们的游乐环境。
使用任何 .tar 文件,可以选择用 Zstandard(推荐)、lz4、gzip 或 bzip2 压缩。
mc mb play/mybucket
mc cp <path-to-archive>.tar play/mybucket --disable-multipart --attr "X-Amz-Meta-Snowball-Auto-Extract=true"
mc ls play/mybucket
就是这样!您正在体验 MinIO 用于处理小对象的简单、透明且强大的功能。等效的 API 调用是 PutObjectExtract 。
如果您有任何具体问题,请给我们发送邮件至 hello@min.io 或加入 Slack上的对话。我们随时为您提供帮助。