gcloud コマンドを使って Datastore から BigQuery にシュッとする

特定の Datastore Kind を適当に BigQuery へ持っていきたいとき、gcloud コマンドを使うと便利だった。

gcloud コマンドのインストールはドキュメントのとおり。

Export

エクスポートする App Engine プロジェクトは mcz で、Datastore の Kind は User, UserActionLog とする。

まず GCS(Cloud Storage) にエクスポート先バケットをつくる。
プロジェクトとバケットのリージョンが異なると怒られたので、要注意。

ここでは mcz_export というバケットをつくったことにする。

エクスポートコマンドは次のようになる。

gcloud --project=mcz beta datastore export --kinds="User,UserActionLog" gs://mcz_export/backup20171215

beta コマンドだけどちゃんと動く。

これで mcz_export/backup20171215 に User, UserActionLog のデータがエクスポートされる。

Import

続いて BigQuery にインポートする。

インポート先の dataset は mcz_data とする。

インポートコマンドは次のようになる。

bq load --project_id=mcz --replace --source_format=DATASTORE_BACKUP mcz_data.User gs://mcz_export/backup20171215/all_namespaces/kind_User/all_namespaces_kind_User.export_metadata

--replace はなくても良いが、つけないと BigQuery にテーブルが既に存在するときインポート失敗するようになる。

適当に試したところ、1つずつしかインポートできないようだった。
ググり力が足りないのかもしれない。

ただコマンドを見ればお分かりのとおり、フォーマットが決まっている。

なので、Kind名のところを随時変えてあげれば、まとめてシュッともっていける。

次のようなスクリプトを書くと便利。

#!/bin/bash

BACKUP_NAME="backup"`date '+%Y%m%d'`
KINDS="User,UserActionLog"

gcloud --project=mcz beta datastore export --kinds="${KINDS}" gs://mcz_export/${BACKUP_NAME}

KINDS=`echo $KINDS | tr ',' ' '`
for kind in ${KINDS};
do
  echo "${kind} importing..."
  bq load --project_id=mcz --replace --source_format=DATASTORE_BACKUP mcz_data.${kind} gs://mcz_export/${BACKUP_NAME}/all_namespaces/kind_${kind}/all_namespaces_kind_${kind}.export_metadata
done

もっとしっかりやるなら Cloud Dataflow というものがあるのでそれを使うと良いらしい。