MapReduce是 一种 用于数据处理的 编程模型。该模型 非常简单。
同一个程序Hadoop 可以 运行 用各种语言 编写的MapRedue 程序。 在本章中,我们将看到 用 Java , Ruby , Python 和 C++ 这些不同语言 编写的 不同版本。
最重要的是, MapReduce 程序 本质上 是并行的, 因此可以 将大规模的数据分析 交给 任何 一个 拥有 足够多机器的运行商。
MapReduce 的 优势 在于 处理大型数据集,所以 下面首先来看一个例子。
使用 Hadoop 进行 数据分析
为了更好地发挥 Hadoop 提供的 并行 处理机制 的 优势, 我们 必须 把查询 标识成 Map Reduce 作业。
经过 一些 本地的 小规模测试,我们能够 在机器 集群上 运行它。
map 和 reduce
MapReduce 的 工作过程分为两个阶段: map 阶段 和 reduce 阶段。
每个阶段 都有 键/值 作为输入和输出,并且 它们的类型可由程序员 选择。程序员 还具体 定义了 两个 函数: map 函数 和 reduce 函数。
我们在 map 阶段 输入的 是 原始的 NCDC数据。 我们选择的是一种 文本 输入格式, 以便 数据集的每一行 都会是一个 文本值。
键是 在 文件 开头部分文本行 起始 处的 偏移量, 但我们没有这 方面的需求, 所以 将其 忽略。
map 函数很简单。 我们 使用 map 函数 来找出 年份 和 气温, 因为我们只对 它们有兴趣。 在本例中, map 函数 只是 一个 数据准备 阶段,
通过这种方式 来建立数据, 使得 reduce 函数 能在此 基础上进行 工作: 找出 每年的最高气温。
map 函数 也是 很适合 去除 已损 记录的 地方: 在这里, 我们 将 筛选 掉 缺失的、不可靠的或 错误的气温数据。
为了 全面 了解 map 的 工作方式, 我们思考下面几行 示例 的 输入 数据()
这些 行 以 键/值 对的方式 来表示 map 函数:
键 是 文件中的 行 偏移量, 而这往往是我们在 map 函数 中 所忽视的。
map 函数的功能 仅仅 提取 年份 和 气温(以粗体 显示),并将其 作为 输出被 发送。(气温值 已被 解释为整数)
map 函数的输出 先由 MapReduce 框架处理, 然后 再被 发送到 reduce 函数。
这一处理过程 根据 键/值对 进行排序 和 分组。 因此,继续我的示例,reduce 函数 会到 如下输入:
每年的年份后 都有一系列 气温 读数。所有 reduce 函数 现在必须重复 这个列表 并从中找出最大的读数:
这是最后的输出: 全球 气温纪录中每年的最高气温。
整个数据流如图 2-1 所示。 在图的底部是 Unix 的 管道, 模拟整个 MapReduce的 流程, 其中的内容 我们将在以后 讨论 Hadoop 数据流时 再次提到。
MapReduce 的逻辑数据流 |