Python-Hackathon #3 で話してきました

お疲れ様でした & ありがとうございました。あんなに人が集まっていて、しかも夜まで帰らないなんてすげーな、と。

以下参加記録。

いくつか www.yssk22.info 向きにリンク張ってますが、どうもDNSの契約更新しわすれてたみたいで、一時的にDNSが引けなくなってます。。。振り込みはしたのでそのうち直るはずです。

発表資料。

一度だけやってみたかった「CouchDBは21世紀のLotus Notes/Dominoである」というテーマで挑んだら、案の定、というかNotesユーザーいねぇーーーって状況で、ごめんなさい、でした。もうやりません。

最後、主催の id:Voluntas さんにFutonもみせて!といわれて、大事なことをわすれていたことに気がつきました。。。しかし、ここ数ヶ月はFutonを触ってないというか、Hands-onの説明のために触ったぐらいなんですよ。。。基本はEmacs+CouchApp+terminalで十分だったというオチで。。。ともかく助かりました。

FutonJavaScriptの量が増えるとエラーになるので、どうにも好かんのです。

もう一つ忘れたのは、海の向こうの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

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しらないからわらかない。

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

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 リクエストも出したんですけどね!