【问题标题】:Hadoop memory usage: reduce container is running beyond physical memory limitsHadoop内存使用:减少容器运行超出物理内存限制
【发布时间】:2014-09-25 14:55:14
【问题描述】:

我有简单的映射器和以下简单的reducer(它是通过一个字段连接两个大表):

protected void reduce(StringLongCompositeKey key, Iterable<Text> values, Context context) 
            throws IOException, InterruptedException {}
    foreach(Text text : values) {
        // do some operations with one record and then emit it using context.write
        // so nothing is storing in memory, one text record is small (mo more then 1000 chars)
    }
}

但我收到以下错误

14/09/25 17:54:59 INFO mapreduce.Job: map 100% reduce 28%

25 年 14 月 9 日 17:57:14 信息 mapreduce.Job:任务 ID:尝试_1410255753549_9772_r_000020_0,状态:失败

容器 [pid=24481,containerID=container_1410255753549_9772_01_001594] 运行超出物理内存限制。当前使用情况:使用了 4.1 GB 的 4 GB 物理内存;使用了 4.8 GB 的 8.4 GB 虚拟内存。杀死容器。

有一个细微差别-)

Iterable<Text> values

很长!正如我之前考虑的那样,并且仍然相信 Iterable 按需加载下一条记录是正确的,hadoop 处理它应该没有问题,而不会消耗大量 RAM。

在改组或排序时会出现此错误吗?有没有关于处理长序列的特殊信息?

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    在改组或排序时会出现此错误吗?

    确实如此。这似乎发生在 shuffle 阶段,当数据被移动到 reducer 时,在您的代码实际运行之前。

    reduce 百分比的工作方式是 0-33% 是 shuffle 阶段,数据被发送到 reducer,33-66% 是 sort 阶段,最后 33% 代表正在运行的容器。

    【讨论】:

      【解决方案2】:

      随机排序似乎内存不足。您可以检查您的配置以查看您是如何分配内存的。通过使用 java.opts,您可以确保 reducer 的 java 堆不会占用所有内存,因为它还需要用于 OS 和核心进程的内存。根据经验,我为这些留出了 512MB。随机排序的内存不足可能与随机排序竞争内存有关。降低您允许洗牌使用的百分比通常可以解决问题。 Ofc,最佳设置取决于您的设置。

      mapreduce.reduce.memory.mb=4096 
      mapreduce.reduce.java.opts="-server
      -Xmx3584m -XX:NewRatio=8 -Djava.net.preferIPv4Stack=true"
      mapreduce.reduce.shuffle.input.buffer.percent=0.2
      

      【讨论】:

        猜你喜欢
        • 2018-11-01
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        相关资源
        最近更新 更多