処理の流れと実装
以下はワードカウントのためのJadoopの実装となります。
入力データ
1, wakimoto takeshi
2, wakimoto hajime
3, beat takeshi
4, neet kiyoshi
キーは行番号,
出力データ
hajime,1
kiyoshi,1
takeshi,2
beet,1
neet,1
wakimoto,2
それぞれの単語と単語の出現個数がキーとバリューで表現されています。
コンストラクタ
今回はJadoop.
26 var j = new Jadoop("wordcount", //このクライアントで処理したい種別
34 "http://localhost/test-cgi/jadoop/cgi/mapGet.cgi", // mapするデータの取得
35 "http://localhost/test-cgi/jadoop/cgi/mapPost.cgi", // map関数の戻り値をポストする
36 "http://localhost/test-cgi/jadoop/cgi/redGet.cgi", // reduceするデータの取得
37 "http://localhost/test-cgi/jadoop/cgi/redPost.cgi", // reduce関数の戻り値をポストする
38 "http://localhost/test-cgi/jadoop/cgi/getTask.cgi" // 種別ごとのred, mapするタスクのIDを取得
39 );
40
ここではwordcoutという種別で各種入出力のためのCGIを定義しています。
Map関数
コンストラクタで定義したmapするデータの取得CGIで得られるデータのキーとバリューのペアごとに呼び出される関数です。この例では,
42 // map関数
43 var wordcoundMap = function(key, val)
44 {
45 var res = new Array();
46
47 // 分かち書きライブラリ
48 var segmenter = new TinySegmenter(); // インスタンス生成
49 var segs = segmenter.segment(val);
50
51 $.each(segs, function(i, a){
52 res.push([a,1]);
53 });
54
55 if ( segs.length == 0 )
56 {
57 res.push(["",1]);
58 }
59
60 return res;
61 }
ここではTynySegmenterという分かち書きのjsライブラリを使用しています。与えた文字列をこのライブラリで分かち書きし,
1行目を例にすると,
- [[wakimoto,1],[takeshi, 1]]
という配列を生成していることになります。
mapするデータ全てに処理を適用後,
Reduce関数
Reduce関数はMap処理が全て済んでから呼び出されます。(サーバサイドで全てのMap処理が終わった事を検知してReduce用のデータをダウンロードさせる)
reduceするデータの取得で得られたデータはキーごとにグルーピングされ,
- [takeshi, [1,1]]
63 // reduce関数
64 function wordcoundRed(key, val)
65 {
66 var res = new Array();
67
68 var vals = val.length;
69
70 return [key, vals];
71 }
この処理ではキーごとの出現回数をカウントするだけなので単純にvalのlengthを取得し,
全てのreduceするデータの処理が終わった後,
Jadoopへのセットと実行
Jadoopオブジェクトにmapper, reducerとして登録し,
74 j.setMap(wordcoundMap);
75 j.setRed(wordcoundRed);
80 setInterval('j.doMapRed()', 10000);
この例では10秒ごとにmapデータのダウンロード,
このようなjsを自分のWebページに仕込むことで,