以 CSV 格式导入和导出数据

本页介绍如何将数据从 Spanner 导出到 CSV 文件或导入 将数据从 CSV 文件导入 Spanner 数据库。

该流程使用 Dataflow。您可以从以下位置导出数据: Spanner 至 Cloud Storage 存储桶,或者您也可以将数据导入 从包含 JSON 的 Cloud Storage 存储桶中运行 Spanner 清单文件和一组 CSV 文件

准备工作

如需导入或导出 Spanner 数据库,请执行以下操作: 首先,您需要启用 Spanner、Cloud Storage Compute Engine 和 Dataflow API:

启用 API

此外,您还需要足够的配额和必要的 IAM 权限。

配额要求

导入或导出作业的配额要求如下:

  • Spanner:您必须有足够的计算容量 以支持您要导入的数据量。导入或导出数据库不需要额外计算容量,但您可能需要增加更多计算容量,以便在合理的时间内完成作业。如需了解详情,请参阅优化作业
  • Cloud Storage:若要导入,您必须拥有一个包含之前导出文件的存储分区。若要导出,您必须为导出的文件创建存储分区(如果还没有的话)。你可以在 Google Cloud 控制台中执行此操作 或通过 Cloud Storage 页面创建导出任务 。 您无需为存储分区设置大小。
  • Dataflow:导入或导出作业与其他 Dataflow 作业具有相同的 CPU、磁盘用量和 IP 地址 Compute Engine 配额
  • Compute Engine:在运行导入或导出作业之前,必须为 Compute Engine 设置初始配额,以供 Dataflow 使用。这些配额表示允许 Dataflow 针对作业使用的资源用量上限。建议使用以下初始值:

    • CPU 数:200
    • 使用中的 IP 地址数:200
    • 标准永久性磁盘:50 TB

    通常情况下,您不必进行其他调整。 Dataflow 提供自动扩缩功能,因此您只需支付导入或导出期间实际使用的资源费用。如果您的作业可能会使用更多资源,Dataflow 界面会显示警告图标。出现警告图标不会影响作业的完成。

IAM 要求

如需导入或导出数据库,您还需要有具备足够权限的 IAM 角色,以便使用导入或导出作业中涉及的所有服务。如需了解如何授予角色和权限,请参阅 应用 IAM 角色

如需导入或导出数据库,您需要以下角色:

将 Spanner 数据导出为 CSV 文件

如需将 Spanner 中的数据导出到 Cloud Storage 中的 CSV 文件,请执行以下操作: 按照说明使用 Google Cloud CLI 运行 Spanner to Cloud Storage Text 模板

您还可以在此文档中参阅有关查看作业或对作业进行问题排查对运行缓慢的作业进行优化影响作业性能的因素的信息。

将 CSV 文件中的数据导入 Spanner

从 CSV 文件导入数据的过程包含以下步骤:

  1. 将您的数据导出为 CSV 文件,并将这些文件存储在 Cloud Storage 中。 请勿添加标题行。
  2. 创建 JSON 清单文件,并将该文件与 CSV 文件存储在一起。
  3. 在 Spanner 数据库中创建空目标表确保 CSV 文件中的列的数据类型与所有相应的列相匹配 现有的表中。
  4. 运行导入作业。

第 1 步:将数据从非 Spanner 数据库导出为 CSV 文件

导入过程从位于 Cloud Storage 存储分区的 CSV 文件中提取数据。您可以从任何来源导出采用 CSV 格式的数据。

导出数据时,请注意以下事项:

  • 需要导入的文本文件必须采用 CSV 格式。
  • 数据必须与下面的一种类型相匹配:

GoogleSQL

BOOL
INT64
FLOAT64
NUMERIC
STRING
DATE
TIMESTAMP
BYTES
JSON

PostgreSQL

boolean
bigint
double precision
numeric
character varying, text
date
timestamp with time zone
bytea
  • 导出 CSV 文件时,您不必包括或生成任何元数据。

  • 您的文件不必遵循任何特定的命名惯例。

如果您不将文件直接导出到 Cloud Storage,则必须将 CSV 文件上传到 Cloud Storage 存储分区。

第 2 步:创建 JSON 清单文件

您还必须创建一个清单文件,其中包含要导入的文件的 JSON 说明,并将该清单文件放在存储 CSV 文件的相同 Cloud Storage 存储分区中。此清单文件包含一个 tables 数组,其中列出了相应名称和数据 每个表的文件位置。该文件还指定了接收数据库方言。 如果省略方言,则默认为 GoogleSQL。

清单文件的格式对应于以下消息类型,此处以协议缓冲区格式显示:

