将 HDFS 数据从本地迁移到 Google Cloud

Last reviewed 2024-04-17 UTC

本指南介绍了将数据从本地 Hadoop 分布式文件系统 (HDFS) 迁移到 Google Cloud 的过程。

本文是描述如何从本地 Hadoop 迁移数据的四篇指南的第二篇:

规划您的数据迁移

以下部分介绍了规划从本地 HDFS 到 Google Cloud 的数据迁移的最佳做法。制定逐步迁移计划的目的是分阶段迁移数据,以便留出时间迁移作业、进行实验和测试。

决定迁移数据的方法

有两种不同的迁移模型可用于将 HDFS 数据传输到云端,即推送和拉取。这两种模型都使用了 Hadoop DistCp 将数据从本地 HDFS 集群复制到 Cloud Storage,但它们使用不同的方法。

推送模型是最简单的模型:源集群在其数据节点上运行 distcp 作业,并将文件直接推送到 Cloud Storage,如下图所示:

使用推送模型迁移 HDFS 数据

拉取模型相对更复杂,但有其优点。临时 Dataproc 集群在其数据节点上运行 distcp 作业,从源集群中拉取文件,然后将文件复制到 Cloud Storage,如下图所示:

使用拉取模型迁移 HDFS 数据

推送模型是最简单的模型,因为源集群可以将数据直接推送到 Cloud Storage,所以您无需创建额外的计算资源来执行复制操作。但是,如果您打算在迁移其他常规数据处理作业期间继续使用源集群,则应确保源集群上有足够资源,如 CPU、RAM 和网络带宽以执行复制作业。

如果源集群的运行已耗费计算容量,并且无法增加源集群上的资源以执行复制,则应考虑使用拉取模型。

虽然比推送模型更复杂,但拉取模型具备以下优点:

  • 对源集群的 CPU 和 RAM 资源影响最小,因为源节点仅用于向集群外部提供数据块。同时,您还可以微调 Google Cloud 上的拉取集群资源的规格来处理复制作业,并在迁移完成时清理拉取集群。
  • 由于源集群网络上的流量减少,因此可实现更高的出站带宽和更快的传输速度。
  • 无需在源集群上安装 Cloud Storage 连接器,因为已安装连接器的临时 Dataproc 集群会负责将数据传输到 Cloud Storage。

若要了解两种模型对网络使用的影响,请思考 Hadoop 处理 HDFS 中的数据复制的方式。具体来说,Hadoop 将每个文件拆分为多个块,大小通常为 128-256 兆字节。然后,Hadoop 跨多个数据节点和多个机架复制这些块,以避免在数据节点发生故障或机架发生故障时丢失数据。标准配置是为每个块存储 3 个副本。

此外,Hadoop 还采用“机架感知”机制,确保每个块的 2 个副本位于同一机架内的不同数据节点中以降低延时,并确保在不同机架中使用第三个副本以提高冗余和可用性。此复制逻辑总结如下图所示:

具有机架感知功能的 HDFS 块复制

使用推送模型复制文件时(distcp 映射任务在源集群的数据节点上运行),首先从各个数据节点收集所有文件的块。然后将文件的块推出源集群并转移到 Cloud Storage。由此产生的网络流量最多占文件总大小的两倍,如下图所示:

使用推送模型时的网络使用情况

使用拉取模型复制文件时(即,distcp 映射任务在 Google Cloud 中的拉取集群的数据节点上运行时),每个块在直接退出源集群之前仅通过网络传输一次。因此,整个网络流量不会超出文件的总大小,如下图所示:

使用拉取模型时的网络使用情况

使用拉取模型时,您应该监控 distcp 映射任务的数量和使用的带宽,以避免因并行连接过多导致源集群过载。

决定迁移数据的位置

Hadoop 迁移的最终结果可以是云原生解决方案或混合解决方案,它们之间的区别在于您的系统是否会保留任何本地组件。在云原生解决方案中,您将数据存储在云端并在其中运行作业。在混合解决方案中,您的一部分数据仍会保留在本地。另外,您也可以在本地针对该数据运行作业,或者在云端运行使用本地数据的作业。

云原生解决方案是最容易维护的,但由于您可能有一些业务或技术要求,因此可以在本地保留或处理一些数据。相对而言,每种混合解决方案都高度依赖于用例,并且本身就具有复杂的技术和服务组合,才能满足您的工作负载需求。

将数据迁移到 Cloud Storage 以外的产品

虽然您可以将大部分数据移至 Cloud Storage,但是在某些情况下,您可能会考虑将数据移至其他 Google Cloud 产品,例如:

  • 如果要从 Apache HBase 迁移数据,请考虑将其移至 Bigtable,后者可提供完全相同的功能。

  • 如果要从 Apache Impala 迁移数据,请考虑将其移至 BigQuery,后者可提供完全相同的功能。

