サマリ
**「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だと256MBの倍数という話。
こっちはディストリビューションはわからない(ポストにCDH4ってタグがついているので、たぶんCDH?)けど128MBの倍数という話。
ヒント
@oza_x86さんのこのスライドが大きなヒントになった。このスライドをもとにいろんな人と話していたら「yarn.scheduler.minimum-allocation-mbの値の倍数がメモリアロケーションの単位だよ」と教えてくれた!
試してみた
たとえば下記のような感じで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]
コマンド全体はこちら。
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の倍数で実際にコンテナにメモリが割り当てられた!
$ tail -f /media/ephemeral0/var/log/hadoop/yarn-hadoop-resourcemanager-ip-10-0-136-43.ap-northeast-1.compute.internal.log | grep Assigned
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
このポストはわたし個人のメモであり、所属する組織を代表するものではありません。