Edited at

DatastoreのEntityをKind単位で一括削除、コピー、リネーム

PicApp アドベントカレンダー17日目です。

Datastore を使い始めて誰しも一度は思ったことがあると思いますが、MySQL や Oracle, PostgreSQL 等と違って、テーブル単位で管理されているわけではないので、一括削除、コピー、リネーム等はサポートされていません。すべては Entity です。Kind は Entity に付属するラベルのようなものなので、Kind 単位でなにかするという API はありません。

実際、一括削除したいんだけどなーと思ってググると公式ドキュメントに一蹴されます。


2018-12-17 17_00_13-Deleting Entities in Bulk  _  Cloud Datastore Documentation  _  Google Cloud.png

バルクで削除したいなら Cloud Dataflow 使ってね。

いい感じのテンプレートも用意してあるよ!

https://cloud.google.com/datastore/docs/bulk-delete


そして、Cloud Dataflow を見に行くと、今後は Apache Beam で実装してね!

という、一見謎のたらい回しに遭遇してしまいます。

DROP TABLE, TRUNCATE TABLE のノリで簡単に Datastore を一括操作したいだけなのに、Dataflow を理解して、Apache Beam を理解して、実装して、というのはなかなかツライものがありますので、そんな人向けにコマンドラインツールを作りました。

dsflow です。1

https://github.com/tomoemon/dsflow

Datastore の Namespace, Kind 単位で下記の操作をサポートしています


  • copy

  • delete

  • rename

  • json dump


アーキテクチャ

細かい使い方は README.md に書いていますので、試してみたい方はそちらをご覧ください。ここでは簡単に Apache Beam と Dataflow の簡単な仕組みを紹介します。

2018-12-18 11_36_59-astah - [no_title] (_).png

Apache Beam と Dataflow の関係は Hadoop を例にすると、MapReduce を実装するための SDK と Hadoop クラスタ環境と同じようなもので、SDK とプログラムを動かすランタイム環境と言えます。実際、Apache Beam で実装されたコードは Dataflow 以外の場所でも動かすことが可能です。

とはいえ、認証/認可のこと等を考えると、Datastore のように他の GCP サービスに含まれるデータを操作したい場合は、素直に Dataflow で動かすのが楽でしょう。


Dataflow ジョブの実行とローカルからの実行

Apache Beam を使って実装されたコードは、Dataflow で実行するだけでなく、ローカル環境から実行することもできます。

Dataflow のジョブを作成すると、Dataflow はデータ操作を行うための GCE インスタンスを立ち上げます。ここで、必ず数分の時間を要するので、データ量が少ない場合は Dataflow を使わずに、直接ローカルから Datastore に対してデータ操作をしてしまった方が速いです。2

dsflow でもローカルからの実行と Dataflow を使った実行の両方をサポートしており、dsflow コマンドを叩いた場合は Dataflow を使い、dsflowl コマンドを叩いた場合はローカルから直接 Datastore を操作します。


Apache Beam の注意点

Apache Beam は基本的に Java 先行で開発が進んでいる(ように見える)ので、Python や Go 向けのライブラリで使える機能が少なかったりちぐはぐだったりします。今回も Python で実装するにあたっては、Google の他のライブラリとの(proto 定義の)整合性を取るための作業が大半を占めました……。





  1. リポジトリを作る前に "dsflow" でググって、同じような名前のものが無いことを確認したはずなのに、dataflow をラップしたようなフレームワークで dsflow というものがありました…… 



  2. ローカルPCのスペックやネットワーク環境にもよりますが、おおよそ数万件程度が分岐点になると思います。