発表資料。
一度だけやってみたかった「CouchDBは21世紀のLotus Notes/Dominoである」というテーマで挑んだら、案の定、というかNotesユーザーいねぇーーーって状況で、ごめんなさい、でした。もうやりません。
最後、主催の id:Voluntas さんにFutonもみせて!といわれて、大事なことをわすれていたことに気がつきました。。。しかし、ここ数ヶ月はFutonを触ってないというか、Hands-onの説明のために触ったぐらいなんですよ。。。基本はEmacs+CouchApp+terminalで十分だったというオチで。。。ともかく助かりました。
FutonはJavaScriptの量が増えるとエラーになるので、どうにも好かんのです。
もう一つ忘れたのは、海の向こうのBBCでは、CouchDBをコンテンツ配信プラットフォームとして使っているそうです(http://www.erlang-factory.com/conference/London2009/speakers/endafarrell)。
(追記) 帰ってTLみたら、Nokia N900で動いたらしいです。ケータイの上でCouchDB Relax. http://www.flickr.com/photos/janlehnardt/4297738374/ (via @janl)
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しらないからわらかない。
あ、副問い合わせはすごく面倒、というかできない、と思っていていいです。
Hackathonのtweet
http://www.yssk22.info/tstore/_design/search/_show/keyword/ts-search-%23monjudoh
保存しておきました。twitterと違ってなくなりません。しかし、twitterとちがってDNSが、契約更新忘れという人為ミスによって起こります。
なんかバグってて、重複してスレッドが走っちゃったみたいorz
JSONのデータとしてほしい方は、CouchDBを勉強するといいと思います(Viewに直接リクエストだせばとれます)。
ちなみに、tweet の著作権は、tweetした人、にあるようなので、実はこういう了承を得ずに勝手に永続化するサービスは割とグレーなんじゃないかなぁと思ってます。まぁ魚拓/検索エンジンだと思ってください。消して!っていわれたら消します。
ソースはこの辺なので、http://github.com/yssk22/tstore 暇があったら直します。
CommonJS
id:hagino_3000 さんの発表をきいて、確かに、CommonJSの動きでserver side js のライブラリが充実してくるのなら、CouchDBの上で動かないといろいろと不便になりそうだな、と思った次第なので、ちょっと調べてみよう。SpiderMonkey ベースの実装があれば、組み込むのはそんなに難しくないと思ってます。
あと、CouchDBのモジュールロードの方法がダサイ、という件は、
// !code foo/bar/hoge.js
というコードを書く点なのですが、これはCouchDBではなくてCouchAppという、クライアントツールの方です。CouchDB側のServer Side JSには、実はモジュールロードという機能すらなくて、CouchAppというツールがクライアント上で #include を展開するのと同じように、!code を展開した上でHTTPでCouchDBに送りつけます。
で、確かにこれ、ちょーださくて、
/* a.js */ // !code b.js ...
/* b.js */ // !/code c.js ...
と書いたら、当然 a.js では (b.jsを経由して) c.js までよみこんでくれることを期待したいのですが、それはしてくれません。これはださい、と思ったので、git で fork して使ってます。http://github.com/yssk22/couchapp 。pull リクエストも出したんですけどね!