数据从 HDFS 迁移到 MinIO

数据从 HDFS 迁移到 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

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

迁移速度

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

例如,在一个有 10 个节点的 HDFS 集群上,每个节点有 8 个硬盘驱动器(200 MB/s 最大吞吐量)和 10 Gbps 链接——这里是考虑最大性能的计算:

Max throughput = Min(Max Drive throughput, Max Network throughput)

在上面定义的场景中,

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 集群的最大吞吐量为:

Num Nodes * Max migration throughput = 10 * 10 Gbps = 100 Gbps

注意:这假设接收集群有能力以此速率摄取数据。

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

Total data size (MB) / Max cluster-wide throughput (MB/s)

下表显示了给定数据大小和最大吞吐量所需的最短时间:

数据大小

最大吞吐量

所用的时间

1 TB

12.5 GB/秒/100 Gbps

1m 20s

100TB

12.5 GB/秒/100 Gbps

2 小时 13 米 20 秒 

1 铅

12.5 GB/秒/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 工作负载的性能比较

如果您有任何问题,请通过sales@minio.org.cn与我们联系,或访问 min.io下载并立即开始!


上一篇 下一篇