Amazon ElasticMapreduceメモ

Amazon ElasticMapreduceのテストを兼ねて性能測定を行ったので分かったことをメモ

ジョブフローの起動

ジョブフローを登録してからステータスが「RUNNING」に変わるまで4分~6分かかる
立ち上げるインスタンスの数が変わってもこの時間は変わらない

MapTaskの数

EMRに限らずHadoopの動作ですがインスタンス数などの起動設定に必要なのでメモ
入力に1GBのファイルを使用したところどのような構成にしても全て16個のMapTaskが生成された

MapTaskの数 = 入力ファイルのサイズ ÷ 64MB

圧縮した場合はBZip2とGZipで試した結果コーデックに関わらず1つの入力ファイルは
1つのMapTaskに割り当てられるみたい

ブロックサイズを変更すれば分割するサイズを変更することが可能
"fs.s3n.block.size"で指定する(デフォルトは67108864)

// ブロックサイズを32MBに設定
conf.setInt("fs.s3n.block.size", (67108864 / 2));

EC2インスタンス数の上限

EC2の同時起動台数上限を超えてインスタンスを立ち上げようとしたときキャンセルされる
(ステータスはFAILEDとなる)

Job flow failed with reason: The requested number of instances exceeds your EC2 quota

EC2のインスタンス同時起動台数はデフォルトで20台なのでEMRを使用する場合は
余裕をもって使用できるよう増やしておく

圧縮について

ローカルからS3への転送がすごく遅いので圧縮した方が嬉しいことが多い
圧縮ファイルを入力に渡すとHadoopが解凍してくれるので圧縮するだけで使用可能。

スプリット 速度 圧縮率
BZip2 遅い 高い
GZip × 速い
Snappy × かなり速い 低い

性能について

MapTaskは分割した分だけ台数を用意すると性能おおよそ理論値通りに動作した

Map処理完了までの時間 = (MapTask数 ÷ インスタンス数) × MapTaskの実行時間

ReduceTaskはS3への出力に時間がかかるようで起動設定に100台とか設定しても
S3への出力はReduceTask(出力先毎)に1台のインスタンスが担当するため出力先が
2つであれば2台のインスタンスで最後は頑張ることになる
ReduceTaskを分けて出力を複数のファイルに分割するか出力を圧縮すると性能向上が
見込めるのではないかと思う