public interface Reducer
Reducer 由JobConf.setReducerClass(Class)
进行指定.
Reducer 任务数由
JobConf.setNumReduceTasks(int)
进行指定,用户需要根据 Reducer 要处理的数据量(Mapper
的输出)进行调整,若没有指定 Reducer 任务数,默认设置为
Mapper
数的 1/4
与 Mapper
类似,Reducer 也包括三个方法:
setup(TaskContext)
在任务开始, reduce 方法之前调用,每个reduce调用且仅调用一次
cleanup(TaskContext)
在任务结束,reduce 方法之后调用,每个reduce调用且仅调用一次
reduce(Record, Iterator, TaskContext)
reduce 方法,每次调用传入一个 Key
和与之关联的一组 Value集合
Reducer.TaskContext
接口Record.toArray()
在Mapper
端,每个 mapper 生成中间结果(键值对)并通过Partitioner Columns 哈希分发给对应的
Reducer,Reducer 端,每个 Reducer 会读入所有 Mapper
输出给它的数据,这个过程分三步:
JobConf.setOutputKeySortColumns(String[])
进行指定,如果没有指定,使用 key中的所有列做排序。
JobConf.setOutputGroupingColumns(String[])
指定的分组列对排好序的 Key/Value 对进行分组,如果没有指定,则默认使用key中的所有列做分组。
计算结果可以通过下面的方法输出到结果表:
TaskContext.write(Record)
输出计算结果到默认输出表
TaskContext.write(Record, String)
输出计算结果到指定 label 的输出表
在客户端定义的作业配置(JobConf
)可以通过
JobContext.getJobConf()
方法取得。
代码示例,摘自 WordCount:
public static class SumReducer extends ReducerBase { private Record result; @Override public void setup(TaskContext context) throws IOException { result = context.createOutputRecord(); } @Override public void reduce(Record key, Iterator<Record> values, TaskContext context) throws IOException { long count = 0; while (values.hasNext()) { Record val = values.next(); count += (Long) val.get(0); } result.set(0, key.get(0)); result.set(1, count); context.write(result); } }
Reducer.TaskContext
,
Mapper
Modifier and Type | Interface and Description |
---|---|
static interface |
Reducer.TaskContext
传给
Reducer 的上下文对象. |
Modifier and Type | Method and Description |
---|---|
void |
cleanup(Reducer.TaskContext context)
在任务结束, reduce 方法之后调用,可以重载此方法.
|
void |
reduce(Record key,
Iterator<Record> values,
Reducer.TaskContext context)
对每个 Key 和与其关联的一组Value集合进行处理.
|
void |
setup(Reducer.TaskContext context)
在任务开始, reduce 方法之前调用.
|
void setup(Reducer.TaskContext context) throws IOException
context
- Reduce 上下文对象IOException
void reduce(Record key, Iterator<Record> values, Reducer.TaskContext context) throws IOException
注意:传给 reduce 方法的 Key key 和 Iterator
key
- 键values
- 与 key 关联的 value 迭代器context
- Reduce 上下文对象IOException
void cleanup(Reducer.TaskContext context) throws IOException
context
- Reduce 上下文对象IOException
Copyright © 2023 Alibaba Cloud Computing. All rights reserved.