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 。
HadoopのMapReduceとCouchDBのMapReduce、プログラミングモデルは同じなのですが、実行モデルが違います。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ではどうにもならない領域です。CouchDB と Hadoop を組み合わせることはできます。ITアーキテクトのHadoop特集の時に、しれっと、CouchDBという名前は出さずにモデルケースを書いてみました。しかしHadoop使う領域のデータ量でCouchDBがちゃんと動くかどうか、、、どうだろう。
CouchDBのMapReduceでできないSQLの問い合わせ処理ってなんかありますか?
CouchDBのMapReduceの弱点はMapReduceのサイクルを1回しかできないことです。
で、COUNTとかMAX, MIN とかは1回のMapReduceでOKなんですが、AVG ができません。AVG は SUM / COUNT で定義されると思うのですが、この 除算部分 が、MapReduce の計算モデルで実行しようとすると、1回のMapReduceでは実現できないのです。なので、AVGやりたいときは、SUMとCOUNTだけCouchDBでやらせて、除算は Client のJavaScriptでやっちゃってください。
と思っているのですが、あまり数学は得意じゃないので、1回のMapReduceでAVGを計算する方法があったら教えてください。
あとは、多少制約はあるものなんとかなるかと思います。。。(というかあまりSQLしらないからわらかない。
あ、副問い合わせはすごく面倒、というかできない、と思っていていいです。