2011-11-05 10 views
9

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のユーザがスラッシングを防止するために、物理メモリにほとんど興味を持っていることを言及しています。私はこれがまさに私が望んでいると思う:不適切な物理メモリが利用可能な場合、ノードがマッパーをスピンアップさせたくない。しかし、これらのオプションはすべて、管理が困難な仮想メモリの制約として実装されているようです。

+0

mapred.child.java.opts/-Xmxとmapred.job.map.memory.mb/mapred.job.reduce.memory.mbを使用してmax memoryを設定することの違いは何ですか?私はSO(http://goo.gl/aIBLr)で質問を出しましたが、回答はありません。 –

答えて

6

ulimitを確認してください。 Clouderaから、バージョン0.20.2のが、同様の問題は、おそらくそれ以降のバージョンに適用されます。

...あなたはmapred.child.ulimitを設定した場合、それは2倍のヒープより 以上でなければならないことが重要ですmapred.child.java.optsで設定されたサイズの値。 の場合、1Gヒープを設定する場合、mapred.child.ulimitを2.5GBに設定します。子の プロセスは少なくとも1回はフォークされることが保証され、フォーク は一時的に仮想メモリの2倍のオーバーヘッドを必要とします。

mapred.child.java.optsをプログラムで設定することが「遅すぎる」こともあります。実際にそれが有効になっていることを確認し、そうでない場合はmapred-site.xmlに入れることができます。

+1

'ulimit'は' mapred.job.reduce.memory.mb'より厳しい制約で、私のインストールでは設定されていないようです。しかし、どれだけのVMを許可するかは参考になります... – schmmd