【GoogleAppEngine】バルクローダーを使う【Datastore】
2011-07-24 03:27:03 Sun
GoogleAppEngine/JavaでDatastoreのデータをエクスポート/インポートする際のコマンドメモ。
GAE/Pythonだとわりと記事があってGgりながらやればできるって「安心感」があるのですが、
GAE/Javaでバルクローダーの記事はあまりないので、できるのかどうか不安になりました。
公式ドキュメントにはできるように書いてあるのですが詳細な手順はありません…。
なお、Pythonが実行出来る環境で、たしかhttplib2などのライブラリをインストールしておく必要はありますが、こちらはpython版でGgるといっぱい出てきますので割愛。
実行時エラーで足りないライブラリを確認しながらいれてもそれほど時間にもなりません。
pythonライブラリのインストール方法はhttp://isann.blog2.fc2.com/blog-entry-186.htmlの「■依存のあるライブラリをまずインストールする」あたりを参考にどうぞ。
まずは公式ドキュメントの通り下記を組み込みます。
これは、web.xmlに組み込むだけです。
URLは「appcfg.py create_bulkloader_config」コマンドのパラメーターで指定できるので任意のもので大丈夫です。
これで準備はできたので早速。
制御ファイルの自動生成
このコマンドを実行することで、Datastoreの統計情報(だいたい昨日時点の統計情報を元にして作成するので、数時間前に作ったカインドなどは統計情報に含まれておらず)を元にして--applicationで指定したs~XXXXXアプリケーションの--filenameで指定したbulkloader.yamlに制御ファイルを自動生成してくれます。
なお、--urlの値に先ほどweb.xmlで設定したcom.google.apphosting.utils.remoteapi.RemoteApiServletを呼び出すURLを指定します。
※--applicationsの値が「s~」になっているのは、レプリケーションデータストアを選択している場合、これがつくようです。
ターゲットのダウンロードコマンド
ターゲットのアップロードコマンド
制御ファイルをDatastoreからエクスポートしておいて、
次に実際のデータをDatastoreからエクスポート。
それを参考にしながら、エクセルで文字列結合を利用してデータファイルを作成する。
できたデータファイルをインポートする。
これはGoogleAppEngineとはまったく関係がないことなのですが、カインドのプロパティの型が変更になったりしていたのでbulkloader.yamlを修正し、アップロードコマンドを実行してもbulkloader.yamlの定義内容が悪くてダメと怒られてしまうことが多々。
で、制御ファイルのbulkloader.yamlを見ても特におかしくない。
こうなった原因は、Windows7やVistaではbulkloader.yaml(C:\Program Files配下)がWindows7バーチャルストア機能で変なところ(たしかAppData)にリダイレクトされていたため。
Program Files配下のbulkloader.yamlを何度直してもAppDataのbulkloader.yamlが実際にプログラムからは参照されていたためコマンドが失敗することになった。
あと、コマンドプロンプト自体もWindows7では管理者権限で実行しないといけないようでした。
※入力/出力ファイル形式について
下記にも記述ありますが、bulkloader.yamlのconnectorを指定することでcsvファイルやxmlファイルなどの形式に入力/出力ファイル形式を変更できます。
http://code.google.com/intl/ja/appengine/docs/python/tools/uploadingdata.html#Editing_the_Configuration_File
bulkloader.yamlを生成して、connectorをcsvにして、データを出力し、編集して入力するのがいいと思います。
GAE/Pythonだとわりと記事があってGgりながらやればできるって「安心感」があるのですが、
GAE/Javaでバルクローダーの記事はあまりないので、できるのかどうか不安になりました。
公式ドキュメントにはできるように書いてあるのですが詳細な手順はありません…。
なお、Pythonが実行出来る環境で、たしかhttplib2などのライブラリをインストールしておく必要はありますが、こちらはpython版でGgるといっぱい出てきますので割愛。
実行時エラーで足りないライブラリを確認しながらいれてもそれほど時間にもなりません。
pythonライブラリのインストール方法はhttp://isann.blog2.fc2.com/blog-entry-186.htmlの「■依存のあるライブラリをまずインストールする」あたりを参考にどうぞ。
やり方
まずは公式ドキュメントの通り下記を組み込みます。
ヒント: Java のアプリケーションについては、Java 実行環境に含まれている Java 版の remote_api ハンドラをインストールした上で、Python 版の appcfg.py ツールを使用することができます。ハンドラの servlet クラスは com.google.apphosting.utils.remoteapi.RemoteApiServlet です。
これは、web.xmlに組み込むだけです。
URLは「appcfg.py create_bulkloader_config」コマンドのパラメーターで指定できるので任意のもので大丈夫です。
これで準備はできたので早速。
制御ファイルの自動生成
python appcfg.py create_bulkloader_config --application=s~XXXXX --filename=bulkloader.yaml --url=http://XXXXX.appspot.com/remote_api
このコマンドを実行することで、Datastoreの統計情報(だいたい昨日時点の統計情報を元にして作成するので、数時間前に作ったカインドなどは統計情報に含まれておらず)を元にして--applicationで指定したs~XXXXXアプリケーションの--filenameで指定したbulkloader.yamlに制御ファイルを自動生成してくれます。
なお、--urlの値に先ほどweb.xmlで設定したcom.google.apphosting.utils.remoteapi.RemoteApiServletを呼び出すURLを指定します。
※--applicationsの値が「s~」になっているのは、レプリケーションデータストアを選択している場合、これがつくようです。
ターゲットのダウンロードコマンド
python appcfg.py download_data --application=s~XXXXX --config_file=bulkloader.yaml --filename=エクスポートする任意のファイルパス --kind=データをエクスポートしたいカインド名 --url=http://XXXXX.appspot.com/remote_api
ターゲットのアップロードコマンド
python appcfg.py upload_data --application=s~XXXXX --config_file=bulkloader.yaml --filename=インポートしたい任意のファイルパス --kind=Hoge --url=http://XXXXX.appspot.com/remote_api
インポートするデータファイルの作成
制御ファイルをDatastoreからエクスポートしておいて、
次に実際のデータをDatastoreからエクスポート。
それを参考にしながら、エクセルで文字列結合を利用してデータファイルを作成する。
できたデータファイルをインポートする。
ハマったこと
これはGoogleAppEngineとはまったく関係がないことなのですが、カインドのプロパティの型が変更になったりしていたのでbulkloader.yamlを修正し、アップロードコマンドを実行してもbulkloader.yamlの定義内容が悪くてダメと怒られてしまうことが多々。
で、制御ファイルのbulkloader.yamlを見ても特におかしくない。
こうなった原因は、Windows7やVistaではbulkloader.yaml(C:\Program Files配下)がWindows7バーチャルストア機能で変なところ(たしかAppData)にリダイレクトされていたため。
Program Files配下のbulkloader.yamlを何度直してもAppDataのbulkloader.yamlが実際にプログラムからは参照されていたためコマンドが失敗することになった。
あと、コマンドプロンプト自体もWindows7では管理者権限で実行しないといけないようでした。
※入力/出力ファイル形式について
下記にも記述ありますが、bulkloader.yamlのconnectorを指定することでcsvファイルやxmlファイルなどの形式に入力/出力ファイル形式を変更できます。
http://code.google.com/intl/ja/appengine/docs/python/tools/uploadingdata.html#Editing_the_Configuration_File
bulkloader.yamlを生成して、connectorをcsvにして、データを出力し、編集して入力するのがいいと思います。