发布时间:2026/8/22 1:54:53
Hadoop MapReduce 过程中 Key 和 Value 分别存储什么值 摘要本文以 WordCount 经典示例为基础详细解析 Hadoop MapReduce 过程中各个阶段 Key 和 Value 的具体含义与变化过程。通过图文结合的方式清晰展示从输入文件分割到最终输出结果的全流程数据流转。一、示例说明本文以 WordCount词频统计为例通过图解方式直观展示 MapReduce 各阶段 Key/Value 的变化过程。二、MapReduce 处理流程详解1. 输入分割阶段InputFormatInputFormat 将 HDFS 上要处理的文件逐行读入将文件拆分成 splits。由于测试文件较小每个文件为一个 split并将文件按行分割形成 key, value 对如图 4-1 所示。这一步由 MapReduce 框架自动完成其中偏移量即 key 值包括了回车所占的字符数Windows 和 Linux 环境会不同。Key/Value 含义Key行偏移量每行起始字符在文件中的位置Value该行的文本内容示例说明这里是把每个文件按行处理下图有两个文件每个文件有两行。每一行的开头字符所在位置的偏移量第一行的开头偏移量自然是 0hello world 共 10 个字符加上中间的空格 11 个字符回车再算一个第二行的开头偏移量是 12。图 4-1 分割过程2. Map 处理阶段将分割好的 key, value 对交给用户定义的 map 方法进行处理生成新的 key, value 对如图 4-2 所示。这里是用户自定义的 map 处理程序每一行的字符按空格分割分割的每一个元素都记为 1也就是 map 节点的所有 value 都是 1。Key/Value 含义Key单词分割后的每个元素Value计数 1每个单词出现一次记为 1图 4-2 执行 map 方法3. Map 端排序与 Combine 阶段得到 map 方法输出的 key, value 对后Mapper 会将它们按照 key 值进行排序并执行 Combine 过程将 key 相同的 value 值累加得到 Mapper 的最终输出结果如图 4-3 所示。Key/Value 含义Key单词保持不变Value局部累加后的词频计数图 4-3 Map 端排序及 Combine 过程4. Reduce 处理阶段Reducer 先对从 Mapper 接收的数据进行排序再交由用户自定义的 reduce 方法进行处理得到新的 key, value 对并作为 WordCount 的输出结果如图 4-4 所示。Key/Value 含义Key单词最终统计的单词Value全局累加后的最终词频图 4-4 Reduce 端排序及输出结果三、总结通过 WordCount 示例可以清晰地看到在 MapReduce 过程中输入阶段Key 为行偏移量Value 为行内容Map 阶段Key 转换为单词Value 固定为 1Combine 阶段Key 保持不变Value 进行局部累加Reduce 阶段Key 保持不变Value 进行全局累加得到最终结果这种 Key/Value 的设计模式是 MapReduce 编程模型的核心理解各阶段 Key/Value 的含义对于编写高效的 MapReduce 程序至关重要。五、实战代码示例下面是一个完整的 Hadoop MapReduce WordCount 程序Java 版本代码中包含了详细的注释明确指出每个阶段对应的代码位置并与文中图解的关键步骤相对应。import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /** WordCount 示例程序 对应文中图解的各阶段 Key/Value 变化过程 */ public class WordCount { /** Mapper 类 对应文中 2. Map 处理阶段 图解 */ public static class TokenizerMapper extends MapperLongWritable, Text, Text, IntWritable { private final static IntWritable one new IntWritable(1); private Text word new Text(); /** map 方法 - Map 阶段核心处理逻辑 param key: 行偏移量InputFormat 阶段生成的 key param value: 该行的文本内容InputFormat 阶段生成的 value param context: MapReduce 上下文 */ public void map(LongWritable key, Text value, Context context ) throws IOException, InterruptedException { // 1. InputFormat 阶段框架自动完成 // - key: 行偏移量如文中示例的 0, 12 等 // - value: 该行文本内容如 hello world // 对应文中图 4-1 的分割过程 // 2. Map 处理阶段用户自定义逻辑 // 将每行文本按空格分割成单词每个单词输出 单词, 1 StringTokenizer itr new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); // 输出 单词, 1对应文中图 4-2 的 Map 输出 // 此时 key 变为单词value 固定为 1 context.write(word, one); } } } /** Combiner 类可选优化 对应文中 3. Map 端排序与 Combine 阶段 图解 注意Combiner 本质是本地 Reducer在 Map 端执行局部聚合 */ public static class IntSumCombiner extends ReducerText, IntWritable, Text, IntWritable { private IntWritable result new IntWritable(); /** reduce 方法Combiner 使用 param key: 单词Map 输出的 key param values: 该单词对应的所有 1 的集合 param context: MapReduce 上下文 */ public void reduce(Text key, IterableIntWritable values, Context context ) throws IOException, InterruptedException { // 3. Combine 阶段Map 端局部聚合 // 将相同 key单词的 value1累加 // 对应文中图 4-3 的 Combine 过程 int sum 0; for (IntWritable val : values) { sum val.get(); } result.set(sum); // 输出 单词, 局部累加值 context.write(key, result); } } /** Reducer 类 对应文中 4. Reduce 处理阶段 图解 */ public static class IntSumReducer extends ReducerText, IntWritable, Text, IntWritable { private IntWritable result new IntWritable(); /** reduce 方法 - Reduce 阶段核心处理逻辑 param key: 单词经过 Shuffle 排序后的 key param values: 该单词对应的所有计数值可能来自多个 Mapper param context: MapReduce 上下文 */ public void reduce(Text key, IterableIntWritable values, Context context ) throws IOException, InterruptedException { // 4. Reduce 处理阶段 // a) Shuffle Sort框架自动对 Mapper 输出按键排序 // b) Reduce对相同 key 的所有 value 进行全局累加 // 对应文中图 4-4 的 Reduce 输出 int sum 0; for (IntWritable val : values) { sum val.get(); } result.set(sum); // 输出最终结果 单词, 总词频 context.write(key, result); } } /** 主函数 - 作业配置和提交 */ public static void main(String[] args) throws Exception { Configuration conf new Configuration(); Job job Job.getInstance(conf, word count); // 设置 Jar 包 job.setJarByClass(WordCount.class); // 设置 Mapper job.setMapperClass(TokenizerMapper.class); // 设置 Combiner可选但推荐使用以减少网络传输 job.setCombinerClass(IntSumCombiner.class); // 设置 Reducer job.setReducerClass(IntSumReducer.class); // 设置输出 key/value 类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // 设置输入输出路径 FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // 提交作业并等待完成 System.exit(job.waitForCompletion(true) ? 0 : 1); } }代码关键点说明处理阶段对应代码Key/Value 变化对应图解说明InputFormat 阶段框架自动完成FileInputFormat和Mapper.map()的输入参数KeyLongWritable类型表示行偏移量ValueText类型表示该行文本内容图 4-1框架自动将输入文件分割为 行偏移量, 行内容 对Map 处理阶段TokenizerMapper.map()方法Key从行偏移量变为单词Text类型Value从行内容变为固定值 1IntWritable类型图 4-2将每行文本按空格分割为每个单词输出 单词, 1Combine 阶段可选优化IntSumCombiner.reduce()方法Key单词保持不变Value从多个 1 累加为局部词频计数图 4-3在 Map 端对相同单词的计数进行局部累加减少网络传输Reduce 处理阶段IntSumReducer.reduce()方法Key单词保持不变Value从局部词频累加为全局最终词频图 4-4对来自所有 Mapper 的相同单词计数进行全局累加输出最终结果运行说明将代码保存为WordCount.java编译javac -cp $(hadoop classpath) WordCount.java打包jar -cvf wordcount.jar *.class运行hadoop jar wordcount.jar WordCount /input/path /output/path查看结果hdfs dfs -cat /output/path/part-r-00000通过这个完整的代码示例您可以更直观地理解文中图解的各阶段 Key/Value 变化并将理论知识与实际代码实现相结合。

相关新闻

2026/8/22 1:54:53

AI短剧自动化生成:基于Agent与SD2.5的工业化生产实践

大家好,我是专注于AI应用开发与实战分享的技术博主。最近在探索AI内容生成领域时,一个非常明显的趋势是:AI短剧的制作正从依赖单一提示词的“手工作坊”模式,快速迭代到由智能体(Agent)驱动的、具备稳定扩散…

2026/8/22 1:54:53

Hadoop MapReduce 中 Mapper 的 Key 与 Java Map 的 Key 的区别

Hadoop的Mapreduce中Mapper的key和Map的key的区别问题&#xff1a;我们知道Mapreduce 是以键值对的方式进行输入输出的&#xff0c;分为Mapper <k,v,k,v>和Reduce<k,v,k,v> &#xff0c;那么这里的<Key&#xff0c;Value>和JAVA的import java.util.HashMap的…

2026/8/22 1:49:53

Mol-Debate:多智能体辩论框架如何革新AI分子设计

1. 项目概述&#xff1a;当大模型学会“吵架”&#xff0c;分子设计会怎样&#xff1f;最近在AI for Science的圈子里&#xff0c;一个叫“Mol-Debate”的项目引起了我的注意。这名字起得挺有意思&#xff0c;直译过来就是“分子辩论”。它的核心思路非常直观&#xff1a;与其让…

2026/8/22 3:10:05

Agentic AI生产评估实战:失效模式、行为漂移与四层框架解析

1. 从“玩具”到“员工”&#xff1a;Agentic AI在生产环境中的真实挑战最近和几个负责AI产品落地的朋友聊天&#xff0c;大家不约而同地提到了同一个词&#xff1a;Agentic AI。这个词已经从一个酷炫的概念&#xff0c;变成了一个让人又爱又恨的“新员工”。爱的是&#xff0c…

2026/8/22 3:10:05

构建韧性AI智能体系统:从失效路径分析到残余风险量化

1. 项目概述&#xff1a;从失败路径到量化风险最近在搞AI智能体&#xff08;Agentic AI&#xff09;落地的朋友&#xff0c;估计都遇到过类似的头疼事&#xff1a;单个智能体跑得挺欢&#xff0c;一旦把它们组合起来去干点复杂的活儿&#xff0c;比如搞个自动化工作流或者做个决…

2026/8/22 3:10:05

USB枚举全解析:从即插即用到驱动加载的底层通信机制

当你将一个新的 USB 设备&#xff08;比如 U 盘、鼠标、键盘&#xff09;插入电脑的 USB 端口时&#xff0c;电脑屏幕右下角通常会弹出“正在安装设备驱动程序”的提示&#xff0c;几秒钟后&#xff0c;设备就能正常使用了。这个看似简单的“即插即用”过程背后&#xff0c;隐藏…

2026/8/22 3:10:05

贝叶斯一致智能体编排:应对不确定性,实现理性协同决策

1. 从“编排”到“决策”&#xff1a;为什么我们需要贝叶斯一致的智能体AI最近和几个做AI应用落地的朋友聊天&#xff0c;大家普遍有个感觉&#xff1a;现在的AI智能体&#xff08;Agentic AI&#xff09;越来越“能”了&#xff0c;能调用工具&#xff0c;能规划任务&#xff…

2026/8/22 3:05:05

Coze扣子零基础入门:从智能体到工作流,手把手构建企业级AI应用

最近在尝试将AI能力集成到业务中时&#xff0c;发现市面上的AI开发平台要么门槛太高&#xff0c;要么功能过于分散。直到深度体验了Coze扣子平台&#xff0c;才发现它真正做到了“零基础也能快速上手&#xff0c;高阶玩家也能深度定制”。本文将为你带来一份从零开始的Coze扣子…

2026/8/21 13:13:49

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 20:14:07

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/21 15:40:01

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/21 15:40:01

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/22 1:39:53

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…