Hadoop Reducer类的成员变量是否是线程安全的?

时间:2016-06-02 08:06:30

标签: hadoop mapreduce

我是 Hadoop生态系统的新手。

我想问的是:“Reducer类的成员变量是否是线程安全的?”

  1. Mapper使用唯一键将数据传递给Reducer。
  2. 有一个集合(ConcurrentLinkedQueue),它是Reducer类中的成员变量。
  3. 该集合在Reducer类的setup(Context)方法中初始化。
  4. 创建了一些Query个对象(jOOQ)并将其附加到Reducer类的reduce(...)方法中的集合中。
  5. jooq.batch(collection).execute()方法将在指定阈值(例如1000)内的reduce(...)方法的最后一行中调用。然后,clear()方法将清除该集合。
  6. 步骤4中的收集遗骸将与cleanup(Context)方法中的步骤5处理相同。
  7. 问题 :我需要synchronize第5步吗?

    public class SomeReducer extends TableReducer<Text, Text, ImmutableBytesWritable> {
        private Queue<Query> queries;
    
        @Override
        protected void setup(Context context) {
            ...
            queries = new ConcurrentLinkedQueue<>();
        }
    
        @Override
        protected void cleanup(Context context) {
            if (!queries.isEmpty()) db.batch(queries).execute();
            ...
        }
    
        @Override
        public void reduce(Text key, Iterable<Session> sessions, Context context) {
            for (...iteration...) { queries.add(...create Query object...); }
    
            // Is this code snippet below should be synchronized?
            if (queries.size() >= 1000) {
                db.batch(queries).execute();
                queries.clear();
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

Reducer是线程安全的。您很可能会有多个Reducers并行运行,但它们彼此完全隔离,只能看到自己的数据和实例变量。

因此,为了回答您的问题,您不需要同步代码甚至使用ConcurrentLinkedQueue,它可能只是一个普通的ArrayList。