CSV 形式のデータのインポートとエクスポート

このページでは、Cloud Spanner から CSV ファイルにデータをエクスポートする方法、または CSV ファイルから Cloud Spanner データベースにデータをインポートする方法について説明します。

このプロセスでは Dataflow を使用します。Cloud Spanner から Cloud Storage バケットにデータをエクスポートするか、JSON マニフェスト ファイルと一連の CSV ファイルを含む Cloud Storage バケットから Cloud Spanner にデータをインポートできます。

始める前に

Cloud Spanner データベースをインポートするには、まず Cloud Spanner、Cloud Storage、Compute Engine、Dataflow API を有効にする必要があります。

API を有効にする

また、十分な割り当てと必須の IAM 権限も必要です。

割り当て要件

Google Cloud サービスによるインポート ジョブまたはエクスポート ジョブの割り当て要件は次のとおりです。

  • Cloud Spanner: インポートするデータの量をサポートできるだけのノードが必要です。データベースをインポートまたはエクスポートするために追加のノードは必要ありませんが、ジョブが妥当な時間内に終了するようにノードを追加する必要がある場合があります。詳細については、ジョブの最適化をご覧ください。
  • Cloud Storage: インポートするには、以前にエクスポートしたファイルが格納されているバケットが必要です。エクスポートするには、エクスポートされたファイル用のバケットを作成する必要があります(まだない場合)。これは、Cloud Console で Cloud Storage ページを使用して、または Cloud Spanner ページを使用してエクスポートを作成するときに行うことができます。バケットのサイズを設定する必要はありません。
  • Dataflow: インポート ジョブまたはエクスポート ジョブは、他の Dataflow ジョブと同じ CPU、ディスク使用量、IP アドレスの Compute Engine の割り当てに従います。
  • Compute Engine: インポート ジョブまたはエクスポート ジョブを実行する前に、Dataflow によって使用される Compute Engine の初期割り当てを設定する必要があります。これらの割り当ては、Dataflow でジョブに使用できる最大リソース数を表します。推奨の開始値は次のとおりです。

    • CPU: 200
    • 使用中の IP アドレス: 200
    • 標準永続ディスク: 50 TB

    一般的に、他の調整は必要ありません。Dataflow では自動スケーリングが提供されているため、インポートまたはエクスポート中に実際に使用したリソースに対してのみ料金を支払います。ジョブでより多くのリソースが使用される可能性がある場合、Dataflow UI に警告アイコンが表示されます。警告アイコンが表示されてもジョブは完了します。

IAM 要件

データベースをインポートまたはエクスポートするには、インポート ジョブまたはエクスポート ジョブに関連するすべてのサービスを使用するための十分な権限を持つ IAM のロールも必要です。ロールと権限の付与については、IAM ロールの適用をご覧ください。

データベースをインポートまたはエクスポートするには、次のロールが必要です。

  • Google Cloud プロジェクト レベル:
    • Cloud Spanner 閲覧者
    • Dataflow 管理者
    • ストレージ管理者
  • Cloud Spanner データベースまたはインスタンス レベル、あるいは Google Cloud プロジェクト レベル:
    • Cloud Spanner 読み取り
    • Cloud Spanner データベース管理者(インポート ジョブの場合のみ必要)

CSV ファイルへの Cloud Spanner データのエクスポート

Cloud Spanner から Cloud Storage の CSV ファイルにデータをエクスポートするには、gcloud コマンドライン ツールを使用して Cloud Spanner to Cloud Storage Text テンプレートでジョブを実行する手順に従います。

このドキュメントのジョブの表示またはトラブルシューティング遅いジョブの最適化ジョブのパフォーマンスに影響する要素の情報を参照することもできます。

CSV ファイルから Cloud Spanner へのデータのインポート

CSV ファイルからデータをインポートするプロセスには、次のステップが含まれます。

  • データを CSV ファイルにエクスポートし、それらのファイルを Cloud Storage に保存します。
  • JSON マニフェスト ファイルを作成し、CSV ファイルとともに保存します。
  • Cloud Spanner データベースに空のターゲット テーブルを作成する、CSV ファイルの列のデータ型が既存のテーブルの対応する列と一致することを確認します。
  • インポート ジョブを実行します。

Cloud Spanner 以外のデータベースから CSV ファイルへのデータのエクスポート

インポート プロセスは、Cloud Storage バケット内の CSV ファイルからデータを取り込みます。任意のソースからデータを CSV 形式でエクスポートできます。

