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 というものがあるのでそれを使うと良いらしい。