SyntaxHighlighter

2012年8月6日月曜日

GoogleAppEngine MapReduceとGoogleCloudStorageを連携させてみた


また久しぶりのエントリになってしまったが、
実はひそかにPythonを勉強していたのだ。

GAE MapReduceはJava版を以前紹介したが、Mapperのみの実装だったので、
なんだか物足りなさを感じていた。
しかし、Python版はなんとShuffle,Reduceまでフル実装だった!
Pythonに乗り換えた理由である。

ただ、実際に動作させてみると分かるが、中間ファイルの読み書きの多さが欠点に感じる
(Shard数を16で動作させるとDatastore Write Operationsが一気に60%くらいになった)
ここで、GoogleCloudStorageに入力ファイル、中間ファイル、出力ファイルを格納してみてはどうだろうか。と考えた。
※実際はPipelineAPIでバンバン読み書きしてるからっぽいけど。。^^;

GAE MapReduceのソースをみる限り出力ファイルはGoogleCloudStorageに対応しているように見えたが、入力ファイルについては対応していないようだった。
早速作ってみた。
GoogleStorageLineInputReaderというGoogleCloudStorageより入力ファイルを読み込むクラスを作成した。
ちょうど本家Hadoop MapReduceのTextInputFormatのように値はテキストファイルの1行、キーはその値の開始位置というレコードを出力する。

中間ファイル、出力ファイルはGoogleCloudStorage向けに出力するようにパッチを当てた。

ソースGitHubに公開してあるのでそちらで参照して欲しい。

早速動かしてみよう。
今回もWordCountだ。w
入力ファイルはGoogleCloudStorageにアップロードしておく必要がある。
それと、中間ファイル、出力ファイルが格納されるバケットも予め用意しておく必要がある。














入力ファイルは以下の内容



Mapper,Reducer,MapreducePipelineの実装


そして実行。














Shuffleフェーズ
















完了。










うん、結果バッチリ。













今回はまだ小規模なデータしか扱ってないので、
まだ課題は見つからなかったが、これから中規模、大規模と
チャレンジしていきたい(クラウド貧乏にならないように注意が必要だがw)

あと、Pythonもまだ触りたてなので、磨いていきたい。
次回も引き続きGAE MapReduceで遊んでみようかな。
Google Compute Engineも気になる。。)乞うご期待。

0 件のコメント:

コメントを投稿