デベロッパー

Cloud Spanner エミュレータで Dataflow パイプラインをテスト

#spanner

※この投稿は米国時間 2021 年 5 月 24 日に、Google Cloud blog に投稿されたものの抄訳です。

Cloud SDK には、GCP プロジェクトや請求先アカウントを作成しなくてもアプリケーションの開発やテストに無料で使用できる、ローカル インメモリ Cloud Spanner エミュレータが備わっています。このエミュレータは Cloud Spanner の本番環境サービスと同じ API を提供し、本番環境へのデプロイではなく、ローカルでの開発とテストを目的として作られています。

このたび、Cloud Spanner エミュレータによるデータベースの Dataflow インポートとエクスポートがサポートされるようになりました。

Cloud Spanner で動作するよう構成された既存の Dataflow パイプラインをこのエミュレータでテストできるので、実際の Spanner バックエンドに接続しなくても既存のパイプラインをオフラインで簡単にテストできます。

以下のガイドでは、このエミュレータで Dataflow のインポートおよびエクスポートのパイプラインをテストする方法についてご説明します。使用するサンプル プログラムは、こちらのページ(https://github.com/cloudspannerecosystem/emulator-samples/tree/master/dataflow)に掲載されています。

テスト パイプラインを開始するには、パイプライン内でエミュレータ エンドポイントを構成します。使用するホストは、エミュレータによって公開される gRPC エンドポイントである必要があります(デフォルトでは http://localhost:9010)。

  • Java クライアント ライブラリの Spanner オプションは、エミュレータのホストを使用するよう次のように設定する必要があります。

  import com.google.cloud.spanner.SpannerOptions;
...
...
SpannerOptions.Builder builder = SpannerOptions.newBuilder();
builder.setEmulatorHost(...);

  • ビームの Spanner 構成も、エミュレータのホストを使用するよう次のように設定する必要があります。

  import org.apache.beam.sdk.io.gcp.spanner.SpannerConfig;
...
...
SpannerConfig config = SpannerConfig.create();
config = config.withEmulatorHost(...);

サンプル プログラム「SpannerEmulatorPopulator」が、Apache Beam ライブラリを使用して Dataflow パイプラインを作成します。このプログラムはインポートとエクスポート両方の実際の動作を示します。どちらを行うかはコマンドラインの引数で切り替えられます。

runExport=<true/false>

runImport=<true/false>

サンプルを実行するには、まず gcloud を構成します。

  gcloud config configurations create emulator-config
gcloud config set auth/disable_credentials true
gcloud config set project test-project
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
gcloud config configurations activate emulator

次に、エミュレータを起動します。ここでは、9010(デフォルトのポート)を使用します。

  gcloud emulators spanner start

必要に応じて「-log_requests」でリクエスト ロギングを有効にすることができます。ポートは「-grpc_port=<port>」で変更可能です。

エミュレータが起動したら、使用するインスタンスを作成する必要があります。

  gcloud spanner instances create test-instance --config=emulator-config --description="Test Instance" --nodes=1

これで、次のようなコマンドでサンプル プログラムを実行できるようになりました。

  mvn compile exec:java -Dexec.mainClass=com.google.spanner.SpannerEmulatorPopulator -Dexec.args="--projectId=test-project --endpoint=http://localhost:9010 --instanceId=test-instance --createDatabase=true --runImport=true --runExport=false --csvImportFile=test.csv --table=users --numRecords=10000 --numWorkers=1 --maxNumWorkers=1 --runner=DirectRunner"

このエミュレータはローカルでのみ実行されるため、ランナーは「DirectRunner」に設定する必要があります。

データは次のようなコードで CSV ファイルから読み込むことができます。

  private static List<List<String>> readCsvFile(String file, int numColumns) throws IOException {
    Path path = FileSystems.getDefault().getPath("./", file);
    Reader reader = Files.newBufferedReader(path);
    CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);
    List<CSVRecord> records = parser.getRecords();

    List<List<String>> entries = new ArrayList<>();
    for (CSVRecord record : records) {
      List<String> row = new ArrayList<>();
      for (int i = 0; i < numColumns; ++i) {
        row.add(record.get(i));
      }   
      entries.add(row);
    }   
    return entries;
  }

CSV ファイルからデータを読み取ったら、データベースに行を追加するミューテーションのリストを作成します。

これで、gcloud を使用してデータベースにデータが正しく入力されたかを確認できるようになりました。

  gcloud spanner databases execute-sql db-inbound --instance=test-instance --sql="SELECT * FROM users WHERE Key=1"

このエミュレータは、Cloud Spanner Dataflow パイプラインをオフラインですぐにテストするために使用できます。前述のサンプルは、基本的なパイプラインをエミュレータで設定する方法を示すものです。

Cloud Spanner エミュレータは、クライアント ライブラリのすべての言語をサポートしています。また、gcloud コマンドライン ツールREST API でも使用できます。GitHub でオープンソース プロジェクトとしてご利用いただくことも可能です。

-Cloud Spanner 担当ソフトウェア エンジニア Jim King