【问题标题】:Implementing custom MapReduce实现自定义 MapReduce
【发布时间】:2014-05-04 00:46:46
【问题描述】:

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

我正在考虑使用 ConcurrentHashMap,CHM_key == Map's_Key,并将其值包含在 Map's_Key 上关联的所有 Map's_values 的 Arraylist 中,因此 reduce 可以简单地聚合这些值。

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

我知道这个集合实现了一个 putifAbsent 和一个 replace 方法;实际上 putifAbsent 很有用,因为如果密钥不存在,我只需放置一个新的 ArrayList 并完成。

但是...替换 Arraylist 并不是那么简单,因为我必须获取它,添加新值并替换它,如果不锁定整个集合,这是无法原子完成的...

【问题讨论】:

    标签: java arraylist concurrency mapreduce


    【解决方案1】:

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

    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);
            }
    
        }
    }
    

    我对此进行了调试,似乎可以正常工作,但是如果您对如何失败有任何意见,请告诉我!

    【讨论】:

      猜你喜欢
      • 2014-02-01
      • 2014-10-14
      • 2011-06-04
      • 2010-10-29
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多