[T-6]MapReduceをAzureで実装してみたデモ。ないものはつくるしかない。
ないものはつくるしかない。ソフトウェア開発者の基本姿勢としては正しいと思う。
Windows AzureにHadoopのようなMapReduce処理を肩代わりしてくれるフレームワークが
内包されていればそれはそれで便利かもしれないが、ないものは嘆いても仕方ない。
マイクロソフトが開発者に活躍の余地を残してくれていると前向きに考えてみてもらえると
ありがたいのだが、さすがにインスパイアするための呼び水は必要だろう。
ということで、先日マイクロソフトMVPのみなさまを対象としたOpenDayというイベントで
ご紹介させていただいたAzureでMapReduceを実装してみたデモの概要を、このブログでも
簡単にとりあげてみたい。先にネタバレしておくと、これは我々のカウンターパートである
マイクロソフト本社のアーキテクトエバンジェリストWade Wegnerが中心となって
作成したもので、日本にも何度か来ているアーキテクトSimon Guestも一枚かんでいる。
MapReduceというとなにか特殊なモノに感じてしまう方もいるかもしれないが、基本的には
問題を小分けにして分散処理させて、結果を寄せ集めるだけの簡単な処理にすぎない。
そこで、Windows Azureの構成要素であるWebRole、WorkerRole、Queue、Tableを
組み合わせて実現しようとすると自然と下図のような感じになる。
もちろん、個々のハードウェアの故障率の読めないクラウド環境において、タスクの
異常終了を関知して他の処理にひきとらせたり、負荷を検知してタスクの大小を
器用に振り分けたり、タスクの完了を厳密に把握したり、終了したタスクの待ち合わせを
最小化できるよう問題分割に何らかの賢いアルゴリズムを持ち込んだり、と
工夫の余地は山ほどある。
今回のデモでは、それら実用面で必要となるであろうポイントを一切無視して、
単純に「素数を表示」するというシンプルな仕組みを MapReduce 的に実現している。
処理に使用するNode数と素数を探索する上限を指定して「Map」ボタンを押すと、
WebRoleが処理を分割してWorkerRoleに引き渡す処理を行う。今回は単純に
「その数が素数か否かを判定する」という単位にJOBを分割しているのでMap処理で
特に悩むことはない。データをTableに、処理要求をQueueに書き込むだけである。
次に、「Execute」ボタンを押すと、各ノードのWorkerRoleがQueueを調べて自分が
処理するJOBを拾って素数かどうかを判定し、結果をTableに書き込む。
そして最後に、「Reduce」ボタンを押すと、Tableから結果をひろって表示する。
それだけである。どうだろう?「このくらいなら自分にもできそうだ!」と思って
いただけたら大成功。WindowsAzureはあくまでクラウド上でアプリを動かす
プラットフォームでしかないため、その上で稼働するアプリを作り上げてゆく過程では
個人の開発者やソフトウェア開発企業に多くのビジネス機会があるのである。
MapReduce的な発想をとりこんだアプリをつくるもよし、汎用的なMapReduce
フレームワークをつくるもよし、いろんな角度でWindowsAzureと向き合うことができる。
米国やインドなどを中心に世界中の開発者が試行錯誤している段階なので、
そこに入り込んで最先端なギークたちと戯れるもよし、その成果物が形になって
利用可能になるまで待つということでも、まあよいだろう。
こちらのDavid Chappell取材記事でもコメントされているように、マイクロソフトが自前の
クラウド的な分散処理系を実用レベルで一般向けに投入してくるのはもう少し先のことに
なりそうである。やはり本命は今のところDryadの登場を待つことになる。
MapReduceのことを考えていたら、ふと、昔のR11くらいの Oracle Applications を
思い出してしまった。今で言うOracle社のERPであるE-Business Suiteにも、当時から
コンカレント・プログラムという枠組みがあって、主にバッチ処理を担っていたのだが、
生産管理・計画系の処理でほぼMapReduce的に実行しているものもあったように思う。
まだまだ若輩の私でさえ昔を回顧してしまうのは、今までみんながやりたくてもその都度
当時の技術的限界にさいなまれ、超大規模処理に発展できなかったことを、
ハードウェアの進化とクラウドのスケールアウト的なプログラミングモデルを組み合わせ、
今度こそ形になるのではないかという期待が、自然とこみあげてしまうためであろうか。
ちなみに、今回のデモではWorkerRoleもC#で記述しているが、計算の性格によっては
Visual Studio2010以降でサポートされる関数型言語のF#を利用してみるのもよいだろう。
道具立てはそろっている。
ないものはつくるしかない。というわけで、最後のオチは昨日と同じく
「ねだるな、勝ち取れ、さすれば与えられん」 by アドロック・サーストン
---
ご要望にお応えして、プロジェクトファイル一式を公開することにした。
期間限定となる可能性が高いので入手はお早めに。
VisualStudio2008SP1およびJulyCTPのAzureSDKとVisualStudioToolsで構築した
Azureの開発環境が必要。