データをエクスポートするときは、次の点に留意してください。

  • インポートするテキスト ファイルは CSV 形式である必要があります。
  • データは次のタイプのいずれかに一致する必要があります。

    • INT64
    • FLOAT64
    • BOOL
    • STRING
    • DATE
    • TIMESTAMP
  • CSV ファイルをエクスポートする際に、メタデータを含めたり生成したりする必要はありません。

  • ファイルについて特定の命名規則に従う必要はありません。

ファイルを Cloud Storage に直接エクスポートしない場合は、Cloud Storage バケットに CSV ファイルをアップロードする必要があります。

JSON マニフェスト ファイルの作成

インポートするファイルの JSON 記述を含むマニフェスト ファイルも作成し、CSV ファイルが保存されている Cloud Storage バケットと同じバケットに配置する必要があります。このマニフェスト ファイルには、各テーブルの名前とデータファイルの場所を示す tables 配列を格納します。

次のメッセージ タイプに対応するマニフェスト ファイルの形式は、プロトコル バッファで参照できます。

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. Supports the
      // following data types: BOOL, INT64, FLOAT64, STRING, DATE, and TIMESTAMP.
      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;
}

次の例は、AlbumsSingers というテーブルをインポートするためのマニフェスト ファイルを示しています。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"}
      ]
    }
  ]
}

Cloud Spanner データベースのテーブルの作成

インポートを実行する前に、Cloud Spanner データベースにターゲット テーブルを作成する必要があります。ターゲットの Cloud Spanner テーブルにすでにスキーマがある場合、マニフェスト ファイルで指定された列は、ターゲット テーブルのスキーマ内の対応する列と同じデータ型である必要があります

gcloud を使用した Dataflow インポート ジョブの実行

インポート ジョブを開始するには、gcloud コマンドライン ツールを使用して CSV to Cloud Spanner テンプレートでジョブを実行する手順に従います。

インポート ジョブを開始したら、Cloud Console でジョブの詳細を確認できます。

インポート ジョブが完了したら、必要なセカンダリ インデックス外部キーを追加します。

インポート ジョブのリージョンの選択

Cloud Storage バケットでリージョン構成を使用するかマルチリージョン構成を使用するかによって、異なるリージョンの選択が必要になる場合があります。下り(外向き)ネットワーク料金が発生しないようにするには、Cloud Storage バケットのロケーションと重複するリージョンを選択します。

リージョン バケットのロケーション

Cloud Storage バケットのロケーションがリージョンである場合、無料のネットワーク使用を利用できるリージョンであれば、インポート ジョブに対し同じリージョンを選択します。

同じリージョンを利用できない場合は、下り(外向き)料金が適用されます。下り(外向き)ネットワーク料金が最小限になるリージョンを選択するには、Cloud Storage の下り(外向き)ネットワークの料金をご覧ください。

マルチリージョン バケットのロケーション

Cloud Storage バケットのロケーションがマルチリージョンである場合、無料のネットワーク使用を利用できるマルチリージョン ロケーションを構成するリージョンの 1 つを選択します。

重複するリージョンを利用できない場合は、下り(外向き)料金が適用されます。下り(外向き)ネットワーク料金が最小限になるリージョンを選択するには、Cloud Storage の下りネットワークの料金をご覧ください。

Dataflow UI でのジョブの表示またはトラブルシューティング

インポート ジョブまたはエクスポート ジョブの開始後、Cloud Console の Dataflow セクションで、ジョブの詳細(ログなど)を表示できます。

Dataflow ジョブの詳細の表示

現在実行中のジョブの詳細を表示するには:

  1. データベースの [データベースの詳細] ページに移動します。
  2. 次のようなジョブ ステータス メッセージ内の [Dataflow でジョブの詳細を表示] をクリックします。

    進行中のジョブのステータス メッセージ

    Cloud Console に Dataflow ジョブの詳細が表示されます。

最近実行したジョブを表示するには:

  1. データベースの [データベースの詳細] ページに移動します。
  2. [インポート / エクスポート] タブをクリックします。
  3. リスト内のジョブの名前をクリックします。

    Cloud Console に Dataflow ジョブの詳細が表示されます。

1 週間以上前に実行したジョブを表示するには:

  1. Cloud Console の Dataflow ジョブページに移動します。

    ジョブページに移動

  2. リスト内でジョブを見つけ、その名前をクリックします。

    Cloud Console に Dataflow ジョブの詳細が表示されます。

ジョブの Dataflow ログの表示

Dataflow ジョブのログを表示するには、上記の説明に従ってジョブの詳細ページに移動し、ジョブ名の右側にある [ログ] をクリックします。

ジョブが失敗した場合は、ログでエラーを探します。エラーがある場合、エラー数が [ログ] の横に表示されます。

