環境
製品 | バージョン |
PHD | 2.x〜3.x |
OS | RHEL 6.x |
概要
本記事では、YARN フレームワーク上で実行される MapReduce ジョブへのメモリ割り当て管理に使用される複雑な Hadoop パラメータに関する情報を提供する。
コンテナとは?
コンテナは YARNのJVMプロセスである。Mapreduceにおいて、application master serviceとmapper、reducerタスクは全てYARNフレーム中で実行されるコンテナである。Resource ManagerのWebインターフェース(http://<resource_manager_host>:8088/cluster/scheduler)からコンテナの稼働状況を確認できる。
基礎項目
YARN Resouce Manager(以下、RM)は、ロジカルキューを通してアプリケーションにリソースを振り当てる。そのロジカルキューはメモリ、CPU、ディスクといったリソースを含む。デフォルトで、RMはApplication Master(以下、AM)コンテナのリソース要求に対して、8192MB("yarn.scheduler.maximum-allocation-mb"にて設定)まで割り当てる。デフォルトの最小メモリ割り当て単位は1024である("yarn.scheduler.minimum-allocation-mb"にて設定)。AMはRMから、"yarn.scheduler.minimum-allocation-mb"に設定したサイズ単位でのみリソース要求を行うことができて、"yarn.scheduler.maximum-allocation-mb"に設定したサイズを超えてリソース要求は行わない。AM は、"mapreduce.map.memory.mb"と"mapreduce.reduce.memory.mb"の値を、"yarn.scheduler.minimum-allocation-mb"に設定した値で割り切れるよう丸める役割がある。以下の例では、RM は 8192MB を超えたり、1024MB で割り切れない値のリソース要求は拒否する。
パラメータ
- YARN
- yarn.scheduler.minimum-allocation-mb
- yarn.scheduler.maximum-allocation-mb
- yarn.nodemanager.vmem-pmem-ratio
- yarn.nodemanager.resource.memory.mb
- Mapreuce
- Map用のメモリ
- mapreduce.map.java.opts
- mapreduce.map.memory.mb
- Reduce用のメモリ
- mapreduce.reduce.java.opts
- mapreduce.reduce.memory.mb
- Map用のメモリ
上記の構成図では、1つのmap、reduce、AMコンテナ(AM JVM)の例を示している。"JVM”と記載された長方形はサーバプロセスを表す。"Max heap"あるいは"Max virtual" と記載された長方形はNodemanager(以下、NM)により実行されたJVMプロセス用の最大論理メモリ制限値を表す。
この例ではmapコンテナへのメモリ割り当て("mapreduce.map.memory.mb")は、1536MBに設定されている 。AMはRMに対して、mapコンテナ用に2048MBのメモリを要求することになる。それは最小メモリ割り当て単位("yarn.scheduler.minimum-allocation-mb") が1024と設定されているからだ 。この割り当ては、プロセスのメモリ使用率を監視するためにNMによる論理割り当てである。もしmapタスクのヒープ使用量が2048MBを超えた場合、NMは当該タスクをkillする。JVMのヒープサイズは論理割り当ての2048MBに収まるように1024と設定する("mapreduce.map.java.opts=-Xmx1024m") 。Reduceコンテナにも同様の方針で設定する。ここでは、"mapreduce.reduce.memory.mb”に対して、3072と設定する。
1つのmapreduceジョブが終わったとき、ジョブの最後にいくつかの計数が表示される。以下の三つの計数は仮想メモリに対し物理メモリがどのくらいわりあてられたかを表示している。
Physical memory (bytes) snapshot=21850116096
Virtual memory (bytes) snapshot=40047247360
Total committed heap usage (bytes)=22630105088
仮想メモリ
デフォルトでは、"yarn.nodemanager.vmem-pmem-ratio"には2.1と設定されている。これは、NMがコンテナをkillするまでに、1つのmapもしくはreduceコンテナに対し、“mapreduce.reduce.memory.mb" もしくは "mapreduce.map.memory.mb"に設定した仮想メモリ値の2.1倍まで割り当て可能であることを意味する。もし、"mapreduce.map.memory.mb"が1536に設定されているならば、割り当て可能な仮想メモリ合計は 3225.6MB(=2.1 * 1536)となる。
メモリオーバーサブスクリプションのためNMがあるコンテナをkillした際のログメッセージは以下の様である。
Current usage: 2.1gb of 2.0gb physical memory used; 1.6gb of 3.15gb virtual memory used. Killing container.
コメント