for each document
for each word in the document
get the counter associated to the word for the document
increment that counter
end for
end for
MapReduce 的实现:
Map phase (input: document key, document)
for each word in the document
emit an event with the word as the key and the value "1"
end for
Reduce phase (input: key (a word), an iterator going through the emitted values)
for each value in the iterator
sum up the value in a counter
end for
map(String key, String value):
// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, “1”);
reduce(String key, Iterator values):
// key: a word
// values: a list of counts
int result = 0;
for each v in values:
result += ParseInt(v);
Emit(AsString(result));
• 地点:为了避免网络流量,该框架试图确保所有输入数据都可以在本地提供给将要对它们执行计算的机器。在原始描述中,它使用 Google File System (GFS) ,复制因子设置为3,块大小为64 MB。这意味着同一块64MB (在文件系统中组成一个文件)将在三台不同的机器上有相同的副本。主机知道块在哪里,并尝试在该机器中安排映射作业。如果失败,主机会尝试在任务输入数据的副本附近分配一台机器(例如,在数据机的同一机架上的一台工作机器)。
• 任务粒度:假设每个贴图阶段被划分为 M 个阶段,而每个 Reduce 阶段又被划分为 R 个阶段,理想的情况是 M 和 R 比工人机器的数量大得多。这是因为执行许多不同任务的工作人员改进了动态负载平衡。除此之外,它还提高了在工作失败的情况下的恢复速度(因为它完成的许多映射任务可以分散到所有其他计算机上)。