内存中的Hadoop Reducer值



我正在编写一个MapReduce作业,最终可能会在化简器中产生大量值。我担心所有这些值会立即加载到内存中。

Iterable<VALUEIN> values的基础实现是否在需要时将值加载到内存中?Hadoop:权威指南似乎表明情况确实如此,但没有给出"明确"的答案。

化简器输出将比值输入大得多,但我相信输出会根据需要写入磁盘。

你没看错这本书。化简器不会将所有值存储在内存中。相反,当循环遍历可迭代值列表时,每个 Object 实例都会被重用,因此它只在给定时间保留一个实例。

例如,在下面的代码中,objs ArrayList 在循环后将具有预期的大小,但每个元素都将与每次迭代重用的文本 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);
            }
    }
}

(如果出于某种原因,您确实想对每个 val 采取进一步操作,您应该制作一个深层副本,然后存储它。

当然,即使是单个值也可能大于内存。在这种情况下,建议开发人员采取措施在前面的映射器中减少数据,以便值不会太大。

更新:参见Hadoop The Definitive Guide 2nd Edition的第199-200页。

This code snippet makes it clear that the same key and value objects are used on each 
invocation of the map() method -- only their contents are changed (by the reader's 
next() method). This can be a surprise to users, who might expect keys and vales to be 
immutable. This causes prolems when a reference to a key or value object is retained 
outside the map() method, as its value can change without warning. If you need to do 
this, make a copy of the object you want to hold on to. For example, for a Text object, 
you can use its copy constructor: new Text(value).
The situation is similar with reducers. In this case, the value object in the reducer's 
iterator are reused, so you need to copy any that you need to retain between calls to 
the iterator.

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

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

正如其他用户所引用的,整个数据没有加载到内存中。看看Apache文档链接中的一些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。在缩减期间保留映射输出的内存百分比(相对于最大堆大小)。随机播放结束后,内存中任何剩余的映射输出消耗的量必须小于此阈值,然后才能开始缩减。

mapreduce.reduce.shuffle.memory.limit.percent

默认值为 : 0.25。单个随机播放可以消耗的内存中限制的最大百分比

相关内容

  • 没有找到相关文章

最新更新