YARNにおけるコンテナへのメモリアロケーションの割り当てユニット


## サマリ

**「YARNでResource Managerがコンテナに割り当てるメモリの単位が128MBの倍数、もしくは256MBの倍数になっている」**という話を聞いたのでこの原因を調べてみた。

これはHadoopのしわざ？EMRのしわざ？はたまた全然別のなにか？みたいなところを中心に調べてみた。

## 結論

- YARNのResource Managerはyarn.scheduler.minimum-allocation-mbの設定値の倍数を単位としてコンテナにメモリを割り当てていた。
- EMRのc3.xlargeにおいてはこの値が256だった。(AMI3.3.2と3.4.0で確認)


この情弱野郎が！と怒られそうだけど、Hadoopのコードを読んだわけじゃなくて人から聞いた話なので、どこでそういう実装になっているのかとか、どういう背景でこういう実装になっているのか、は今のところわからない。はい、読みます。。。


## きっかけ

下記のブログポスト群でそういうことを見つけたというか、「これってホント？」と質問をされたのがきっかけ。

- [EMR(Elastic MapReduce)でAMI3.X(Hadoop2.X)を使うと遅くなる場合](http://blog.goo.ne.jp/nakano-tomofumi/e/781e0da2a0870883106f2d7c59226f0d)

こっちはEMRだと256MBの倍数という話。

- [YARN＋Capacity Schedulerのメモリと並列処理](http://blog.father.gedow.net/2012/07/07/yarn-capacity-scheduler-memory-parallel/)

こっちはディストリビューションはわからない（ポストにCDH4ってタグがついているので、たぶんCDH?)けど128MBの倍数という話。

## ヒント

[@oza_x86](https://twitter.com/oza_x86)さんのこのスライドが大きなヒントになった。このスライドをもとにいろんな人と話していたら「yarn.scheduler.minimum-allocation-mbの値の倍数がメモリアロケーションの単位だよ」と教えてくれた！

<iframe src="//www.slideshare.net/slideshow/embed_code/36773546" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ozax86/hadoop-conference-japan-2014/20" title="Taming YARN @ Hadoop conference Japan 2014" target="_blank">Taming YARN @ Hadoop conference Japan 2014</a> </strong> from <strong><a href="//www.slideshare.net/ozax86" target="_blank">Tsuyoshi Ozawa</a></strong> </div>

## 試してみた

たとえば下記のような感じでBootstrap Actionでyarn.scheduler.minimum-allocation-mbを300MBに設定してみる。

**--bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hadoop,Name="Configure Hadoop",Args=[--yarn-key-value,yarn.scheduler.minimum-allocation-mb=300]**

コマンド全体はこちら。

```bash
aws emr create-cluster \
--name EMR3_3_2 \
--ami-version 3.3.2 \
--applications Name=Hive Name=Hue \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=c3.xlarge InstanceGroupType=CORE,InstanceCount=5,InstanceType=c3.xlarge \
--log-uri s3://PATH/TO/LOG/ \
--enable-debugging \
--ec2-attributes SubnetId=YOUR_SUBNET,KeyName=YOUR_KEYPAIR \
--bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hadoop,Name="Configure Hadoop",Args=[--yarn-key-value, yarn.scheduler.minimum-allocation-mb=300]

```

で、起動したクラスタで適当にHiveのクエリを投げてみつつ、Resource Managerのログを見守る。
そしたら実際に300MBの倍数で実際にコンテナにメモリが割り当てられた！

```bash
$ tail -f /media/ephemeral0/var/log/hadoop/yarn-hadoop-resourcemanager-ip-10-0-136-43.ap-northeast-1.compute.internal.log | grep Assigned
```

```bash:output
2015-03-17 02:41:42,622 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode (ResourceManager Event Processor): Assigned container container_1426559783155_0001_01_000001 of capacity <memory:3000, vCores:1> on host ip-10-0-248-65.ap-northeast-1.compute.internal:9103, which currently has 1 containers, <memory:3000, vCores:1> used and <memory:2632, vCores:3> available
2015-03-17 02:41:50,438 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode (ResourceManager Event Processor): Assigned container container_1426559783155_0001_01_000002 of capacity <memory:1500, vCores:1> on host ip-10-0-248-62.ap-northeast-1.compute.internal:9103, which currently has 1 containers, <memory:1500, vCores:1> used and <memory:4132, vCores:3> available
2015-03-17 02:41:50,468 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode (ResourceManager Event Processor): Assigned container container_1426559783155_0001_01_000003 of capacity <memory:1500, vCores:1> on host ip-10-0-248-66.ap-northeast-1.compute.internal:9103, which currently has 1 containers, <memory:1500, vCores:1> used and <memory:4132, vCores:3> available
2015-03-17 02:41:50,625 INFO org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode (ResourceManager Event Processor): Assigned container container_1426559783155_0001_01_000004 of capacity <memory:1500, vCores:1> on host ip-10-0-248-65.ap-northeast-1.compute.internal:9103, which currently has 2 containers, <memory:4500, vCores:2> used and <memory:1132, vCores:2> available

```

### Disclaimer

このポストはわたし個人のメモであり、所属する組織を代表するものではありません。