message ImportManifest {
  // The per-table import manifest.
  message TableManifest {
    // Required. The name of the destination table.
    string table_name = 1;
    // Required. The CSV files to import. This value can be either a filepath or a glob pattern.
    repeated string file_patterns = 2;
    // The schema for a table column.
    message Column {
      // Required for each Column that you specify. The name of the column in the
      // destination table.
      string column_name = 1;
      // Required for each Column that you specify. The type of the column.
      string type_name = 2;
    }
    // Optional. The schema for the table columns.
    repeated Column columns = 3;
  }
  // Required. The TableManifest of the tables to be imported.
  repeated TableManifest tables = 1;

  enum ProtoDialect {
    GOOGLE_STANDARD_SQL = 0;
    POSTGRESQL = 1;
  }
  // Optional. The dialect of the receiving database. Defaults to GOOGLE_STANDARD_SQL.
  ProtoDialect dialect = 2;
}

以下示例展示了将名为 AlbumsSingers 的表导入 GoogleSQL 方言数据库的清单文件。Albums 表使用作业从数据库中检索的列架构,Singers 表使用清单文件指定的架构:

{
  "tables": [
    {
      "table_name": "Albums",
      "file_patterns": [
        "gs://bucket1/Albums_1.csv",
        "gs://bucket1/Albums_2.csv"
      ]
    },
    {
      "table_name": "Singers",
      "file_patterns": [
        "gs://bucket1/Singers*.csv"
      ],
      "columns": [
        {"column_name": "SingerId", "type_name": "INT64"},
        {"column_name": "FirstName", "type_name": "STRING"},
        {"column_name": "LastName", "type_name": "STRING"}
      ]
    }
  ]
}

第 3 步:为 Spanner 数据库创建表

在运行导入之前,您必须在 Spanner 数据库。如果目标 Spanner 表已有 则清单文件中指定的任何列都必须具有相同的数据 将类型指定为目标表架构中的相应列。

我们建议您创建二级索引和外键,并将 将数据导入 Spanner 之后,而不是在 最初创建该表时如果您的表已包含 那么我们建议将其删除并重新创建 您导入数据时

第 4 步:使用 gcloud 运行 Dataflow 导入作业

如需开始导入作业,请按照使用 Google Cloud CLI 的说明进行操作 使用 Cloud Storage Text to Spanner 模板运行作业。

启动导入作业后,您可以在以下位置查看有关作业的详细信息: Google Cloud 控制台

导入作业完成后,添加任何必要的二级索引外键更改流

为导入作业选择一个区域

您可能需要根据自己所在的地理位置选择不同的区域, Cloud Storage 存储桶。为避免 出站数据传输费用,请选择 与您的 Cloud Storage 存储桶的位置一致。

  • 如果您的 Cloud Storage 存储桶位置为单区域, 可以充分利用免费网络使用 导入作业的相同区域(假设该区域可用)。

  • 如果您的 Cloud Storage 存储桶位置是双区域, 您可以充分利用免费网络使用量,只需选择 作为导入作业的双区域位置中的其中一个, (假设其中一个区域可用)。

  • 如果您的导入作业无法使用位于同一位置的区域,或者您的 Cloud Storage 存储桶位置为多区域位置, 需支付出站数据传输费用。参阅 Cloud Storage 数据传输价格来选择 数据传输费用最低。

在 Dataflow 界面中查看作业或对作业进行问题排查

启动导入或导出作业后,您可以查看作业的详细信息,包括 (位于 Google Cloud 控制台的 Dataflow 部分中)。

查看 Dataflow 作业详情

如需查看过去一周内运行的任何导入/导出作业(包括当前正在运行的任何作业)的详细信息,请执行以下操作:

  1. 转到数据库的数据库概览页面。
  2. 点击左侧窗格中的导入/导出菜单项。数据库导入/导出页面会显示最近的作业列表。
  3. 在数据库导入/导出页面中,点击 Dataflow 作业名称列中的作业名称:

    运行中作业的状态消息

    Google Cloud 控制台会显示 Dataflow 的详细信息 作业。

如需查看超过一周前运行的作业,请执行以下操作:

  1. 前往 Google Cloud 控制台中的 Dataflow 作业页面。

    转到作业页面

  2. 在列表中找到您的作业,然后点击其名称。

    Google Cloud 控制台会显示 Dataflow 的详细信息 作业。

查看作业的 Dataflow 日志

如需查看 Dataflow 作业的日志,请按上文所述转到作业的详细信息页面,然后点击作业名称右侧的日志

如果作业失败,请查看日志了解错误。如果有错误,日志旁边会显示错误计数:

“日志”按钮旁边的错误计数示例

如需查看作业错误,请执行以下操作:

  1. 点击日志旁边的错误计数。

    Google Cloud 控制台会显示作业的日志。您可能需要向下滚动才能看到错误。

  2. 找到带错误图标 “错误”图标 的条目。

  3. 点击各个日志条目以展开其内容。

