实现自定义MapReduce



我正在实现一个自定义MapReduce(对于学校,所以请不要建议使用Hadoop或现有的解决方案),我遇到的问题是"存储"Map和Reduce阶段之间的中间数据。

我正在考虑使用ConcurrentHashMap, CHM_key == Map's_Key,并作为它的值一个数组列表,包含所有Map's_value与Map's_Key相关联,所以减少可以简单地聚合这些值。

但是,我想不出一种方法可以在不锁定整个集合的情况下自动改变CHM的Arraylist实例。

我理解这个集合实现了一个putifAbsent和一个replace方法;实际上putifAbsent是有用的,因为如果键不存在,我只是放一个新的数组列表,然后完成。

然而

…替换数组列表并不是那么简单,因为我必须获取它,添加新值,然后替换它,如果不锁定整个集合,这是无法自动完成的…

如果有人感兴趣我找到了解决方案,实际上是非常简单的在这种情况下;你只需要锁定这个值!

public class MapReduceDictionary extends ConcurrentHashMap<String, ArrayList<Integer>>{
    private static final long serialVersionUID = 1L;
    public void addValue(String key, int value) throws InterruptedException {
        ArrayList<Integer> absentArr = new ArrayList<Integer>();
        absentArr.add(value);
        if (putIfAbsent(key, absentArr) == null) return;
        synchronized (get(key)) {
            get(key).add(value);
        }
    }
}

我调试了这个,似乎工作,但如果你有任何评论,这可能会失败,请告诉我!

相关内容

  • 没有找到相关文章

最新更新