R&Dトレンドレポート

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

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

MapReduceは強力なバッチ処理を行う分散システムですが,サーバもクライアントも専用のソフトウェアが必要となります。だからこそ,高効率な環境が構築できるという利点もありますが,入出力がキーとバリューであるという点に着目した場合,同じような動作をするシステムがWeb上で作れるのではないか?と思いました。

現在はさまざまなシステムがWebサービスとして展開されており,あらゆるサービスを受けることができます。Webメール,スケジューラー,動画サイト,オフィスクローンなどなど…。Webブラウザが1つのプラットフォームとして進化し,またそれがOSの域にまで足を伸ばそうとしています。

そして,それらの実装の多くにJavaScriptが使用されていますが,ブラウザとWebサービスの進化の両方が組み合わさったときに,単独のプラグインやランタイム環境を必要としないJavaScriptが使用されるのはもっともな話です。

  • サーバにぶら下がる多くのクライアントPC
  •             ↓
  • サーバから見た場合,多くのクライアントPC=計算機リソース
  •             ↓
  • NameNodeにぶら下がるDataNode群

という関係性に置き換えられないだろうか? という単純な発想の元,MapReduce処理をJavaScript+CGIで作ってみようと思いました。これが⁠Jadoop⁠です。

システム概要

HadoopとJadoopの違いは図1のようになります。

図1 HadoopとJadoop

図1 HadoopとJadoop

Hadoopの場合はデータの保存時にデータブロックごとにDataNodeに分割保存されます。MapReduce指示を受け,タスクを各DataNodeに分配しますが,そのときは各自が自分で保存しているデータを計算に使用し,無駄なデータ転送が行われないようにしています。

Jadoopの場合はデータの管理は全てサーバサイドで行っており,PCからのリクエストによりデータをその場でダウンロードさせます。PCはダウンロードしたデータについて処理を行い,サーバに返します。この点ではサーバ主導型の分散といえます。基本的にはこの流れをMap,Reduceそれぞれのタスクで行います。

Map処理について

図2 Map処理

図2 Map処理

サーバサイドではMapしたいデータについてPCからのリクエストに応じて分割ダウンロードさせます。データ形式はJSONを使用し,データはキーとバリューの配列を渡します。

PCではmap処理用のJavaScript関数により,ダウンロードしたデータについてキーとバリューを意識した処理を行います。処理結果はそれぞれMap処理済みとしてサーバにアップロードされます。このときのデータ形式もJSONとし,キーとバリューの配列を渡します。

Mapしたいデータについて全て処理が終わったモノがMapの結果として保存され,次のReduceフェーズへと進みます。

Reduce処理について

図3 Reduce処理

図3 Reduce処理

Reduceも基本的にMapと同じですが,データのダウンロードの前にキーごとにバリューをグルーピングし,ソートするという処理をサーバサイドで行います。これを行うことにより,同一のキーが別々のReduce処理に流れることを防ぎ,かつデータの並び順もReduce処理単位では保証されることを意図しています。

これで生成されたReduceしたいデータはMapと同じようにPCからの要求に応じて分割してダウンロードされます。このときのデータ形式はJSONですが,キーとバリューの関係が1対1ではなく,1対Nのリスト構造となっています。これは前述のような処理を行っているためですが,お手本のReduceを摸したものとなっています。

PCではreduce処理用のJavaScriptの関数を通してキーとバリューのリストを処理し,結果をサーバにアップロードします。この処理が全ての分割されたデータについて行われたとき,MapReduceの処理は完結します。

著者プロフィール

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

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

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

コメント

コメントの記入