YARN の動作のアーティファクトの 1 つが表示されているようです。JobTracker が効果的に Hadoop 2 の AppMaster と ResourceManager の役割を同時に果たしていた Hadoop 1 とは異なり、Hadoop 2 では ResourceManager (マスター ノードで実行されている) が実際に真新しい AppMaster をオンデマンドで YARN コンテナーにパックします。 MapReduce ジョブ。
また、少し変わったもう 1 つの概念は、「スロット」がまったくないということです。YARN コンテナーは、実際にはメモリと CPU の両方の次元でスケジュールを設定します。これは、YARN にパックされた 1 つのタスクが大量のメモリを要求するが 1 つの CPU しか要求しない場合、そうでなければ複数の map または reduce タスクをパックした可能性のあるリソース フットプリントを占有する可能性があることを意味します。
たとえば、n1-standard-2 ごとに 2 つのワーカーをデプロイしたと仮定するとhttp://<master-ip>:8088/cluster/nodes
、mapreduce を実行すると、ResourceManager ページの下に次のように表示される場合があります。
... Containers Mem Used Mem Avail VCores Used VCores Avail Version
... 1 5.50 GB 0 B 1 1 2.6.0
... 2 5 GB 512 MB 2 0 2.6.0
この場合、application_master
ResourceManager からのリンクにアクセスすると、ResourceManager が実際に報告された VM にパックされていることがわかりました5.5GB Mem Used, 0B Mem Avail, 1 VCores Used
。同様に、私のマップ タスクは、 を報告したワーカーでのみ実行されていることがわかりました2 VCores Used
。
一般に、これは、ワーカーの数を増やしたときに確実にスケーリングすることに主に関心がある場合は、特別なことをする必要がないことを意味します。NUM_WORKERS - 1
そのうちの 1 台がジョブの AppMaster を実行している間に、可能なマシンにパックされた map または reduce タスクが完成するだけです。
ただし、仕事によっては、これは無駄かもしれません。既定の設定は、多数の進行中のタスクを OOM で追跡しないようにするために非常に大きな AppMaster を使用することが理にかなっている、非常に大きなジョブに最適です。カスタムファイルでNODEMANAGER_MEMORY_FRACTION
、CORES_PER_MAP_TASK
、CORES_PER_REDUCE_TASK
、およびをオーバーライドすることで、きめの細かい設定を調整できます (または でインライン化しますが、これは、 のようなファイルを維持する場合と比較して、アップグレードのために追跡するのが難しくなります)。bdutil のコメントは、これらの設定を説明しています。CORES_PER_APP_MASTER
*_env.sh
hadoop2_env.sh
my_overrides_env.sh
hadoop2_env.sh
# Fraction of worker memory to be used for YARN containers
NODEMANAGER_MEMORY_FRACTION=0.8
# Decimal number controlling the size of map containers in memory and virtual
# cores. Since by default Hadoop only supports memory based container
# allocation, each map task will be given a container with roughly
# (CORES_PER_MAP_TASK / <total-cores-on-node>) share of the memory available to
# the NodeManager for containers. Thus an n1-standard-4 with CORES_PER_MAP_TASK
# set to 2 would be able to host 4 / 2 = 2 map containers (and no other
# containers). For more details see the script 'libexec/configure-mrv2-mem.py'.
CORES_PER_MAP_TASK=1.0
# Decimal number controlling the size of reduce containers in memory and virtual
# cores. See CORES_PER_MAP_TASK for more details.
CORES_PER_REDUCE_TASK=2.0
# Decimal number controlling the size of application master containers in memory
# and virtual cores. See CORES_PER_MAP_TASK for more details.
CORES_PER_APP_MASTER=2.0
特に、n1-standard-4 のような大規模なマシンに移行する場合は、単純NODEMANAGER_MEMORY_FRACTION
に小さい値に変更することを検討してください。