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 のメモリで十分です。コンテナにより多くのメモリを割り当てると、タスクがより多くのメモリを使用するのはなぜですか? 各タスクがより多くの分割を取得するためですか? コンテナのサイズを少し小さくして、より多くのコンテナを作成して、より多くのタスクを並行して実行する方が効率的だと思います。問題は、各コンテナが処理できる以上の分割が割り当てられないようにするにはどうすればよいですか?