使用hadoop指定内存限制
我正在尝试在Hadoop集群上运行高内存作业(0.20.203)。 我修改了mapred-site.xml以强制执行一些内存限制。
mapred.cluster.max.map.memory.mb 4096 mapred.cluster.max.reduce.memory.mb 4096 mapred.cluster.map.memory.mb 2048 mapred.cluster.reduce.memory.mb 2048
在我的工作中,我正在指定我需要多少内存。 不幸的是,即使我使用-Xmx2g
运行我的进程(作为控制台应用程序,这个作用将运行得很好)我需要为我的mapper请求更多的内存(作为一个子问题,为什么会这样?)或者它被杀了。
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
作为映射器并使用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也可能“为时已晚”; 您可能想validation它是否真的生效,如果没有,请将其放在mapred-site.xml中。
- 如何在Hadoop中自定义Writable类?
- DataNode无法在Hadoop中启动
- ClassNotFoundException在修改后的SimpleShortestPathsVertex上运行GiraphRunner
- Map-Reduce中的二级排序
- java.lang.IllegalArgumentException:错误的FS:,期望:hdfs:// localhost:9000
- Hadoop Writable和java.io.serialization之间有什么联系和区别?
- 从单个Hive UDF创建多个列
- java.sql.SQLException:没有为jdbc找到合适的驱动程序:hive:// localhost:10000 / default
- Hadoop – 直接从Mapper写入HBase