88

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.

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

4

9 に答える 9

104

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

[...]

クラスター内の各マシンには 48 GB の RAM があります。この RAM の一部は、オペレーティング システムの使用のために予約する必要があります。各ノードで、>YARN が使用するために 40 GB の RAM を割り当て、オペレーティング システム用に 8 GB を保持します。

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

mapred-site.xml で:

mapreduce.map.memory.mb: 4096

mapreduce.reduce.memory.mb: 8192

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

mapred-site.xml で:

mapreduce.map.java.opts:-Xmx3072m

mapreduce.reduce.java.opts:-Xmx6144m

上記の設定は、Map および Reduce タスクが使用する物理 RAM の上限を構成します

要約すると:

  1. YARN では、mapreduce構成ではなく構成を使用する必要がありmapredます。編集:質問を編集したため、このコメントは適用されなくなりました。
  2. 構成しているのは、実際に要求する量であり、割り当てる最大値ではありません。
  3. 上限は、java.opts上記の設定で構成されます。

最後に、同様の問題 (および解決策) を説明するこの他のSO の質問を確認することをお勧めします。

于 2014-01-08T22:51:32.837 に答える
49

仮想メモリと物理メモリの使用率の Yarn レベルに配置されたチェックがあります。問題は、VM に十分な物理メモリがないことだけではありません。ただし、仮想メモリの使用量が、特定の物理メモリに対して予想を超えているためです。

: これは、仮想メモリの積極的な割り当てが原因で、Centos/RHEL 6 で発生しています。

次のいずれかで解決できます。

  1. yarn.nodemanager.vmem-check-enabledfalseに設定して、仮想メモリ使用量チェックを無効 にします。

  2. yarn.nodemanager.vmem-pmem-ratioをより高い値に設定して、VM:PM の比率を増やします。

参考文献

https://issues.apache.org/jira/browse/HADOOP-11364

http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-using-gotchas/

次のプロパティを yarn-site.xml に追加します

 <property>
   <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    <description>Whether virtual memory limits will be enforced for containers</description>
  </property>
 <property>
   <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4</value>
    <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
  </property>
于 2015-07-16T09:23:44.797 に答える
15

EMR で HIVE を使用すると、非常によく似た問題が発生しました。現存する解決策はどれもうまくいきませんでした。つまり、mapreduce の設定はどれもうまくいきませんでした。yarn.nodemanager.vmem-check-enabledどちらもfalseに設定しませんでした。

ただし、最終的に機能したのは設定tez.am.resource.memory.mbでした。たとえば、次のようになります。

hive -hiveconf tez.am.resource.memory.mb=4096

微調整を検討する別の設定はyarn.app.mapreduce.am.resource.mb

于 2016-11-09T23:41:13.773 に答える