Hadoop Reducer类的成员变量是线程安全的吗?
我是Hadoop生态系统的新手 我想问的是:“Reducer类的成员变量是线程安全的吗?”Hadoop Reducer类的成员变量是线程安全的吗?,hadoop,mapreduce,Hadoop,Mapreduce,我是Hadoop生态系统的新手 我想问的是:“Reducer类的成员变量是线程安全的吗?” 映射器使用唯一键将数据传递给Reducer 有一个集合(ConcurrentLinkedQueue),它是Reducer类中的成员变量 集合在Reducer类的设置(上下文)方法中初始化 在Reducer类的reduce(…)方法中创建一些Query对象(jOOQ)并将其附加到集合中 jooq.batch(collection).execute()方法将在指定阈值(例如1000)内的reduce(…)方法
ConcurrentLinkedQueue
),它是Reducer类中的成员变量设置(上下文)
方法中初始化reduce(…)
方法中创建一些Query
对象(jOOQ)并将其附加到集合中jooq.batch(collection).execute()
方法将在指定阈值(例如1000)内的reduce(…)
方法的最后一行调用。然后将通过clear()
方法清除集合cleanup(Context)
方法中的第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();
}
}
}