R&Dトレンドレポート

第13回 Hadoopおまけ編─“Jadoop”作ってみました

この記事を読むのに必要な時間:およそ 4 分

実装しての感想

キーとバリューというデータ構造,MapとReduceという処理フェーズの関係性が明確だったので実装は非常に簡単に進めることができました。単純ではありますが,この割り切りが非常に重要で,Hadoopというフレームワークがいかに強力かというのを思い知らされました。

今回作成したJadoopですが,実用的かどうかはともかく,実際にデータがフェーズごとに変化し,最終的に結果として出力されるのは快感です。

Hadoopとの違いは,

  • リアルタイムでデータをダウンロードさせるため小さいサイズに限られる
  • 大容量データを処理するにはより多数のクライアントが必要
  • より多数のクライアントによってサーバ側がボトルネックになるかも
  • JavaScriptに依存した処理しかできない

というところでしょうか。またサーバサイドの実装も必要なため,それほど手軽ではないかもしれませんね。ただ,サーバサイドのクラウドが叫ばれますが,サーバ側から見たらクライアントPC群もクラウドなのではないか,という発想の実現は非常に楽しいものがありました。

最後に今回作成したJadoop.jsを掲載しておきます。

var Jadoop = function(id, mapTaskGetURL, mapResPostURL, redTaskGetURL, redResPostURL, getTaskURL)
{
	this.id = id;

	this.maxCount = 100;

	Jadoop.prototype.mapTaskGetURL = mapTaskGetURL;
	Jadoop.prototype.mapResPostURL = mapResPostURL;
	Jadoop.prototype.redTaskGetURL = redTaskGetURL;
	Jadoop.prototype.redResPostURL = redResPostURL;
	Jadoop.prototype.getTaskURL = getTaskURL;

	Jadoop.prototype.mapOut = new Array();
	Jadoop.prototype.redOut = new Array();

}


Jadoop.prototype.setMap = function(f)
{
	Jadoop.prototype.map = f;
}

Jadoop.prototype.setRed = function(f)
{
	Jadoop.prototype.red = f;
}

Jadoop.prototype._getTask = function(kind)
{
	if ( kind == "map" )
	{
		$.getJSON(
			Jadoop.prototype.getTaskURL, 
			{"proc":0, "id": this.id},
			function(data){
				if ( data[0] == "" ) return false;
				Jadoop.prototype._doMap(data[0]);
			}
		);
	}
	else if ( kind == "red" )
	{
		$.getJSON(
			Jadoop.prototype.getTaskURL, 
			{"proc":1, "id": this.id},
			function(data){
				if ( data[0] == "" ) return false;
				Jadoop.prototype._doRed(data[0]);
			}
		);
	}

}

Jadoop.prototype._doRed = function(tid)
{
	$.getJSON(
		this.redTaskGetURL,
		{"tid":tid},
		this._Red
	);
}

Jadoop.prototype._Red = function(data)
{

	Jadoop.prototype.redOut.length = 0;

	$.each(data, function(i, d){
		var tid = d[0];
		var key = d[1];
		var val = d[2];

		var ret = Jadoop.prototype.red(key, val);

		Jadoop.prototype.redOut.push([d[0], ret[0], ret[1]]);

	});

	var vars = $.toJSON(Jadoop.prototype.redOut);

	$.ajax({
	type:"POST",
	url: Jadoop.prototype.redResPostURL,
	data: "data="+vars,
	success: function(msg){
		}
	});

}

Jadoop.prototype._doMap = function(tid)
{
	$.getJSON(
		this.mapTaskGetURL,
		{"tid":tid},
		this._Map
	);

	console.log(this);
}

Jadoop.prototype.doMapRed = function()
{
	this._getTask("map")
	this._getTask("red")
}

Jadoop.prototype._Map = function(data)
{
	Jadoop.prototype.mapOut.length = 0;

	$.each(data, function(i, d){
		var tid = d[0];
		var rid = d[1];
		var key = d[2];
		var val = d[3];

		var ret = Jadoop.prototype.map(key, val);

		$.each(ret, function(i, data){
			Jadoop.prototype.mapOut.push([tid, rid, data[0], data[1]]);
		});

	});

	var vars = $.toJSON(Jadoop.prototype.mapOut);

	$.ajax({
	type:"POST",
	url: Jadoop.prototype.mapResPostURL,
	data: "data="+vars,
	success: function(msg){
		}
	});

}

著者プロフィール

脇本武士(わきもとたけし)

都内中小IT企業(メイサンソフト(株))に所属。某大手自動車会社でのシステム開発,運用を経て,現在は研究開発部署に席をお借りしています。DB周りの保守サポート,ウェブ技術開発を主に手がけてきました。現在は大規模計算フレームワークの活用とKVSに注目しています。普段はOS Xを使用していますが一番よく使うアプリはTerminalです(笑)。

R&Dトレンドレポート(てくらぼ)