[ログ] ボタンの横のエラー数の例

ジョブエラーを表示するには:

  1. [ログ] の横のエラー数をクリックします。

    Cloud Console にジョブのログが表示されます。エラーを表示するには、スクロールが必要な場合があります。

  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.

Cloud Console の Cloud Spanner データベースの [モニタリング] タブで 99% の読み取り / 書き込みレイテンシを確認します。高い値(数秒)が表示されている場合は、インスタンスが過負荷状態であるため、読み取り / 書き込みがタイムアウトになって失敗します。

レイテンシが高くなる原因の 1 つは、多すぎるワーカーを使用して Dataflow ジョブが走行しているため、Cloud Spanner インスタンスに負荷がかかりすぎることです。

Dataflow ワーカーの数の上限を指定するには:
  • Dataflow コンソールを使用している場合、[最大ワーカー数] パラメータは、[テンプレートからジョブを作成] ページの [オプションのパラメータ] セクションに配置されます。

  • gcloud を使用している場合は、max-workers 引数を指定します。例:

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

ワーカーの最大数はデータサイズに大きく依存しますが、Spanner の CPU 使用率の合計は 70~90% が理想的です。これにより、Spanner の効率性とエラーのないジョブ完了のバランスが良好になります。

大部分のスキーマ / シナリオでその使用率の目標を達成するには、ワーカー vCPU の最大数を Spanner ノードの数の 4〜6 倍にすることをおすすめします。

たとえば、n1-standard-2 ワーカーを使用する 10 ノードの spanner インスタンスの場合、最大ワーカー数を 25 に設定し、50 個の vCPU を割り当てます。

実行速度が遅いインポート ジョブまたはエクスポート ジョブの最適化

初期設定の提案に従っている場合は、通常、他の調整は必要ありません。ジョブの実行速度が遅い場合は、その他の最適化を試すことができます。

  • ジョブとデータのロケーションの最適化: Cloud Spanner インスタンスと Cloud Storage バケットが配置されている同じリージョン内で Dataflow ジョブを実行します。

  • 十分な Dataflow リソースの確保: 関連する Compute Engine の割り当てによって Dataflow ジョブのリソースが制限されている場合、Google Cloud Console の、ジョブの Dataflow ページに警告アイコン 警告アイコン とログメッセージが表示されます。

    割り当て上限の警告のスクリーンショット

    この場合、CPU、使用中の IP アドレス、標準永続ディスクの割り当てを増やすと、ジョブの実行時間が短くなる可能性がありますが、Compute Engine の追加料金が発生する場合があります。

  • Cloud Spanner の CPU 使用率の確認: インスタンスの CPU 使用率が 65% を超えている場合は、そのインスタンスのノード数を増やすことができます。追加のノードによって Cloud Spanner のリソースが増加し、ジョブの実行速度は速くなりますが、Cloud Spanner の追加料金が発生します。

インポート ジョブまたはエクスポート ジョブのパフォーマンスに影響する要素

インポート ジョブまたはエクスポート ジョブの完了にかかる時間には、いくつかの要素が影響します。

  • Cloud Spanner データベースのサイズ: 処理するデータ量が増加すると、必要となる時間とリソースも多くなります。

  • Cloud Spanner データベースのスキーマ: テーブルの数、行のサイズ、セカンダリ インデックスの数、外部キーの数が、インポート ジョブまたはエクスポート ジョブの実行にかかる時間に影響します。

  • データのロケーション: データは、Dataflow により Cloud Spanner と Cloud Storage の間で転送されます。3 つのコンポーネントがすべて同じリージョン内にあることが理想的です。コンポーネントが同じリージョン内にない場合は、リージョン間のデータの移動によってジョブは遅くなります。

  • Dataflow ワーカーの数: 自動スケーリングを使用することにより、Dataflow では、処理する必要がある作業量に応じてジョブのワーカー数が選択されます。ただし、CPU、使用中の IP アドレス、標準永続ディスクの割り当てにより、ワーカー数には上限があります。割り当ての上限に達すると、Dataflow UI に警告アイコンが表示されます。この状況では、進捗は遅くなりますがジョブは完了します。

  • Cloud Spanner に対する既存の負荷: インポート ジョブの場合は、Cloud Spanner インスタンスの CPU 負荷がかなり高くなります。エクスポート ジョブの場合は通常、Cloud Spanner インスタンスへの負荷は軽くなります。インスタンスに既存の負荷がかなりある場合、このジョブの実行速度はさらに遅くなります。

  • Cloud Spanner ノードの数: インスタンスの CPU 使用率が 65% を超えると、ジョブの実行速度はさらに遅くなります。