架构和数据转移概览

本文档介绍将架构和数据从现有数据仓库转移到 BigQuery 时所涉及的概念和任务。

将数据仓库迁移到云是一个复杂的过程,需要规划、资源和时间。为了控制这种复杂性,您应采用分阶段和迭代的方式处理数据仓库迁移。 多次迭代架构和数据迁移可以改善结果。

架构和数据迁移过程

在迁移开始时,您具有上游系统和下游系统,前者现有数据仓库提供数据,后者在报告和信息中心内使用这些数据并将其提供给其他进程。

这种常规数据流支持许多分析用例,如下图所示:

迁移前的起始状态。

迁移过程的最终状态是在 BigQuery 上运行尽可能多的用例。这一状态让您能够尽可能地减少对现有数据仓库的使用,并最终逐步弃用。通过在迁移的准备和发现阶段确定用例的优先级,您可以控制要迁移哪些用例以及何时进行迁移。

将架构和数据转移到 BigQuery

在迁移的规划阶段,您需要确定要迁移的用例。然后,在执行阶段开始迁移迭代。若要在运行分析环境的同时管理迭代并将干扰降至最低,请按照下面的概要流程操作:

  1. 转移表并配置和测试下游进程。

    • 使用 BigQuery Data Transfer Service 或其他 ETL 工具在不进行任何更改的情况下将每个用例的表组转移到 BigQuery。如需了解工具,请参阅初始数据传输部分。
    • 配置下游进程的测试版本,以便从 BigQuery 表中进行读取。

    此初始步骤对数据流进行了划分。下图显示了产生的数据流。一些下游系统现在从 BigQuery 中进行读取,如标有 B 的流程所示。其他下游进程仍从现有数据仓库中进行读取,如标有 A 的流程所示。

    数据从上游进程流向现有数据仓库。其中一些数据流向下游进程,但其他数据经由 BigQuery Data Transfer Service 流向 BigQuery,然后再从此处流向不同的下游进程。

  2. 配置一些测试上游进程,以便将数据写入 BigQuery 表而不是(或同时写入)现有数据仓库。

    测试后,配置您的生产上游和下游进程,以便读取和写入 BigQuery 表。这些进程可以使用 BigQuery API 连接到 BigQuery,并整合 Looker 数据洞察Dataflow 等新的云产品。

    在目前,您具有三种数据流:

    1. 现有。数据和流程保持不变,仍以现有数据仓库为中心。
    2. 已分流的数据流。上游进程为现有数据仓库提供数据,这些数据被分流到 BigQuery,然后 BigQuery 为下游进程提供数据。
    3. 完全迁移的数据流。上游和下游进程不再从现有数据仓库读写数据。

      下图显示了具有上述全部三种流的系统:

      通过多个路径的工作负载流。
  3. 选择用于迁移的其他用例,然后转到步骤 1,开始新的执行迭代。继续重复执行这些步骤,直到所有用例完全迁移到 BigQuery 为止。选择用例时,您可以重新访问仍处于已分流状态的用例,以便将其移至完全迁移状态。对于已完全迁移的用例,请考虑按照在 BigQuery 中改进架构中的指南继续改进过程。

    迁移后的用例的最后一步。

在 BigQuery 中改进架构

数据仓库架构定义了数据的结构,并且定义了数据实体之间的关系。架构是数据设计的核心,会影响许多上游和下游进程。

数据仓库迁移提供了一个独特的机会,让您能够在将架构迁移到 BigQuery 之后对其进行改进。本部分提供了按照一系列步骤来改进架构的指南。这些指南可帮助您在架构更改期间使数据仓库环境持续运行,同时将对上游和下游进程的干扰降到最低。

该部分中的步骤着重于单个用例的架构转换。

