我正在尝试在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>
Run Code Online (Sandbox Code Playgroud)
在我的工作中,我正在指定我需要多少内存.不幸的是,即使我正在运行我的进程-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");
Run Code Online (Sandbox Code Playgroud)
由于我正在执行身份缩减器,因此减速器几乎不需要任何内存.
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,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.
Run Code Online (Sandbox Code Playgroud)
更新:即使我使用catmapper和uniqreducer 指定流式传输作业,-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.
Run Code Online (Sandbox Code Playgroud)
更新:用于更改内存使用配置格式的原始JIRA特别提到Java用户最感兴趣的是物理内存以防止颠簸.我认为这正是我想要的:如果物理内存不足,我不希望节点启动映射器.但是,这些选项似乎都是作为虚拟内存约束实现的,这些约束很难管理.
| 归档时间: |
|
| 查看次数: |
21943 次 |
| 最近记录: |