我是 Hadoop生态系统的新手。
我想问的是:“Reducer类的成员变量是否是线程安全的?”
ConcurrentLinkedQueue
),它是Reducer类中的成员变量。setup(Context)
方法中初始化。Query
个对象(jOOQ)并将其附加到Reducer类的reduce(...)
方法中的集合中。jooq.batch(collection).execute()
方法将在指定阈值(例如1000)内的reduce(...)
方法的最后一行中调用。然后,clear()
方法将清除该集合。cleanup(Context)
方法中的步骤5处理相同。 问题 :我需要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();
}
}
}
答案 0 :(得分:0)
Reducer是线程安全的。您很可能会有多个Reducers并行运行,但它们彼此完全隔离,只能看到自己的数据和实例变量。
因此,为了回答您的问题,您不需要同步代码甚至使用ConcurrentLinkedQueue,它可能只是一个普通的ArrayList。