如需详细了解如何对 Dataflow 作业进行问题排查,请参阅 排查流水线问题

对失败的导入或导出作业进行问题排查

如果您在作业日志中看到以下错误,请执行以下操作:

com.google.cloud.spanner.SpannerException: NOT_FOUND: Session not found

--or--

com.google.cloud.spanner.SpannerException: DEADLINE_EXCEEDED: Deadline expired before operation could complete.

检查以下位置中的 99% 读写延迟时间 Spanner 数据库的监控标签页, Google Cloud 控制台。如果显示的值较高(多秒),则 则表示实例过载,导致 读写 超时和失败。

导致高延迟的一个原因是,运行 Dataflow 作业时,使用过多 这给 Spanner 实例带来了过多的负载。

要指定 Dataflow 工作器的数量限制,请执行以下操作:
  • 如果您使用的是 Dataflow 控制台,则工作器数量上限参数位于基于模板创建作业页面上的可选参数部分。

  • 如果您使用的是 gcloud,请指定 max-workers 参数。例如:

    gcloud dataflow jobs run my-import-job \
    --gcs-location='gs://dataflow-templates/latest/GCS_Text_to_Cloud_Spanner' \
    --region=us-central1 \
    --parameters='instanceId=test-instance,databaseId=example-db,inputDir=gs://my-gcs-bucket' \
    --max-workers=10
    

优化运行缓慢的导入或导出作业

如果您已按照初始设置中的建议配置,则通常不必进行其他调整。如果作业运行缓慢,则可以尝试以下优化操作:

  • 优化作业和数据位置:运行 Dataflow 作业 区域位置 Cloud Storage 存储桶的位置。

  • 确保有足够的 Dataflow 资源:如果 相关的 Compute Engine 配额 限制 Dataflow 作业的资源, Google Cloud 控制台中的 Dataflow 页面 会显示警告图标 警告图标 并记录 消息:

    配额限制警告的屏幕截图

    在这种情况下,为 CPU、使用中的 IP 地址和标准永久性磁盘增加配额或许可以缩短作业的运行时间,但可能会因此产生更多的 Compute Engine 费用。

  • 检查 Spanner CPU 利用率:如果您发现 CPU 利用率 超过 65% 后,您可以 可增加该实例中的计算容量。容量增加了 Spanner 资源和作业应该会加快,但会产生更多 Spanner 费用。

影响导入或导出作业性能的因素

以下几个因素会影响完成导入或导出作业所需的时间。

  • Spanner 数据库大小:处理的数据越多,需要的时间就越长 资源。

  • Spanner 数据库架构,其中包括:

    • 表的数量
    • 行的大小
    • 二级索引的数量
    • 外键的数量
    • 变更数据流的数量

  • 数据位置:数据在 Spanner 和 使用 Dataflow 存储 Cloud Storage。理想情况下,这三个组件全都位于同一区域。如果这些组件不在同一区域,则跨区域移动数据会减慢作业运行速度。

  • Dataflow 工作器数量:最佳 Dataflow 工作器是实现良好性能所必需的。Dataflow 使用自动扩缩功能,根据需要完成的工作量选择作业的工作器数量。但是,工作器数量会受到 CPU、使用中的 IP 地址和标准永久性磁盘的配额的限制。如果工作器数量达到配额上限,Dataflow 界面中会显示一个警告图标。在这种情况下,处理速度会比较慢, 仍然应该完成。 自动扩缩可能会使 Spanner 过载,从而导致在存在 大量数据。

  • Spanner 上的现有负载:导入作业会将 大量 CPU 负载 导出作业通常会在 Spanner 上增加少量负载 实例。 如果该实例原本已有大量负载,则作业的运行速度会较慢。

  • Spanner 计算容量的数量:如果实例的 CPU 利用率 超过 65%,则作业的运行速度会减慢。

调整 worker 以实现良好的导入性能

启动 Spanner 导入作业时,Dataflow 会 必须将工作器设置为最优值以获得良好性能。工作器过多 使 Spanner 过载,而工作器过少会导致负担过重 导入性能。

工作器数量上限在很大程度上取决于数据大小, 但理想情况下,Spanner CPU 的总利用率应介于 70% 到 90%。这在 Spanner 之间实现了良好的平衡 并且不会出错。

为了在大多数架构和场景中实现该利用率目标, 建议将工作器 vCPU 数量上限设置为 4-6 倍 Spanner 节点。

例如,对于 10 节点的 Spanner 实例,使用 n1-standard-2 工作器数量上限,请将工作器数量上限设置为 25,提供 50 个 vCPU。