据我了解,reduce任务有三个阶段。
随机播放、排序和实际减少调用。
所以通常在 hadoop job 的输出中,我们看到类似的东西,映射 0% 减少 0%地图 20% 减少 0%...地图 90% 减少 10%...
因此,我假设reduce任务在所有映射完成之前启动,并且此行为由慢启动配置控制。
现在我还不明白减速器的设置方法实际上是什么时候调用的。
在我的用例中,我有一些文件要在设置方法中解析。该文件的大小约为 60MB,是从分布式缓存中选取的。在分析文件时,配置中还有另一组数据可以更新刚刚解析的记录。 解析和可能的更新后,文件存储在HashMap中,以便快速查找。所以我希望尽快调用这种方法,可能是在映射器仍在做他们的事情的时候。
可以这样做吗?还是已经发生了?
谢谢
Setup
在能够从流中读取第一个键/值对之前被调用。
这实际上是在所有映射器运行并且给定化简器分区的所有合并完成后。
如Hadoop文档中所述,setup()
方法在任务开始时调用一次。它应该用于实例化资源/变量或读取可配置参数,这些参数又可以在reduce()
方法中使用。把它想象成一个构造函数。
下面是一个减速器示例:
class ExampleReducer extends TableReducer<ImmutableBytesWritable, ImmutableBytesWritable, ImmutableBytesWritable> {
private int runId;
private ObjectMapper objectMapper;
@Override
protected void setup(Context context) throws IOException {
Configuration conf = context.getConfiguration();
this.runId = Integer.valueOf(conf.get("stackoverflow_run_id"));
this.objectMapper = new ObjectMapper();
}
@Override
protected void reduce(ImmutableBytesWritable keyFromMap, Iterable<ImmutableBytesWritable> valuesFromMap, Context context) throws IOException, InterruptedException {
// your code
var = objectMapper.writeValueAsString();
// your code
context.write(new ImmutableBytesWritable(somekey.getBytes()), put);
}
}