gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:03:47 26 4
gpt4 key购买 nike

我是 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 步一样处理。

问题:我需要同步第 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();
}
}
}

最佳答案

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

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

关于hadoop - Hadoop Reducer类的成员变量是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37586076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com