名前付規則とかさ...

Amazon Elastic MapReduceのベースとなっているHadoopの性能を測定中。Hadoop本(洋書)268ページに記載されているrandomwriterを使っているのだが、ノード数が変わると書き出されるファイル容量も変わってくる。なんでじゃろと調べてみた。

Hadoop WikiRandomWriterによれば

  • test.randomwriter.maps_per_host
  • test.randomwrite.bytes_per_map
  • test.randomwrite.min_key
  • test.randomwrite.max_key
  • test.randomwrite.min_value
  • test.randomwrite.max_value

という引数を取れる。つまり、ノードを増やした場合にはmaps_per_hostとbytes_per_mapを調整してやらないとベンチマーク指標にはならない。例えばAEMで16ノードを立ち上げた場合、Mapperが走るノードは15となるから、デフォルトでは150のMapperが走る。全部で1GBを出力したいのなら、1073741824/150=7158278をtest.randomwrite.bytes_per_mapで指定してやる必要がある。こんな感じ。

$ hadoop jar hadoop-examples.jar randomwriter -D test.randomwrite.min_key=10 -D test.randomwrite.max_key=10 -D test.randomwrite.min_value=90 -D test.randomwrite.max_value=90 -D test.randomwrite.bytes_per_map=7158278 -D test.randomwriter.maps_per_host=10 random-data

m1.smallだと1分前後で処理は終わる。

どうでも良いこと

maps_per_hostだけtest.randomwriter.maps_per_hostで、あとはtest.randomwrite.*なのはなぜ? これに気づかず、悶々と悩んでしまった。ソースをみても

    int numMaps = cluster.getTaskTrackers() * 
         jobConf.getInt("test.randomwriter.maps_per_host", 10);
      numBytesToWrite = job.getLong("test.randomwrite.bytes_per_map",
                                       1*1024*1024*1024);
      minKeySize = job.getInt("test.randomwrite.min_key", 10);
      keySizeRange = 
        job.getInt("test.randomwrite.max_key", 1000) - minKeySize;
      minValueSize = job.getInt("test.randomwrite.min_value", 0);
      valueSizeRange = 
        job.getInt("test.randomwrite.max_value", 20000) - minValueSize;

意図的なのか間違いなのかわからんが、できれば揃えて欲しかった。でも解説書が不揃いのままで公開されちゃってるから、もう手遅れなのねん。

→てかさー、こういう仕掛けなら変数名をクラス属性っぽく決めないでほしかった。

Hadoop

Hadoop

Hadoop

Hadoop