从 HDFS 迁移到 MinIO 企业对象存储

Migrating from HDFS to MinIO Enterprise Object Store

云原生、Kubernetes 导向的、基于微服务的架构正在推动对网络存储的需求,例如 MinIO。 对象存储在云原生环境中具有许多优势——它允许计算硬件的弹性扩展,与存储硬件无关。 它使应用程序无状态,因为状态存储在网络上,并且通过简化操作复杂性,允许应用程序实现比以往任何时候都更高的扩展性。

从网络对象存储系统读写数据的最突出标准是 S3。 MinIO 是一个完全兼容 S3 的、高性能的、混合的、多云就绪的对象存储解决方案。

与将数据引入计算的传统方法相比,从计算工作负载通过网络存储数据的模式体现了现代的解耦架构。 这种方法的优势是多方面的:成本节省、可扩展性和性能。 我们的一位客户,一家领先的金融集团在性能方面比 HDFS 提高了 60% 以上,这得益于 MinIO。 这种节省绝非偶然。

在可扩展性方面,Hadoop 在处理小文件时效率低下,并且需要数据本地性,这限制了它的可扩展性,而 MinIO 在处理各种大小的对象(从千字节到太字节)方面表现出色。

至于性能,大多数精通 Hadoop 的管理员都知道,高性能对象存储后端已成为现代实施的默认存储架构。 这篇文章详细介绍了如何将对象存储的优势引入 Hadoop——通过更改存储协议、数据迁移和性能调优。

在接下来的部分中,我们将描述从 HDFS 迁移到MinIO 企业版对象存储的过程——我们自己的高性能、kube 原生、兼容 S3 的对象存储系统。

hdfs:// 到 s3a://

Hadoop 生态系统中的任何大数据平台默认都支持兼容 S3 的对象存储后端。 这种支持可以追溯到 2006 年,当时新兴技术嵌入了一个 S3 客户端实现。 hadoop-aws 模块 aws-java-sdk-bundle 被所有与 Hadoop 相关的平台用于提供对 S3 API 的支持。

应用程序可以通过指定相应的协议,在 HDFS 和 S3 存储后端之间无缝切换。 在 S3 的情况下,协议方案为 s3a://,在 HDFS 的情况下,方案为 hdfs://。

Hadoop SDK 中的 S3 客户端实现已经发展了很多年,每个实现都有不同的协议方案名称,例如 s3://、s3n:// 和 s3a://。 目前,s3:// 表示亚马逊的 EMR 客户端。 Hadoop 生态系统中最突出的 S3 客户端是 s3a://,它适用于所有其他 S3 后端。

注意:s3n:// 已经过时,不再受任何主要 Hadoop 供应商支持。

迁移的第一步是更改 Hadoop 用于与后端存储通信的协议,从 hdfs:// 更改为 s3a://。 在平台的 core-site.xml 文件中,更改以下参数 Hadoop.defaultFS 以指向 s3 后端。

<property>

 <name>fs.default.name</name>

 <value>hdfs://192.168.1.2:9000/</value>

</property>

<property>

 <name>fs.default.name</name>

 <value>s3a://minio:9000/</value>

</property>

有几种方法可以进行迁移到 MinIOAIstore。 您可以将旧数据保留在 HDFS 中,供 Hadoop 访问,而将新数据保存到 MinIO 中,供像 Apache Spark 这样的云原生应用程序访问。 您可以将所有内容移到 MinIO,并由 Hadoop 和云原生应用程序访问。 或者,您可以选择进行部分迁移。 您必须为您的组织选择最适合的方法。 我将描述如何进行完全迁移,并在以后的博客文章中更深入地探讨迁移计划。

将数据从 HDFS 迁移到 S3

可以使用一个名为 distcp 的 Hadoop 原生工具在不同的存储后端之间迁移数据——它代表分布式复制。 它接受两个参数:源和目标。 源和目标可以是 Hadoop 支持的任何存储后端。 在此示例中,为了将数据从 HDFS 移动到 s3,源必须设置为 hdfs://192.168.1.2:9000,目标必须设置为 s3a://minio:9000。

>_
>_ export src=hdfs://192.168.1.2:9000

>_ export dest=s3a://minio:9000

>_
>_ # 执行复制
>_ Hadoop distcp $src $dest

根据数据的规模和传输速度,distcp 本身可以扩展,并且数据可以使用大规模并行基础设施进行迁移。

