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

Hadoop Reducer类的成员变量是线程安全的吗?,hadoop,mapreduce,Hadoop,Mapreduce,我是Hadoop生态系统的新手 我想问的是:“Reducer类的成员变量是线程安全的吗?” 映射器使用唯一键将数据传递给Reducer 有一个集合(ConcurrentLinkedQueue),它是Reducer类中的成员变量 集合在Reducer类的设置(上下文)方法中初始化 在Reducer类的reduce(…)方法中创建一些Query对象(jOOQ)并将其附加到集合中 jooq.batch(collection).execute()方法将在指定阈值(例如1000)内的reduce(…)方法

我是Hadoop生态系统的新手

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

  • 映射器使用唯一键将数据传递给Reducer
  • 有一个集合(
    ConcurrentLinkedQueue
    ),它是Reducer类中的成员变量
  • 集合在Reducer类的
    设置(上下文)
    方法中初始化
  • 在Reducer类的
    reduce(…)
    方法中创建一些
    Query
    对象(jOOQ)并将其附加到集合中
  • jooq.batch(collection).execute()
    方法将在指定阈值(例如1000)内的
    reduce(…)
    方法的最后一行调用。然后将通过
    clear()
    方法清除集合
  • 第4步收集的剩余部分将按照
    cleanup(Context)
    方法中的第5步处理
  • 问题:我需要同步第5步吗

    代码
    公共类SomeReducer扩展了TableReducer{
    专用队列查询;
    @凌驾
    受保护的无效设置(上下文){
    ...
    查询=新建ConcurrentLinkedQueue();
    }
    @凌驾
    受保护的空洞清理(上下文){
    if(!querys.isEmpty())db.batch(querys.execute();
    ...
    }
    @凌驾
    public void reduce(文本键、Iterable会话、上下文){
    对于(…迭代…{querys.add(…创建查询对象…);}
    //下面的代码段是否应该同步?
    if(querys.size()>=1000){
    db.batch(querys.execute();
    querys.clear();
    }
    }
    }
    
    异径管是螺纹安全的。您很可能有多个简化程序并行运行,但它们彼此完全隔离,只能看到它们自己的数据和实例变量


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

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

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

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