- Amazon Elastic MapReduceの例で出てくるのは今まで見た限りでは、みんなs3n://で始まるS3 Native FileSystem上にファイルを置いている。
- http://wiki.apache.org/hadoop/AmazonS3 にあるように、もう一つ s3://で始まるS3 Block FileSystemというのがある。
- これまでS3fsって言ってたけどこれはs3-fuseと紛らわしいし、名前として正しくないのでS3 Block FileSystemと呼ぶべきでした。
- で、これを使いたい。
- メリットは、以下のように理解してる。
- ファイルがブロックに分割されるので、通常5GBまでというS3のファイルサイズの制限を超えられる
- ファイルがブロックに分割されるので、HDFSと同様Hadoopの各
jobtaskに処理を効率よく分散できる
- デメリットは、たぶんこんな感じ。
- bucket全体をS3 Block FileSystemに割り振らないといけない
- ファイルの管理をするクライアントがHadoopのCLI以外ない
- ほんで手前味噌ですがNet::Amazon::HadoopEC2::S3fsというのがあるんですよ。
#!/usr/bin/perl
use strict;
use warnings;
use Net::Amazon::HadoopEC2::S3fs;
my $file = shift or die;
my $fs = Net::Amazon::HadoopEC2::S3fs->new(
{
aws_access_key_id => $ENV{AWS_ACCESS_KEY_ID},
aws_secret_access_key => $ENV{AWS_SECRET_ACCESS_KEY},
bucket => 'lopnor-s3fs',
blocksize => 1024 * 20,
}
);
# we expect a empty bucket.
$fs->mkdir($_) for qw( / /input );
$fs->put(
{
file => $file,
destination => '/input',
}
);
- 手元でblocksizeを指定できるようにした。CPANにあがってるのにはついてないのでこのあと追加します。
- そんで以下のように指定して起動。
[danjou@sylvia] $ ./elastic-mapreduce --create \
- stream \
- input s3://lopnor-s3fs/input \
- output s3n://lopnor/hadoop/output2 \
- mapper '/usr/bin/perl -Iperl5/lib/perl5 -Iperl5/lib/perl5/i486-linux-gnu-thread-multi perl5/bin/hachero.pl -c mapper.yml' \
- reducer '/usr/bin/perl -Iperl5/lib/perl5 -Iperl5/lib/perl5/i486-linux-gnu-thread-multi perl5/bin/hachero.pl -c reducer.yml' \
- num-instances 3 \
- cache-archive s3n://lopnor/hadoop/lib/perl5.jar#perl5 \
- cache s3n://lopnor/hadoop/config/mapper.yml#mapper.yml \
- cache s3n://lopnor/hadoop/config/reducer.yml#reducer.yml
- ちゃんと動いたね。
- ということでS3 Block FileSystemでも動きました。
- パフォーマンスはどうなんでしょう。
- ブロックサイズをすごく小さくしたけど、これはちゃんと分割されたファイルが正しく処理されてるかをチェックするためで、2 ** 25がデフォルト。
- 以上のことから、機能面では十分使えそう、ということが分かった。
- Webインターフェイスがしょぼいのでチューニングのヒントが分かりづらい。
- これまで