Hadoopクラスタ(0.20.203)で高メモリジョブを実行しようとしています。私はmapred-site.xmlをいくつかのメモリ制限を適用するように変更しました。hadoopでメモリ制限を指定
<property>
<name>mapred.cluster.max.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapred.cluster.max.reduce.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapred.cluster.map.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapred.cluster.reduce.memory.mb</name>
<value>2048</value>
</property>
私の仕事では、どれくらいのメモリが必要かを指定しています。残念ながら、-Xmx2g
でプロセスを実行していても(このジョブはコンソールアプリケーションとしてこの大量のメモリでうまく動作します)、私のマッパーのためにさらに多くのメモリを要求する必要があります(サブクエリとして、これはなぜですか?殺された
val conf = new Configuration()
conf.set("mapred.child.java.opts", "-Xms256m -Xmx2g -XX:+UseSerialGC");
conf.set("mapred.job.map.memory.mb", "4096");
conf.set("mapred.job.reduce.memory.mb", "1024");
IDレデューサーを実行しているので、レデューサーはほとんどメモリを必要としません。
class IdentityReducer[K, V] extends Reducer[K, V, K, V] {
override def reduce(key: K,
values: java.lang.Iterable[V],
context:Reducer[K,V,K,V]#Context) {
for (v <- values) {
context write (key, v)
}
}
}
しかし、レデューサーはまだ多くのメモリを使用しています。減速機にマッパーとは異なるJVM引数を与えることは可能ですか? Hadoopはレデューサーを殺し、3960 MBのメモリを使用していると主張しています!そして減速機は仕事に失敗する。これはどのように可能ですか?
TaskTree [pid=10282,tipID=attempt_201111041418_0005_r_000000_0] is running beyond memory-limits.
Current usage : 4152717312bytes.
Limit : 1073741824bytes.
Killing task.
UPDATE:私はマッパーとしてcat
と減速などuniq
と-Xms512M -Xmx1g -XX:+UseSerialGC
私のタスクは、仮想メモリの2グラムを引き継ぐとストリーミングジョブを指定しても!これは最大ヒープサイズの4倍で贅沢なようです。
TaskTree [pid=3101,tipID=attempt_201111041418_0112_m_000000_0] is running beyond memory-limits.
Current usage : 2186784768bytes.
Limit : 2147483648bytes.
Killing task.
更新:メモリ使用のためのコンフィギュレーション・フォーマットを変更するためoriginal JIRAは、具体的にはJavaのユーザがスラッシングを防止するために、物理メモリにほとんど興味を持っていることを言及しています。私はこれがまさに私が望んでいると思う:不適切な物理メモリが利用可能な場合、ノードがマッパーをスピンアップさせたくない。しかし、これらのオプションはすべて、管理が困難な仮想メモリの制約として実装されているようです。
mapred.child.java.opts/-Xmxとmapred.job.map.memory.mb/mapred.job.reduce.memory.mbを使用してmax memoryを設定することの違いは何ですか?私はSO(http://goo.gl/aIBLr)で質問を出しましたが、回答はありません。 –