根据您想要改进的程度,您可以在中间步骤停止,也可以继续操作,直到系统完全改进为止。

  1. 将用例按原样转移到 BigQuery。

    在继续执行后续步骤之前,请确保用例的上游和下游进程均已写入 BigQuery 且已从中读取。但是,也可以从只有下游进程从 BigQuery 读取的中间状态开始操作。在这种情况下,仅应用下游部分的指南。下图说明了上游和下游进程写入 BigQuery 中的表并从中读取的用例。

    数据从上游进程依次流向 BigQuery 表和下游进程。

  2. 应用轻度优化。

    1. 重新创建表,并应用分区聚类。对于此任务,您可以使用根据查询结果创建表的方法。如需了解详情,请参阅分区表的讨论示例,并查看聚簇表的讨论示例
    2. 将上游和下游进程重定向到新表。
  3. 创建表层视图。

    如果您想进一步改进架构,而不仅仅是轻度优化,请为表创建表层视图表层模式是一种遮盖底层代码或结构以隐藏复杂性的设计方法。在本例中,表层视图会遮盖底层表,从而隐藏下游进程中的表更改所引起的复杂性。

    该视图可以描述一个新的架构,不存在技术债务,而且建模时考虑到了新的提取和使用方案。

    从本质上讲,表和视图查询定义本身可以更改。但是,视图会将这些更改作为数据仓库的内部实现详细信息抽离出来,并且始终返回相同的结果。此抽象层由表层视图构成,它可视需要在一段时间内将上游和下游系统与变更隔离开来,只在适当的时候才向这些系统呈现相关变更。

  4. 转换下游进程。

    您可以转换部分下游进程,从表层视图而非实际表中进行读取。这些进程将从改进后的架构中获益。对这些进程而言,显而易见在本质上讲,表层视图仍然是从来源 BigQuery 架构中获取其数据,如下图所示:

    数据从上游进程流向 BigQuery 表。一些数据流向下游进程。其他数据则流向表层视图,再流向改进后的下游进程。

    我们首先介绍了下游进程转换。与转换非技术利益相关者不可见的上游进程相比,这使您能够以迁移的信息中心或报告的形式更快地展示业务价值。但是,您也可以改用上游进程开始转换。这些任务的优先级完全取决于您的需求。

  5. 转换上游进程。

    您可以转换部分上游进程,以写入新架构。由于视图为只读视图,因此您可以根据新架构创建表,然后修改表层视图的查询定义。一些视图仍将查询来源架构,而其他视图则将查询新创建的表,或对这两者执行 SQL UNION 操作,如下图所示:

    数据从上游进程流向 BigQuery 表,但不再流向下游进程。相反,数据从 BigQuery 表流向表层视图,然后再流向改进后的下游进程。

    此时,您可以在创建新表时使用嵌套和重复字段。这样,您就能进一步对模型进行反规范化,并直接利用数据的 BigQuery 基础分栏表示形式。

    表层视图的一个好处是,下游进程可独立于这些底层架构更改和上游进程中的更改继续执行其转换。

  6. 完全改进您的用例。

    最后,您可以对其余上游和下游进程进行转换。当全部进程均已改进,要写入新表并从新的表层视图中读取时,您可以修改表层视图的查询定义,使其不再从来源架构中读取。然后,您可以从数据流停用来源模型中的表。下图显示了不再使用来源表的状态。

    不再使用最初的上游进程。仅保留了改进后的上游进程,数据从此处流向改进后的表,这些表为表层视图提供数据,后者又为所有下游进程提供数据。

    如果表层视图不汇总字段或过滤列,则您可以将下游进程配置为从改进后的表读取,然后停用表层视图以降低复杂性,如下图所示:

    在最终配置中,数据会从 BigQuery 表和改进后的表流向表层视图,而这些视图是下游进程的唯一来源。

执行架构和数据的初始转移

本部分介绍将架构和数据从现有数据仓库迁移到 BigQuery 的实际注意事项。

我们建议您在迁移的初始迭代期间转移架构,而无需进行任何更改。这具有以下优势:

  • 无需针对新架构调整为数据仓库提供数据的数据流水线。
  • 不必将新架构添加到员工的培训资料列表中。
  • 可使用自动化工具执行架构和数据传输。

此外,即使在并行迁移时,使用云功能的概念验证 (PoC) 和其他数据探索活动也能不受阻碍地继续进行。

选择转移方法

您可在下列多种方法中选择一个进行初始转移。

如需了解选择数据转移方法的更多注意事项,请参阅选择数据提取方法

考虑数据转换

您可以添加转换数据的步骤,具体取决于您的数据提取格式,以及您是否想要在将数据加载到 BigQuery 之前剪辑或丰富数据。您可以在现有环境或 Google Cloud 上转换数据:

  • 如果要在当前环境中转换数据,请考虑可用计算容量和工具可能如何限制吞吐量。此外,如果您在转换过程中丰富数据,请考虑是否需要额外的转移时间或网络带宽。
  • 如果在 Google Cloud 上转换数据,请参阅使用 ETL 工具加载数据以详细了解您的选项。

将现有架构和数据提取到文件中

