跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
MapReduce实例讲解
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= MapReduce实例讲解 = MapReduce是一种用于处理大规模数据集的编程模型,由Google提出并由Hadoop实现。它通过将计算任务分解为两个主要阶段——'''Map'''(映射)和'''Reduce'''(归约)——来实现分布式计算。本章节将通过实例详细讲解MapReduce的工作原理及其实际应用。 == 基本概念 == MapReduce模型的核心思想是将大规模数据集的处理任务分解为多个小的子任务,这些子任务可以并行执行。以下是两个主要阶段的功能: * '''Map阶段''':输入数据被分割成多个小块,每个小块由一个Map任务处理。Map函数将输入数据转换为键值对(key-value pairs)。 * '''Reduce阶段''':Map阶段的输出被分组并传递给Reduce任务。Reduce函数对相同键的值进行聚合或计算,生成最终结果。 == 示例1:单词计数 == 单词计数(Word Count)是MapReduce的经典示例,用于统计文本中每个单词的出现次数。 === 输入数据 === 假设输入文件包含以下内容: <pre> Hello World Hello Hadoop MapReduce Example </pre> === Map阶段 === Map函数将每行文本拆分为单词,并为每个单词生成键值对 `<word, 1>`。 <syntaxhighlight lang="java"> public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] words = line.split(" "); for (String word : words) { context.write(new Text(word), new IntWritable(1)); } } </syntaxhighlight> Map阶段的输出: <pre> Hello 1 World 1 Hello 1 Hadoop 1 MapReduce 1 Example 1 </pre> === Reduce阶段 === Reduce函数对相同键的值进行求和,得到每个单词的总出现次数。 <syntaxhighlight lang="java"> public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } </syntaxhighlight> Reduce阶段的输出: <pre> Hello 2 World 1 Hadoop 1 MapReduce 1 Example 1 </pre> === 流程图 === <mermaid> graph TD A[输入文件] --> B[Map任务] B --> C[中间键值对] C --> D[Shuffle和排序] D --> E[Reduce任务] E --> F[最终输出] </mermaid> == 示例2:温度数据分析 == 假设我们有一个包含城市每日温度记录的数据集,目标是计算每个城市的平均温度。 === 输入数据 === <pre> NewYork 20 London 15 NewYork 25 London 10 Tokyo 30 </pre> === Map阶段 === Map函数提取城市名称和温度,生成键值对 `<city, temperature>`。 <syntaxhighlight lang="java"> public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] parts = value.toString().split(" "); String city = parts[0]; int temp = Integer.parseInt(parts[1]); context.write(new Text(city), new IntWritable(temp)); } </syntaxhighlight> Map阶段的输出: <pre> NewYork 20 London 15 NewYork 25 London 10 Tokyo 30 </pre> === Reduce阶段 === Reduce函数计算每个城市的温度总和和记录数,然后计算平均温度。 <syntaxhighlight lang="java"> public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; int count = 0; for (IntWritable val : values) { sum += val.get(); count++; } double avg = (double) sum / count; context.write(key, new DoubleWritable(avg)); } </syntaxhighlight> Reduce阶段的输出: <pre> NewYork 22.5 London 12.5 Tokyo 30.0 </pre> == 实际应用场景 == MapReduce广泛应用于以下场景: * '''日志分析''':统计网站访问量、用户行为分析。 * '''搜索引擎''':构建倒排索引。 * '''数据挖掘''':聚类、分类等算法的大规模实现。 * '''推荐系统''':用户偏好分析。 == 总结 == MapReduce通过将任务分解为Map和Reduce阶段,实现了大规模数据的高效处理。本章通过单词计数和温度数据分析两个实例,展示了MapReduce的基本原理和实际应用。初学者可以通过这些示例理解MapReduce的工作流程,而高级用户可以根据需求扩展更复杂的逻辑。 {{Stub}} [[Category:大数据框架]] [[Category:Apache Hadoop]] [[Category:MapReduce 编程模型]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Stub
(
编辑
)