据我了解,reduce任务有三个阶段。
随机播放,排序和实际减少调用。
所以通常在hadoop工作的输出中我们会看到类似的东西, 地图0%减少0% 地图20%减少0% 。 。 。 地图90%降低10% 。 。
因此我假设reduce任务在所有映射完成之前启动,并且此行为由慢启动配置控制。
现在我还不知道什么时候实际调用reducer的setup方法。
在我的用例中,我在setup方法中解析了一些文件。该文件大小约为60MB,并从分布式缓存中获取。在解析文件时,配置中还有另一组数据可以更新刚刚解析的记录。在解析和可能的更新之后,文件存储在HashMap中以便快速查找。所以我希望尽快调用这个方法,可能是当映射器仍在做它们的事情时。
有可能这样做吗?或者那已经发生了什么?
由于
答案 0 :(得分:1)
Setup
能够从流中读取第一个键/值对之前调用它。
在所有映射器运行并且给定的reducer分区的所有合并完成后,这是有效的。
答案 1 :(得分:0)
正如Hadoop docs中所述,setup()
方法在任务开始时被调用一次。它应该用于实例化资源/变量或读取可配置的参数,而这些参数又可以在reduce()
方法中使用。把它想象成一个构造函数。
以下是reducer的示例:
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);
}
}