gpt4 book ai didi

hadoop - 磁盘回退的MapDB内存中

转载 作者:行者123 更新时间:2023-12-02 21:14:29 25 4
gpt4 key购买 nike

我正在研究Hadoop项目。我的减少阶段非常昂贵的内存。我当前正在使用HashMap,但得到了Error: Java Heap space,因为在Reduce中,我构建了一个巨大的哈希图(数据集为32GB)。解决方案可以是具有磁盘回退功能的内存中Hashmap,而MapDB似乎符合我的需求。
但是我不确定用法。 diskMap对于每个Reduce任务都是唯一的,inMemory映射对于每个reduce'key'是唯一的。即使我设置expireMaxSize(3)进行测试,也不确定何时使用onDisk映射以及逻辑是否正确。再次,为了进行测试,我用20个假条目填充了哈希表。
基本上,为了避免堆溢出,我需要控制inMemory映射的增长。

public class TestReducer extends Reducer<LongWritable, BytesWritable, String, IntWritable> {

private int id;
DB dbDisk;
protected void setup(Context context) throws IOException, InterruptedException {
id = context.getTaskAttemptID().getTaskID().getId();
File diskmap = new File("tmp/diskmap"+id);
diskmap.delete();
dbDisk = DBMaker
.fileDB("tmp/diskmap"+id)
.make();
}

@Override
protected void reduce(LongWritable key, Iterable<BytesWritable> values, Context context)
throws IOException, InterruptedException {

DB dbMemory = DBMaker
.memoryDB()
.make();

HTreeMap<Long,Integer> onDisk = dbDisk
.hashMap("onDisk")
.keySerializer(Serializer.LONG)
.valueSerializer(Serializer.INTEGER)
.createOrOpen();
// fast in-memory collection with limited size
HTreeMap<Long,Integer> inMemory = dbMemory
.hashMap("inMemory")
.expireMaxSize(3)
.keySerializer(Serializer.LONG)
.valueSerializer(Serializer.INTEGER)
//this registers overflow to `onDisk`
.expireOverflow(onDisk)
.createOrOpen();

for(int k=0;k<20;k++){
inMemory.put((long)k,k*2);
}
Set set = inMemory.entrySet();
Iterator it = set.iterator();
while(it.hasNext()) {
Map.Entry<Long,Integer> entry = (Map.Entry<Long,Integer>)it.next();
System.out.print("Key is: "+entry.getKey() + " & ");
System.out.println("Value is: "+entry.getValue());
}

}
protected void cleanup(Context context) throws IOException,InterruptedException {
dbDisk.close();
}

}

最佳答案

MapDB可以在直接内存中或在应用程序堆中分配内存。

为了使用直接内存,您需要更换

DB dbMemory = DBMaker
.memoryDB()
.make();


DB dbMemory = DBMaker
.memoryDirectDB()
.make();

有一个java属性
XX:MaxDirectMemorySize

您可以设置它将使用的最大内存。

您仍然需要管理分配,以便有足够的内存来存储数据,但是应用程序的堆不会随此数据增长,并且应用程序本身不会抛出内存不足异常或达到最大堆限制(除非应用是邪恶的)。

关于hadoop - 磁盘回退的MapDB内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com