Google App EngineのDatastore

下調べなど何もせず、GAEのマニュアルだけ眺めてトライ(http://d.hatena.ne.jp/yokolet/20080817#1219005007)した結果、この使いにくいDatastore何?という印象だったので、Datastore関係について調べてみました。忘れないようにメモしておきます。


GAEのDatastore関係についてはGooglingしても、なかなかいい資料に出会えなくて苦労したのですが、その後、YouTubeで公開されているhttp://code.google.com/events/io/ 2008の講演ビデオ多数で解説されていることがわかりました。中でも、Ryan Barrett氏の"Google I/O 2008 - App Engine Datastore Under the Covers - YouTube"がいちばんわかりやすいです。この講演で使われたスライドは文字がにじんでいてよく読めないのですが、メモがhttp://reverbisnotalie.com/code/google-io-under-the-covers-of-google-app-engine-datastoreにあり、何が書いてあるかを確認できました。 この講演で使われたスライドは"Under the Covers of the Google App Engine Datastore - 2008 Google I/O Session Videos and Slides"で公開されています。このビデオを見たあとで、GAEのドキュメント、"http://code.google.com/appengine/docs/datastore/keysandentitygroups.html"を読むと、何がどうなっているのかようやく理解できた感じです。何ヶ所かにancestorとかparentとかが出てきていて、何だろうと思っていたのですが、そういうところもビデオをみて納得でした。Barrett氏のプレゼンにはBigtableそのものについての解説はありません。Bigtableについては少し古いのですが、2005年10月にJeff Dean氏がUniversity of Washingtonで行った講演のビデオ(http://video.google.com/videoplay?docid=7278544055668715642)が、わかりやすかったかも。Bigtableの公式ドキュメントもありますが、あまりわかりやすい英文ではないのが残念。


私が理解したところをまとめておくと、、、BigtableGoogle File System(GFS)がベースにあるGAEのDatastoreではデータはrow単位でちぎられて分散システム上にバラバラと置かれているわけです。で、row単位という言い方はRDBMSに慣れ親しんでいる人がわかりやすいように言っているだけで、実際にはkey, valueペアのhashtableのようなものになっていて、各ペア単位(GAEではentity)でバラバラになっている感じでしょうか。GAEのentityは、おそらくDean氏の講演ではfamilyを指しているものと思われます。Family members live together.な感じがするのですが、同じentity groupに属するentitiesは関連して利用されることが多いので効率よく扱えるように、分散システムの中でまとめて置くようになるみたいです。Barrett氏の解説ではBigtableを"a sharded, sorted array"と呼んでいました。この辺りの構成についてはDean氏の講演で解説されています。Keyはディフォルトではrowとcolumn(GAEではproperty)とtimestampから構成されてるようですが、自分で作ってもいいみたいです。GAEにはGQLといういかにもSQLっぽいクエリーが出来るような方法が用意されていますが、実際にはhastableをスキャンするだけです(キーワード検索みたいな感じ)。RDBMSのようにあのtableとこのtableを連結して、この項目とこの項目がこう一致する、のような概念はありません。代わりにあるのがindexingと親子関係の概念です。この辺を理解してmodelをうまく作らないと、GAEらしいアプリにはならないのかも。


Barrett氏の講演で出てきた"sharded"という言葉は、shardingという使い方もあるようですが、辞書には名詞の"shard"しか記載が無いので、動詞形はソフトウェア世界の造語ではないかと思います。Hibernateを使っている方にはHibernate ShardsやHibernate Shardingでお馴染みかもしれませんが、巨大なデータを扱わなければならないときにデータベースを分割する技術のようです。Database Sharding Helps High-Traffic Sites | Data Center Knowledgeによると、GoogleからHibernateに寄贈されたとのこと。eBayでもこのindustry standardなHibernate Shardsを使っているという話がSoftware Engineering Radioの"http://www.se-radio.net/podcast/2008-09/episode-109-ebay039s-architecture-principles-randy-shoup"で語られていました。(余談ですが、このeBayの話はWeb Applicationを開発している人にはとても面白い内容です。)


BigtabelとGFSのように構成されている環境としては、オープンソースの実装 Apache Hadoop(http://hadoop.apache.org/core/)がありました。名前はそれぞれ、HBase(http://hadoop.apache.org/hbase/)とHadoop Distributed File System (HDFS)ではありますが。


というように、GAEのDatastoreが何なのかがわかってきたので、メリット引き出せるようなアプリを作ってみたいなぁ、と思う。


[追記] こちら、「たけまる / Google App Engine のデータストアは Bigtable をどのように使っているのか」すばらしいです。