您还可能有一些 HBase 或 Impala 中的数据,不需要存储到 Bigtable 或者 BigQuery 也可以使用。如果您的作业不需要 Bigtable 或 BigQuery 的功能,请将数据存储在 Cloud Storage 中。

在充分考虑权限的前提下规划数据位置

Google Cloud 不会对文件采用您在 HDFS 本地可以实现的精细权限。如需设定文件的权限,最简单的方法是在每个 Cloud Storage 存储分区级层进行设置。如果您为不同的 HDFS 数据集设置了不同的权限,请考虑在 Cloud Storage 中创建多个不同的存储分区,并为每个存储分区设置不同的权限。然后将 HDFS 数据放入具有该数据适当权限的存储分区中。

如果将文件移动到 Cloud Storage 中与 HDFS 中不同的结构,请记住跟踪所有更改。将作业迁移到 Dataproc 时,您需要在新位置提供正确的数据路径。

规划逐步迁移

制定以离散块的形式,分批次移动数据的计划。在移动各批次数据的间隔,预留足够的时间以将相应的作业移动到云端。要开始迁移,建议先移动低优先级的数据,例如备份和存档。

拆分数据

如果您计划以增量方式移动数据,则必须将数据拆分为多份。以下部分描述了拆分数据集的最常用策略。

按时间戳拆分数据

为增量移动拆分数据的常用方法是将旧数据存储在云端,同时将新数据保存在本地系统的 HDFS 中。如此一来,您即可以在较旧的,不太重要的数据上测试新的作业和迁移的作业。以这种方式拆分数据使您可以使用少量数据开始迁移计划。

重要注意事项:

  • 除了按时间拆分之外,您能否使用其他方法拆分数据?您可以按数据支持的作业或拥有数据的组织拆分数据,然后按时间进一步拆分数据,从而获得更有针对性的数据集。
  • 您应该使用绝对日期/时间还是相对日期/时间?有时,在某个时间点拆分数据是有意义的,例如在系统发生重要更改之前归档其生成的所有数据。如果要创建回填作业以在云端测试系统,以查看是否可以处理旧数据以使其达到当前标准,则通常最好使用绝对日期/时间。在其他情况下,您可能希望基于相对于当前日期的时间戳将数据移动到云端。例如,您可以移动一年多前创建的所有数据,或者移动过去三个月内未修改的所有数据。
  • 您使用什么日期/时间值来做出决定?文件通常具有多个日期/时间值。有时文件创建日期是最重要的,而有时,您可能希望使用最近修改时间或文件元数据中的其他时间戳。
  • 您的所有数据都具有相同的时间戳格式吗?处理时间戳的方法有很多种。如果您的数据来自多个来源,则时间戳可能以不同的格式存储。在使用时间戳拆分数据之前,请确保这些时间戳具有一致的格式。

按作业拆分数据

有时,您可以通过查看使用数据的作业来拆分数据。如果要逐步迁移作业,此方法尤为实用,因为您只能一并移动作业及其使用的数据。

重要注意事项:

  • 您迁移到云端的作业是否自治? 对于处理自治数据单元的作业而言,按作业拆分是一个很好的选择,但如果作业使用遍布整个系统的数据,则可能难以管理。
  • 这些数据将来是否有相同的用途?如果您可能以不同的方式使用数据,请仔细斟酌,然后再隔离数据。
  • 作业迁移的范围是否经过适当的划分,以生成可管理的数据块?

此外,您还可以使用更广泛的函数标准来拆分数据,而不仅仅是作业组。例如,您可以在云端运行所有 ETL 作业,然后在本地运行分析和报告作业。

按所有权拆分数据

在某些情况下,您可以按所有权领域拆分数据。采用这种方法的一个优点是您的数据组织能够与您的业务组织保持一致。另一个优点是它允许您利用 Google Cloud 基于角色的访问管理。例如,将特定业务角色使用的数据迁移到独立的 Cloud Storage 存储分区,以更轻松地设置权限。

重要注意事项:

  • 所有者之间的界限是否明确?通常,可以厘清给定数据项的主要所有者是谁,但有时最常访问数据的人并不是所有者。
  • 是否还有其他拆分标准可以与所有权相结合?按所有权拆分数据后,您可能会得到非常大的数据集。此时,可按任务或按时间再次拆分数据来缩小范围。

在混合解决方案中保持数据同步

使用混合解决方案的挑战之一是,有时作业需要同时从 Google Cloud 和本地系统访问数据。如果必须在两个环境中访问数据集,则需要在一个环境中为其建立主存储位置,并在另一个环境中维护一个同步副本。

无论您选择哪个环境作为主要位置,同步数据的挑战都是类似的。即您需要一种方法来识别数据何时发生更改,然后部署一个机制以将更改传播到相应副本。如果存在可能发生冲突的变更,您还需要制定解决方案。

