クラスターで同じ問題が発生し、PC に戻って簡単な実験を行い、それを解明しようとしました。Hadoop を疑似分散モードで構成し、デフォルトの capacity-scheduler.xml を使用し、mapred-site.xml を次のように構成しました。以下:
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>io.sort.mb</name>
<value>5</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx10m</value>
</property>
<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.CapacityTaskScheduler</value>
</property>
<property>
<name>mapred.queue.names</name>
<value>default</value>
</property>
<property>
<name>mapred.cluster.map.memory.mb</name>
<value>100</value>
</property>
<property>
<name>mapred.cluster.max.map.memory.mb</name>
<value>200</value>
</property>
</configuration>
Web UI は次のようになります。
Queue Name default
Scheduling Information
Queue configurationfatal
Capacity Percentage: 100.0%
User Limit: 100%
Priority Supported: NO
-------------
Map tasks
Capacity: 2 slots
Used capacity: 2 (100.0% of Capacity)
Running tasks: 1
Active users:
User 'luo': 2 (100.0% of used capacity)
-------------
Reduce tasks
Capacity: 2 slots
Used capacity: 0 (0.0% of Capacity)
Running tasks: 0
-------------
Job info
Number of Waiting Jobs: 0
Number of users who have submitted jobs: 1
実際、2 つのスロットを占有し、reduce タスクを使用しない 1 つのマップ タスクを含むストリーミング ジョブを送信したところ、問題なく動作しました。ストリーミング スクリプトはかなり単純です。
~/hadoop/hadoop-0.20.2/bin/hadoop jar Streaming_blat.jar -D mapred.job.map.memory.mb=199 -D mapred.job.name='メモリ割り当て' -D mapred.map.tasks= 1 -入力ファイル:// pwd
/input/ -mapper ' /home/luo/hadoop/hadoop-0.20.2/bin/a.out' -出力ファイル:// pwd
/output/ -reducer NONE
a.out は、指定されたファイルに pid と ppid を出力するだけの C プログラムです。
mapred.map.tasks=3 を設定すると問題が発生しました。ウェブUIが表示されました
Map tasks
Capacity: 2 slots
Used capacity: 4 (200.0% of Capacity)
Running tasks: 2
Active users:
User 'luo': 4 (100.0% of used capacity)
これは、mapred-site.xml で設定したマップ スロットの制限を既に超えていることを意味します。その結果、このようなことを何度も促されました
Killing one of the least progress tasks - attempt_201210121915_0012_m_000000_0, as the cumulative memory usage of all the tasks on the TaskTracker exceeds virtual memory limit 207618048.
私がやりたいことは、容量を超えずに利用可能なスロットができるまでマップタスクを一時停止することです。誰かがいくつかの解決策を提供できますか? どうもありがとう。