Hands-on

http://dl.dropbox.com/u/219436/CouchDB/PythonHackathon3/handson/_build/html/index.html typoだらけで、まだ完成していませんが。本の翻訳もネズミがかじったような抜け状態ですが、あわせてどうぞ。 http://dl.dropbox.com/u/673631/couchdb/html/index.html。今は平日にまとまった時間がとれないので、執筆活動として酒でも飲みながら更新しようかと思います。

ところでハンズオンで聞かれたこと。

Q. MapReduce って複数のサーバーにまたがってスケールするんじゃないの?

CouchDBだけだと複数サーバーにまたがってMapReduceをまとめることはできません。 Lounge というサードパーティツールが必要です。詳細は Definitive Guide にあります。http://dl.dropbox.com/u/673631/couchdb/html/18_clustering.html

HadoopMapReduceCouchDBMapReduce、プログラミングモデルは同じなのですが、実行モデルが違います。Hadoopの場合はMapの各タスクは独立して実行可能である、という理屈に基づいて、それぞれのノードでばらして実行させることでスケールさせるというモデルです。CouchDBの場合、Mapの各タスクは独立して実行可能である、という理屈に基づいて、それぞれのドキュメントに対して、時間差で実行させることで、スケールさせる、というモデルです。

例えば、a, b, c, ... というドキュメントに対して、 Hadoop の場合は、

map(a) | map(b) | map(c) | .... 

という実行の仕方になります。このとき、a, b, c, d ... のすべてのデータはMapを実行する時点(MapReduceを起動する時点)そろっている必要がありますね。

一方で、CouchDBの場合は、a, b, c, d... の全てのドキュメントがそろっている必要はなくて、

map(a)
map(b)
map(c)
....

という実行の仕方をします。c のドキュメントが作成されたらmapを実行する、というモデル。で、このとき、map(a)とかmap(b)とか、既に計算したものは、二度は実行しない、ので、map(a), map(b), map(c) ... を数十万のドキュメントに対して実行しても、前回実行時から更新された部分しかmap処理が行われないので、比較的早く結果を返すことができる、というものなのです。

Reduceに関しても実は、可能な限りキャッシュがきくので sum(map(a), map(b), map(c), ....) のような計算でも、 sum(前回のsum結果(の一部)、map(c), ...) という計算モデルで実行されるようになっているはず、です(はず、というのは、こういう実装になってからのソースはちゃんと読んでいないので...)。

ま、逆に言うと、ソーシャルグラフの解析だとか、その辺の関連性解析は、CouchDBではどうにもならない領域です。CouchDBHadoop を組み合わせることはできます。ITアーキテクトHadoop特集の時に、しれっと、CouchDBという名前は出さずにモデルケースを書いてみました。しかしHadoop使う領域のデータ量でCouchDBがちゃんと動くかどうか、、、どうだろう。

CouchDBMapReduceでできないSQLの問い合わせ処理ってなんかありますか?

CouchDBMapReduceの弱点はMapReduceのサイクルを1回しかできないことです。

で、COUNTとかMAX, MIN とかは1回のMapReduceでOKなんですが、AVG ができません。AVG は SUM / COUNT で定義されると思うのですが、この 除算部分 が、MapReduce の計算モデルで実行しようとすると、1回のMapReduceでは実現できないのです。なので、AVGやりたいときは、SUMとCOUNTだけCouchDBでやらせて、除算は Client のJavaScriptでやっちゃってください。

と思っているのですが、あまり数学は得意じゃないので、1回のMapReduceAVGを計算する方法があったら教えてください。

あとは、多少制約はあるものなんとかなるかと思います。。。(というかあまりSQLしらないからわらかない。

あ、副問い合わせはすごく面倒、というかできない、と思っていていいです。