您的现有平台可能提供了一种工具,用于将数据导出为 Apache AVRO 或 CSV 等与供应商无关的格式。为降低转移复杂性,建议使用架构信息嵌入数据的 AVRO、ORCParquet。如果您选择 CSV 或类似的简单分隔式数据格式,则必须单独指定架构。具体的操作方法取决于您选择的数据传输方法。例如,对于批量上传,您可以在加载时指定架构,也可以根据 CSV 文件内容自动检测架构。

从现有平台中提取这些文件时,请将其复制到现有环境中的暂存存储空间中。

将文件上传到 Cloud Storage

除非您使用 BigQuery Data Transfer Service 直接从现有 Amazon Redshift 或 Teradata 数据仓库加载数据,否则必须将提取的文件上传到 Cloud Storage 存储桶中。根据您要转移的数据量和可用的网络带宽,您可从以下转移选项进行选择:

  • 如果提取的数据位于其他云服务商处,请使用 Storage Transfer Service
  • 如果数据位于本地环境或具有良好网络带宽的对接网点中,请使用 gsutil 工具。gsutil 工具支持多线程并行上传,可在出现错误后恢复,并对传输中的流量进行加密以确保安全。

    • 如果您无法使用 gsutil,则可试用 Google 合作伙伴提供的第三方工具。
    • 如果您的网络带宽有限,则可使用压缩技术来限制数据大小,也可以修改当前与 Google Cloud 的连接来增加带宽
  • 如果您无法达到足够的网络带宽,则可使用 Transfer Appliance 执行离线转移。

在创建 Cloud Storage 存储分区并通过网络转移数据时,请选择离数据中心最近的位置,以最大程度地减少网络延迟时间。如果可能,请选择存储分区的位置,使其与 BigQuery 数据集的位置相同。

如需详细了解将数据迁移到 Cloud Storage 时的最佳做法(包括估算费用详情),请参阅大型数据集转移策略

将架构和数据加载到 BigQuery 中

使用选择转移方法中讨论的其中一个选项将架构和数据加载到 BigQuery 中。

如需详细了解一次性加载,请参阅 BigQuery 文档中的从 Cloud Storage 加载数据简介。如需详细了解定期安排的加载,请参阅 BigQuery Data Transfer Service 文档中的 Cloud Storage 转移作业概览

使用 ETL 工具加载数据

如果您的数据在加载到 BigQuery 中时需要进一步转换,请使用以下选项之一:

  • Cloud Data Fusion。此工具使用包含预配置连接器和转换的开源库,以图形的方式构建完全托管的 ETL/ELT 数据流水线。
  • Dataflow。此工具使用 Apache Beam 模型定义并运行复杂的数据转换和丰富图。Dataflow 无服务器,由 Google 完全托管,让您能够享受几乎无限的处理能力。
  • Dataproc。它在完全托管的云服务上运行 Apache Spark 和 Apache Hadoop 集群。
  • 第三方工具。请与我们的合作伙伴之一联系。 如果您想将数据流水线的构建外包,那么他们可以提供有效选项。

下图显示了本部分中介绍的模式。数据转移工具为 gsutil,还有一个转换步骤利用 Dataflow 并直接写入 BigQuery,这可能会用到 Apache Beam 内置的 Google BigQuery I/O 连接器

现有数据仓库将数据复制到本地临时存储空间。gsutil 工具将数据复制到 Cloud Storage 存储分区。Dataflow 从暂存存储分区进行读取,并将数据移至 BigQuery。

在将一组初始数据加载到 BigQuery 之后,就可开始使用 BigQuery 的强大功能

但是,与转移架构一样,上传数据也是迭代过程的一部分。可通过增加要转移到 BigQuery 的数据量,开始后续迭代。然后,您可以将上游数据 Feed 重新路由到 BigQuery,而无需持续运行现有数据仓库。这些主题将在下一部分中进行介绍。

验证数据

现在您的数据位于 BigQuery 中,您可以使用数据验证工具 (DVT) 来验证数据转移是否成功。DVT 是一种开源 Python CLI 工具,可让您将各种来源的数据与 BigQuery 中的目标数据进行比较。您可以指定要运行的聚合操作(例如计数、求和、求平均值)以及要应用这些聚合操作的列。如需了解详情,请参阅使用 DVT 自动执行数据验证

迭代初始转移

本部分介绍如何在初始数据转移后继续操作以充分利用 BigQuery。

您的部分数据现在位于 BigQuery 中。您准备增加要在 BigQuery 中使用的数据量,从而减少对现有数据仓库的依赖。

