1. ホーム
  2. hadoop

[解決済み] コンテナがメモリの制限を超えて動作している

2023-04-05 07:18:11

質問

Hadoop v1では、7つのマッパーとリデューサーのスロットにそれぞれ1GBのサイズを割り当てていますが、マッパーとリデューサーは正常に動作しています。私のマシンは8Gのメモリと8プロセッサを搭載しています。 YARNでは、同じマシンで同じアプリケーションを実行すると、コンテナエラーが発生します。 デフォルトでは、このような設定になっています。

  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>8192</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
  </property>

エラーになりました。

Container [pid=28920,containerID=container_1389136889967_0001_01_000121] is running beyond virtual memory limits. Current usage: 1.2 GB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.

次に、mapred-site.xmlにメモリ制限を設定してみました。

  <property>
    <name>mapreduce.map.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>4096</value>
  </property>

でもまだエラーが出ます。

Container [pid=26783,containerID=container_1389136889967_0009_01_000002] is running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 5.2 GB of 8.4 GB virtual memory used. Killing container.

なぜマップタスクがこれほど多くのメモリを必要とするのか、混乱しています。私の理解では、1GBのメモリは私のmap/reduceタスクに十分です。コンテナにより多くのメモリを割り当てると、タスクはより多く使用するのはなぜですか?各タスクがより多く分割されるからでしょうか?コンテナのサイズを少し小さくして、より多くのコンテナを作成し、より多くのタスクが並行して実行されるようにするのがより効率的だと思います。問題は、各コンテナが処理できる以上の分割を割り当てられないようにするにはどうすればよいかということです。

どのように解決するのですか?

また、MapReduceの最大メモリ割り当てを適切に設定する必要があります。から この HortonWorks のチュートリアル :

<ブロッククオート

[...]

我々のクラスタの各マシンは48GBのRAMを持っています。このRAMの一部は、オペレーティングシステム用に予約しておく必要があります。各ノードで、40GBのRAMをYARN用に割り当て、8GBをオペレーティングシステム用に確保することにします。

この例のクラスタでは、コンテナ用の最小限のRAMを用意しています。 (yarn.scheduler.minimum-allocation-mb) = 2 GBです。したがって、4GB をMapタスクコンテナに、8GBをReduceタスクコンテナに割り当てます。

mapred-site.xmlに。

mapreduce.map.memory.mb : 4096

mapreduce.reduce.memory.mb : 8192

各コンテナでは、MapタスクとReduceタスクのためのJVMが実行されます。JVM のヒープサイズは、上記のMapとReduceのメモリより小さく設定する必要があります。 JVMのヒープサイズは、YARNによって割り当てられたコンテナ・メモリの範囲内に収まるように、上記で定義されたMapおよびReduceメモリよりも小さく設定する必要があります。 の範囲内に収まるようにします。

mapred-site.xmlの中で。

mapreduce.map.java.opts : -Xmx3072m

mapreduce.reduce.java.opts : -Xmx6144m

上記の設定 が使用する物理RAMの上限を設定します。 MapとReduceタスクが使用する物理RAMの上限を設定します。 .

まとめると

  1. YARNでは mapreduce コンフィグではなく mapred のものではありません。 EDITです。 このコメントは、質問を編集されたので、もう適用できません。
  2. あなたが設定しているのは、実際に要求する量であり、割り当てる最大値ではありません。
  3. 最大限の制限を設定するには java.opts の設定で設定されます。

最後に、この他の SO質問 を参照してください。