AmazonのElastic MapReduceは時間単位でサーバを借りてMapReduce処理を実行することができる。
実行命令を出すと指定した数のインスタンスが自動で立ち上がり、S3に置いてあるデータに対して処理が行われる。
東京リージョンだとラージインスタンスが1時間0.428ドル(0.368+0.06)。10台借りても4.28ドル(1ドル80円として342円)。アメリカのリージョン使うともう少し安い。ラージを10個も借りれば、けっこうな速度で処理を実行してくれる。
課金は1時間単位。1分使っても59分使っても1時間分。1時間を1分でも過ぎると2時間分が課金される。
実行速度はインスタンスの数にある程度比例する。10台使って30分で終わる処理だったら、5台にするとだいたい1時間強で終わることになる。貧乏性の私としては、「10台で30分なら6台で55分くらいかな。せっかくなら時間めいっぱい働いて欲しいから6台で動かそう」なんてことを考えてしまう。
分単位の実行時間を正確に予想するなんて難しい話で、うっかり1時間1分とかかかってしまうと2時間分の料金が請求されることになる。
前述の例では、6台で2時間になると12台分の金額がかかることになる。時間が余計にかかった上に10台より高くついてしまったではないか。ショックだ。余裕を持って7台にしておけば……
Jobが失敗した時もお金はかかる。プログラムにミスがあって処理が途中で落ちたりすると、たとえ開始1分で処理が落ちていたとしても1時間分の金額がかかってしまう。意気揚々と10台を立ち上げて、インスタンスが立ち上がったと思ったら速攻エラーになっていたりすると、なんとも言えない物悲しい気持ちになる。
Stepが失敗してもTerminateせずにインスタンスを立ち上げたままにしておくことはできる。急いで直して再度Stepを実行すれば、1時間以内に処理を納められるかもしれない。
けど、「5分以内に修正できれば……」なんて焦った気持ちでやってもなかなかうまくいかないもので、たいていはまた失敗して「もういいや」と言ってJobをterminateしてしまうことになる。
慣れないうちはパスの指定とかを間違うことも多いので、何回も失敗を積み重ねることを覚悟しておかないといけない。そこでまずはスモールインスタンス(0.107ドル(0.092+0.015)= 8.56円/時)2台でジョブを走らせてみて、問題なく動きそうだったらそのJobを止めて、適切な台数で再度走らせたりする。
そうしてちゃんと確認した場合でも、走らせてからだいぶ時間が経った後にMapperでOutOfMemoryが起きてやっぱり失敗しました、なんてことも起こったりする。そのたびに削られる数百円。大きな金額ではないのだけど、何かにつまずくたびに削られるライフ。
少額で大規模な処理ができるので、Elastic MapReduceは経済的には優しい子だ。自前で複数台のマシンを買い揃えるのに比べれば、何十倍も財布に優しい。
けど、貧乏性な人間の精神をチクチクと攻撃してくるような罠が随所に用意されてもいる。この処理はいくらかかるだろう。転送料はいくらになるだろう。JobをTerminateし損なうことはないだろうか。ああ、失敗した。400円余計にかかってしまった。ああ、もったいない。
お金に細かい性格をした人間が使うと大雑把に利用することがない分、料金は低めに抑えることができると思う。そういう意味では、おそらく貧乏性であることとElastic MapReduceは相性が良い(経済的な意味で)。けど、失敗のたびにダメージを受けることを考えると相性が悪い(精神的な意味で)。
失敗によるダメージを気にすることなく、且つ最小の金額で冷静にJobを実行できるような、強い心を持った人間になりたいものだ。