从 HDFS 迁移数据到 MinIO

Data Migration from HDFS to MinIO

在本系列的上一篇博文中,从 HDFS 迁移到对象存储,我们重点介绍了将使用 HDFS 的应用程序迁移到使用 S3 的过程。下一步是数据的迁移。

只有当应用程序所需的所有数据都从对象存储中获取时,才能认为架构已解耦,并且迁移已完成。

在本篇博文中,我们将重点介绍如何将数据从 HDFS 迁移到对象存储。

计划

第一步是定义需要迁移哪些数据。由于数据迁移是一项昂贵的操作,因此最好只迁移应用程序将立即需要的那些数据。历史数据可以移动到备份存储中,并在需要时加载到对象存储中。迁移历史数据的步骤与迁移即时数据的步骤相同。

一旦明确识别出要迁移的数据,就需要考虑以下问题

  • 数据布局
  • 迁移速度
  • 迁移架构

最后一步是执行迁移。如果您只对执行迁移的命令感兴趣,请跳到下面的数据迁移部分。

数据布局

HDFS 中数据的通用结构遵循以下方案

hdfs://apps/$app_name/$db_name/$table_name/$record

where,
$app_name is the name of the application managing the data (eg. hive)
$db_name is the name of the database
$table_name is the name of the table
$record is a row in the table

一个简单的经验法则是复制对象存储中的精确结构。例如,将为每个应用程序创建一个存储桶,并为该应用程序中的每个数据库创建其子文件夹。然后,它将表作为数据库文件夹的子文件夹,并将记录作为表文件夹的子文件夹。

对象存储中的结构将是

s3a://$app_name/$db_name/$table_name/$record

为了适应不同应用程序以不同速度扩展的使用模式,通常做法是为每个应用程序创建一个单独的 MinIO 集群,并为每个数据库使用一个存储桶。这将允许您将每个 MinIO 集群作为单独的单元进行管理、扩展和保护。对象存储中的结构将是

MinIO 集群 1 - Apache Hive

s3a://endpoint-hive:9000/$hive_db_name/$table_name/$record

MinIO 集群 2 - Apache Spark

s3a://endpoint-spark:9000/$spark_db_name/$table_name/$record

如果您的数据库中有很多记录,并且每条记录都存储在单独的文件中,那么在迁移数据之前应考虑分桶。分桶会将数据分组到文件中,以克服“文件过多”的问题。如果表中有大量记录,则分桶数据将提高查询性能。

迁移速度

为了以最大速度迁移数据,需要设置迁移参数,以便使底层硬件功能饱和。

例如,在具有 10 个节点的 HDFS 集群中,每个节点具有 8 个硬盘驱动器(最大吞吐量为 200 MB/s)和 10 Gbps 链路 - 以下是计算以考虑最大性能的示例

最大吞吐量 = min(最大驱动器吞吐量,最大网络吞吐量)

在上面定义的场景中,

Max drive throughput = 8 * 200 MB/s = 1600 MB/s = 12.8 Gbps
Max network throughput = 10 Gbps
Max I/O throughput = Min(12.8 Gbps, 10 Gbps) = 10 Gbps

整个 HDFS 集群的最大吞吐量将是

节点数 * 最大迁移吞吐量 = 10 * 10 Gbps = 100 Gbps

注意:这假设接收集群具有以该速率摄取数据的功能。

传输整个数据集的最小时间可以计算为

总数据大小 (MB) / 最大集群吞吐量 (MB/s)

下表显示了给定数据大小和最大吞吐量下花费的最小时间

数据大小

最大吞吐量

花费时间

1 TB

12.5 GB/s / 100 Gbps

1 分 20 秒

100 TB

12.5 GB/s / 100 Gbps

2 小时 13 分 20 秒

1 PB

12.5 GB/s / 100 Gbps

22 小时 13 分 20 秒

迁移架构

确定所需的吞吐量后,选择实现该吞吐量所需的最小节点数。可以从这些节点启动到 MinIO 的数据传输。

如果您有多节点 MinIO 集群,则可以通过将每个数据传输任务指向集群中的不同端点来聚合所有节点的吞吐量。

例如,如果 MinIO 在 10 个节点上运行,即 minio-{1...10}:9000,则第一个迁移运行器将与 minio-1 通信,第二个与 minio-2 通信,依此类推。这样,负载将在所有 MinIO 服务器之间平均分配。

实现此目的的方法是使用循环 DNS 或使用 /etc/hosts 文件。下面将介绍后一种方法

在每个节点上,/etc/hosts 文件都应包含指向 minio 集群中不同节点的域名“minio”。

| /etc/hosts - hdfs1  |	/etc/hosts - hdfs2   |	/etc/hosts - hdfs3 |
|                     |                      |                     |
| minio 192.168.1.10  |	minio 192.168.1.20   |	minio 192.168.1.30 |  ...|

数据迁移

hadoop 提供的 distcp(分布式复制)实用程序可用于执行数据迁移。复制命令为

hadoop distcp			\
-direct				\
-update				\
-m $num_copiers			\
hdfs://apps/$app_name		\
s3a://app_name

where,
-direct		implies that copy should be made directly to destination without writing to a temporary directory first
-update		overwrite files if they have changed in the source
-m 		number of parallel copiers. This can be used to achieve the intended throughput by increasing the number of nodes performing the copy.  

结论

通过精心计划,朝着明确的目标努力,开始您的从 HDFS 到 MinIO 的旅程。

有关从 HDFS 迁移到 MinIO 的更多信息,请参阅我们的基准指南,MinIO 和 HDFS 在 MapReduce 工作负载方面的性能比较

如果您有任何疑问,请联系我们 hello@min.io,或访问 min.io 下载 并立即开始!