内存中的Hadoop还原值?

内存中的Hadoop还原值?,hadoop,mapreduce,Hadoop,Mapreduce,我正在编写一个MapReduce作业,它可能会在reducer中包含大量值。我担心所有这些值都会同时加载到内存中 Iterable值的底层实现是否根据需要将值加载到内存中?Hadoop:权威指南似乎暗示了这一点,但没有给出“权威”的答案 reducer的输出将比输入的值大得多,但我相信输出是根据需要写入磁盘的。您正确地阅读了这本书。减速机不会将所有值存储在内存中。相反,在Iterable值列表中循环时,每个对象实例都会被重用,因此在给定的时间内只保留一个实例 例如,在下面的代码中,objs Ar

我正在编写一个MapReduce作业,它可能会在reducer中包含大量值。我担心所有这些值都会同时加载到内存中

Iterable值的底层实现是否根据需要将值加载到内存中?Hadoop:权威指南似乎暗示了这一点,但没有给出“权威”的答案


reducer的输出将比输入的值大得多,但我相信输出是根据需要写入磁盘的。

您正确地阅读了这本书。减速机不会将所有值存储在内存中。相反,在Iterable值列表中循环时,每个对象实例都会被重用,因此在给定的时间内只保留一个实例

例如,在下面的代码中,objs ArrayList在循环后将具有预期的大小,但每个元素都是相同的b/c。每次迭代都会重复使用Text val实例

public static class ReducerExample extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) {
    ArrayList<Text> objs = new ArrayList<Text>();
            for (Text val : values){
                    objs.add(val);
            }
    }
}

它不完全在内存中,有些来自磁盘,查看代码似乎框架将Iterable分解为段,并将它们从磁盘逐个加载到内存中

org.apache.hadoop.mapreduce.task.ReduceContextImpl
org.apache.hadoop.mapred.BackupStore

正如其他用户所引用的,整个数据没有加载到内存中。查看文档链接中的一些mapred-site.xml参数

mapreduce.reduce.merge.inmem.threshold
默认值:1000。它是一个阈值,以内存合并进程的文件数表示

mapreduce.reduce.shuffle.merge.percent
默认值为0.66。启动内存内合并的使用阈值,表示为分配给存储内存内映射输出的总内存的百分比,如
mapreduce.reduce.shuffle.input.buffer.percent
所定义

mapreduce.reduce.shuffle.input.buffer.percent
默认值为0.70。洗牌期间从最大堆大小分配到存储映射输出的内存百分比

mapreduce.reduce.input.buffer.percent
默认值为0。在reduce期间保留映射输出的内存百分比(相对于最大堆大小)。当洗牌结束时,内存中的任何剩余映射输出必须消耗小于此阈值的数据,然后才能开始reduce

mapreduce.reduce.shuffle.memory.limit.percent

默认值为:0.25。单个洗牌可以消耗的最大内存限制百分比

我被你的答案弄糊涂了。首先,您会说,“reducer不会将所有值存储在内存中”,这意味着Iterable会根据需要加载值。稍后,您会说,“即使是值列表的单个实例也可能比内存大”,这意味着值列表首先加载到内存中。你能澄清一下吗?编辑以澄清。我的意思是,即使是单个值也可能很大。这不太可能。“reducer不会将所有值存储在内存中”是一个true语句。这有意义吗?是的。谢谢你的澄清。你有这方面的参考资料吗?非常感谢。谢谢。你能解释一下它将如何解决这个问题吗?
mapreduce.reduce.shuffle.memory.limit.percent