[英]Specifying memory limits with hadoop
我正在嘗試在Hadoop集群上運行高內存作業(0.20.203)。 我修改了mapred-site.xml以強制執行一些內存限制。
<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");
由於我正在執行身份縮減器,因此減速器幾乎不需要任何內存。
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)
}
}
}
但是,reducer仍然使用大量內存。 是否有可能為reducer提供與mapper不同的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.
更新:即使我指定一個使用cat
作為mapper和uniq
作為reducer的流式作業和-Xms512M -Xmx1g -XX:+UseSerialGC
我的任務需要超過2g的虛擬內存! 這似乎是最大堆大小的4倍。
TaskTree [pid=3101,tipID=attempt_201111041418_0112_m_000000_0] is running beyond memory-limits.
Current usage : 2186784768bytes.
Limit : 2147483648bytes.
Killing task.
更新:用於更改內存使用配置格式的原始JIRA特別提到Java用戶最感興趣的是物理內存以防止顛簸。 我認為這正是我想要的:如果物理內存不足,我不希望節點啟動映射器。 但是,這些選項似乎都是作為虛擬內存約束實現的,這些約束很難管理。
檢查你的ulimit。 來自Cloudera ,版本0.20.2,但類似的問題可能適用於更高版本:
...如果設置了mapred.child.ulimit,重要的是它必須是mapred.child.java.opts中設置的堆大小值的兩倍以上。 例如,如果設置1G堆,請將mapred.child.ulimit設置為2.5GB。 子進程現在保證至少分叉一次,而fork暫時需要兩倍的虛擬內存開銷。
以編程方式設置mapred.child.java.opts也可能“為時已晚”; 您可能想驗證它是否真的生效,如果沒有,請將它放在mapred-site.xml中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.