重要注意事项:

  • 如有可能,请始终将数据副本设为只读。每多一个潜在的新修改源,同步策略就会变得更加复杂。
  • 在混合解决方案中,请避免维护两个以上的数据副本。请确保在本地仅保留一个副本,然后在 Google Cloud 中仅保留一个副本。

您可以使用 Apache Airflow 等技术来帮助管理数据同步。

迁移数据

以下部分概述了将数据移至 Google Cloud 的注意事项。

配置对数据的访问权限

文件权限在 Cloud Storage 的工作方式与在 HDFS 的工作方式不同。在将数据迁移至 Cloud Storage 之前,您需要熟悉 Identity and Access Management (IAM)。

处理访问控制的最简单方法是根据访问要求将数据分类到 Cloud Storage 存储分区中,并在存储分区级层配置授权政策。您可以分配授予单个用户或组访问权限的角色,接着按组授予访问权限,并根据需要将用户分配给组。在 Cloud Storage 中导入和构建数据时,还需要制定数据访问决策。

每款 Google Cloud 产品都有专属的权限和角色,因此请确保您了解 Cloud Storage 访问权限控制与 Dataproc 访问权限控制之间的关系。请分别评估每款产品的政策,切勿想当然地在产品之间直接映射角色和权限。

请熟读以下文档,之后才能为云端 Hadoop 系统制定决策:

如果需要为单个文件分配更细化的权限,则可以利用 Cloud Storage 支持的访问控制列表 (ACL)。但是,强烈建议优先使用 IAM。如果您的权限特别复杂,则仅应使用 ACL。

使用 DistCp 将数据复制到 Cloud Storage

由于 Cloud Storage 是 Hadoop 兼容的文件系统,因此您可以使用 Hadoop DistCp 将数据从本地 HDFS 移动到 Cloud Storage。您可以使用 DistCp 以多种方式移动数据。我们建议的方式如下:

  1. 使用 Cloud InterconnectCloud VPN 在本地网络和 Google 网络之间建立专用链路。

  2. 创建 Dataproc 集群以用于数据传输。

  3. 使用 Google Cloud CLI 连接到集群的主实例。例如:

    gcloud compute ssh [CLUSTER_NAME]-m
    

    其中,CLUSTER_NAME 是您为作业创建的 Dataproc 集群的名称。后缀 -m 用于标识主实例。

  4. 在集群的主实例上,运行 DistCp 命令以迁移数据。

移动数据所需的实际 DistCp 命令类似于以下内容:

hadoop distcp hdfs://nn1:8020/20170202/ gs://bucket/20170202/

在此示例中,nn18020 是存储源数据的名称节点和端口,而 bucket 是您要向其中复制文件的 Cloud Storage 存储分区的名称。

Cloud Storage 流量默认使用传输层安全协议 (TLS) 进行加密。

验证数据转移

在不同的存储系统(如多个 HDFS 集群)之间或在 HDFS 和 Cloud Storage 之间复制或移动数据时,最好执行某种类型的验证以确保数据完整性。要确保数据在转移过程中未发生变化,此验证必不可少。如需了解详情,请参阅验证数据转移相关指南。

提高请求率

Cloud Storage 维护每个存储分区的对象键索引,以便提供一致的对象列表。这种索引按字典顺序存储,并会在有对象写入存储分区或从存储分区删除时进行更新。添加和删除对象时,如果相应对象键全部存在于小范围索引之中,自然会增加争用的可能性。

Cloud Storage 会检测此类争用情况,并自动将受影响索引范围内的负载重新分配到多个服务器上。如果您使用新前缀编写对象并预计速率将超过每秒 1000 条写入请求,则应如 Cloud Storage 文档中所述逐步提高请求速率。 否则,可能会导致暂时性的高延时和高错误率。

提高数据迁移速度

将数据从本地集群传输到 Google Cloud 的最简单方法是在公共互联网上使用 VPN 隧道。如果单个 VPN 隧道无法提供必要的吞吐量,则可以创建多个 VPN 隧道,之后 Google Cloud 将自动跨隧道分配流量以提供额外的带宽。

有时,即使多个 VPN 隧道也无法提供足够的带宽或连接稳定性来满足迁移需求。在这种情况下,请考虑使用以下方法来提高吞吐量:

  • 在您的网络和 Google 的边缘存在点 (PoP) 之间使用直接对等互连。此方案可减少网络与 Google Cloud 之间的跃点数。

  • 使用 Cloud Interconnect 服务提供商建立与 Google 网络的直接连接。不同合作伙伴的服务细节各不相同,但大多数都提供 SLA 以实现网络可用性和性能。如需了解详情,请直接联系服务提供商。

与 Google Cloud 合作伙伴合作

Google Cloud 有许多合作伙伴可以帮助您迁移数据,请查看提供 Cloud Storage 服务的合作伙伴以了解有关可用于帮助您进行数据迁移的服务的更多信息。由于可用的服务和条款因提供商而异,因此请直接与他们联系以获取详细信息。

后续步骤