映射器的数量(即复制数据的并行任务的数量)可以使用 -m 标志进行配置。 一个好的经验法则是将其设置为基础设施中所有节点上可用 CPU 内核的数量。 例如,如果您有 8 个具有 8 个内核的可用节点,那么 CPU 内核的数量将为 64。

>_
>_ export num_cpu_cores=64

>_
>_ # 对大型数据集,使用更高的并行度执行复制
>_ Hadoop distcp -m $num_cpu_cores $src $dest

注意:映射器数量应该与基础设施中的可用核心数相对应,而不是整个集群中的总核心数。这是为了确保其他工作负载有资源可用于其操作。

性能调优

Hadoop 和 MinIO 之间的数据访问模式截然不同。对象存储系统在设计上不支持编辑。这在其能够实现多 PB 规模方面起着关键作用。

其次,从一个位置复制数据到对象存储系统中的另一个位置很昂贵,因为该操作会产生服务器端复制。某些对象存储系统并非严格一致的,这会使 Hadoop 困惑,因为文件可能不会显示,或者如果最终一致,已删除的文件可能会在列出操作期间显示。

注意:MinIO 不存在一致性缺陷,因为它严格一致。

考虑到这些因素,很容易将应用程序调整为成为对象存储原生。已经付出了巨大努力来帮助加快这个过程,那就是在 Hadoop 中引入了 S3 提交器。顾名思义,S3 提交器承诺对 S3 的数据进行一致、可靠和高性能的提交。提交器改变了从 S3 读取/写入数据的模式。首先,它们避免服务器端复制,而服务器端复制通常由 Hadoop 应用程序广泛使用,以允许多个 Hadoop 工作节点原子地写入数据。某些提交器甚至使用本地驱动器作为缓存,并且只将最终输出写入 MinIO 以提高性能。共有三个提交器,每个提交器都有不同的权衡取舍,以解决各种用例。它们分别是

  • 目录提交器
  • 分区提交器
  • Magic 提交器

为了在应用程序中启用提交器,请在  core-site.xml 文件中设置以下配置

<property>

    <name>mapreduce.outputcommitter.factory.scheme.s3a</name>

    <value>org.apache.Hadoop.fs.s3a.commit.S3ACommitterFactory</value>

    <description>

       将用于写入 S3A 文件系统的数据的提交器工厂。

    </description>

</property>

目录提交器

此提交器更改访问模式以首先在本地(缓存驱动器)写入数据,并且一旦收集到要写入数据的最终版本,就会执行写入。这种写入方式更适合于分布式计算和由快速网络连接的 MinIO,并且通过防止服务器端复制,极大地提高了性能。

为了选择此提交器,请将以下参数 fs.s3a.committer.name 设置为 directory。

<property>

    <name>fs.s3a.committer.name</name>

    <value>directory</value>

</property>

分区提交器

此提交器与目录提交器类似,不同之处在于它处理冲突的方式。目录提交器通过考虑整个目录结构来处理不同的 Hadoop 工作节点写入同一文件的冲突。在分区提交器的情况下,冲突是在逐分区的基础上处理的。如果目录结构嵌套很深或总体上很大,此提交器与目录提交器相比提供了更高的性能。仅建议将其用于 Apache Spark 工作负载。

<property>

    <name>fs.s3a.committer.name</name>

    <value>partitioned</value>

</property>

Magic 提交器

此提交器的内部工作原理鲜为人知,因此被称为 Magic 提交器。它会自动选择最佳策略以实现尽可能高的性能。它仅适用于严格一致的 S3 存储。

由于 MinIO 严格一致,因此可以安全地使用 Magic 提交器。建议使用您的工作负载尝试此提交器,以将其性能与其他提交器进行比较。

<property>

    <name>fs.s3a.committer.name</name>

    <value>magic</value>

</property>

选择提交器的一个好经验法则是从最简单、最可预测的目录提交器开始,如果应用程序的需要无法满足,则尝试其他两个提交器(如适用)。一旦选择了合适的提交器,就可以对应用程序进行性能和正确性测试。

结论

有关性能调优的更多说明,请参阅我们的基准测试指南 这里。有关 S3 提交器的更多信息,请参阅 这里

如果您有任何问题,请联系我们,地址为 hello@min.io,或者访问 min.io 以 下载 并立即开始使用!