1、Map-Reduce 的逻辑过程 假设我们需要处理一批有关天气的数据,其格式如下: •按 照 ASCII 码 存 储 ,每 行 一条 记 录 •每 一行 字 符 从 0 开 始 计 数,第 15 个 到 第 18 个 字 符 为 年 •第 25 个 到 第 29 个 字 符 为 温 度 ,其中 第 25 位 是 符 号 +/- 我们现 在 需要统 计 出 每 年 的最 高 温 度 。 Map-Reduce 主 要包 括 两 个 步 骤 :Map 和 Reduce 每 一步 都 有key-value 对 作 为 输 入 和 输 出 : •map 阶 段 的key-value 对 的格式是 由 输 入 的格式所 决 定 的,如果 是默 认 的TextInputFormat,则 每 行 作 为 一个 记 录 进 程处理,其中key为 此 行 的开 头 相 对 于 文 件 的起 始 位 置 ,value 就 是 此 行 的字 符 文 本 •map 阶 段 的输 出 的key-value 对 的格式必 须 同reduce 阶 段 的输 入key-value 对 的格式相 对 应 对 于 上 面 的例 子 ,在 map 过程,输 入 的key-value 对 如下: 在map 过程中,通过对每一行字符串的解析,得到年-温度的key-value 对作为输出: 在reduce 过程,将 map 过程中的输出,按照相同的 key 将 value 放到同一个列表中作为 reduce 的输入 在reduce 过程中,在列表中选择出最大的温度,将年-最大温度的key-value 作为输出: 其逻辑过程可用如下图表示: 2、编写 Map-Reduce 程序 编写 Map-Reduce 程序,一般需要实现两个函数:mapper 中的 map 函数和 reducer 中的 reduce 函数。 一般遵循以下格式: 注:Reporter: Reporter 是用于 Map/Reduce 应用程序报告进度(心跳),设定应用级别的状态消息, 更新 Counters(计数器)的机制。 OutputCollector: OutputCollector 是一个Map/Reduce 框架提供的用于收集 Mapper或Reducer 输出数据的通用机制 (包括中间输出结果和作业的输出结果)。 对于上面的例子,则实现的mapper 如下: 实现的reducer 如下: 注:代码中 LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为 long, int, String 的替代品 欲运行上面实现的Mapper 和Reduce,则需要生成一个Map-Re...