您为后续迭代选择的方法,取决于用例将数据更新到当前状态有多重要。如果您的数据分析人员可以接受定期整合到数据仓库中的数据,则最好使用预定的选项。您可采用与初始转移类似的方式创建预定的转移。您可以使用 BigQuery Data Transfer Service、其他 ETL 工具(如 Google Storage Transfer Service)或者第三方实现。

如果您使用 BigQuery Data Transfer Service,则首先需要确定要转移的表。然后,创建表名模式以包含这些表。最后,您需要为何时运行转移设置周期性计划。

另一方面,如果您的用例要求能近乎实时地访问新数据,则需要使用流式传输方法。您可以采用以下两种方法:

从短期来看,增加 BigQuery 数据的量并将其用于下游进程的重点应在于满足最高优先级的用例,而中期目标是摆脱现有数据仓库。明智地使用初始迭代,并且不会投入大量资源来完善从现有数据仓库提取到 BigQuery 的提取流水线。最终,您需要调整这些流水线,使其不使用现有数据仓库。

优化架构

只需将表按原样迁移到 BigQuery,您就可以利用其独特功能。例如,无需重建索引和重新排列数据块(清空),也没有任何因版本升级而出现停机时间或性能下降问题。

但是,在迁移的初始迭代之后保持数据仓库模型的完整也存在以下缺点:

  • 与架构相关的现有问题和技术债务仍然存在。
  • 查询优化有限,如果在后续阶段更新架构,则可能需要重新进行优化。
  • 没有充分利用其他 BigQuery 功能,例如嵌套和重复字段、分区和聚类。

在进行最终转移时,我们建议您对架构中创建的表应用分区和聚簇,以提升系统性能。

分区

借助 BigQuery,您可以将您的数据分成多个区段(称为分区),从而更轻松、更有效地管理和查询您的数据。您可以根据 TIMESTAMPDATE 列对表进行分区,BigQuery 也可以添加伪列,在提取过程中自动对数据进行分区。涉及更小分区的查询性能可能更高,因为它们仅扫描部分数据,而且可通过尽量减少读取的字节数来降低费用。

分区不会影响表的现有结构。因此,即使未修改架构,也应考虑创建分区表。

聚簇

在 BigQuery 中,不使用索引来查询数据。 BigQuery 的性能由其底层模型、存储和查询技术以及大规模并行架构进行优化。运行查询时,处理的数据越多,添加用于并发扫描数据和聚合结果的机器就越多。该技术适用于大型数据集,而重建索引则不然。

不过,使用聚类等技术可以进一步优化查询。BigQuery 可使用聚类根据您指定的几个列的值自动对数据进行排序,并将其共置在大小最为合适的块中。与不使用聚类相比,使用聚类可提高查询性能,而且 BigQuery 可更好地估算运行查询的费用。使用聚类列,查询还无需扫描不必要的数据,而且由于块将具有相似值的记录放在一起,因此查询能够更快地计算聚合。

审视查询,找出经常用于过滤的列,并创建使用这些列的聚类表。聚类需要分区表,它同样在创建表时进行定义。

反规范化

数据迁移是一个迭代过程。因此,在将初始架构迁移到云、执行了轻度优化并测试了一些关键用例后,就可开始探索得益于 BigQuery 基础设计的其他功能。其中包括嵌套和重复字段。

在以往,数据仓库架构使用过以下模型:

  • 星型架构。这是一种反规范化模型,其中,事实表会收集指标(如订单金额、折扣和数量)和一组键。这些键属于客户、供应商和区域等维度表。在图形方面,该模型与星型很相似,中间的事实表周围环绕着维度表。
  • 雪花型架构。它与星型架构类似,但其维度表经过规范化,让架构呈现出独特的雪花状外观。

BigQuery 同时支持星型和雪花型架构,但其原生架构表示形式并不是这两者。它改用嵌套和重复字段作为数据的更自然的表示形式。如需了解详情,请参阅 BigQuery 文档中的示例架构

将架构更改为使用嵌套和重复字段是一种很好的改进选择。它减少了查询所需的联接数,并且使您的架构与 BigQuery 内部数据表示形式保持一致。在内部,BigQuery 使用 Dremel 模型整理数据,并将其存储在名为 Capacitor 的列式存储格式中。

如需确定最适合您的案例的反规范化方法,请考虑反规范化的最佳实践处理架构更改方法。

后续步骤

详细了解迁移数据仓库的以下步骤:

您还可以了解如何从特定数据仓库技术迁移到 BigQuery: