Amazon Elastic MapReduceでperlを使った処理をしてみる

Nobuo Danjou
2009-04-05T08:56:21+0900
#!/usr/bin/perl
# mapper.pl
use strict;
use warnings;

while (<>) {
    my ($uri) = ($_ =~ /"(?:GET|POST|HEAD) ([\S]+?) HTTP/);
    print "$uri\n";
}
#!/usr/bin/perl
# reducer.pl
use strict;
use warnings;

my %count;
while (<>) {
    chomp $_;
    $_ or next;
    $count{$_}++;
}
for (sort {$count{$b} <=> $count{$a}} keys %count) {
    print "$_\t$count{$_}\n";
}

つうのをとりあえず書いてs3にあげる。

  • webインターフェイスから起動
  • ami-0667806fが立ち上がるね
  • hadoopのバージョンは0.18.0みたい
  • 2インスタンスでやってみたら失敗
    • なんで失敗したんか不明
  • CLIを使ってみる
./elastic-mapreduce --create \             
--stream \
--input s3n://lopnor/hadoop/input \
--output s3n://lopnor/hadoop/output2 \
--mapper s3n://lopnor/hadoop/bin/mapper.pl \
--reducer s3n://lopnor/hadoop/bin/reducer.pl
  • こんな感じ。インスタンスを指定してないので1個になったみたい
  • できた。
    • "--num-instances 3"としたら3つになった。
  • 次はCPANをどうやって使うか、ですなぁ。
    • "--cache-archive"を使うっぽいな。jarにlibをまとめてアップロードしておく感じか。
#!/usr/bin/perl
use strict;
use warnings;
use lib "lib";
use Hoge;

while (<>) {
    my $uri = Hoge::extract_uri($_);
    print "$uri\n";
}
package Hoge;
use strict;
use warnings;

sub extract_uri {
    my $line = shift;
    my ($uri) = ($line =~ /"(?:GET|POST|HEAD) ([\S]+?) HTTP/);
    return $uri;
}

1;

というのを書き、

jar cvf lib.jar -C lib .

としてlib.jarを作ってアップロード

./elastic-mapreduce --create \
--stream \
--input s3n://lopnor/hadoop/input \
--output s3n://lopnor/hadoop/output \
--mapper s3n://lopnor/hadoop/bin/mapper.pl \
--reducer s3n://lopnor/hadoop/bin/reducer.pl \
--num-instances 1 \
--cache-archive s3n://lopnor/hadoop/bin/lib.jar#lib

と指定してarchiveをlibに展開するように指定して実行。できたできた。

ということで、NanoAのextlib的な感じで必要なモジュールをまとめてjarファイルにしておけばけっこううまくいきそう。

  • あとはs3nファイルシステムじゃなくてs3ファイルシステムを使ってファイルの分割ができるかどうかですな。
  • ami-0667806fをec2-run-instances -k gsg-keypair ami-0667806fとして立ち上げてみたけどloginできなかった。keypairはどこでつかってんだろ。
[danjou@sylvia] $ ec2-describe-images ami-0667806f
IMAGE   ami-0667806f    aws157-team/images/2009-04-01:01:47:07/debian-i386/debian-i386.manifest.xml     286198878708    available       private       i386     machine aki-a71cf9ce    ari-a51cf9cc

ちうことでdebianですって。