MapReduce & Hadoop

Hadoop 是什么?Hadoop 又与 MapReduce 有什么关系?本篇文章会简单介绍两者之间的关系,算是自己在学习过程中做的笔记吧。

我们在练习过程中可能就使用几M的数据量,但是真正在实践中我们接触的数据可比这大得多,这是如果还使用一台电脑进行运算的话就显得十分笨拙,并且实际上远远超出了我们的计算能力。幸运的是一些开源的软件项目提供了处理海量数据的方案,其中一个项目就是 Hadoop,它采用JAVA语言编写,支持在大量机器上分布处理数据。

Hadoop 是 MapReduce 框架的一个开源实现。本篇笔记简单介绍 MapReduce 和 Hadoop 项目。

MapReduce: 分布式计算的框架

优点:可在短时间内完成大量工作
缺点:算法必须经过重写需要对系统工程有一定的理解
适用数据类型:数值型和标称型数据

MapReduce 是一个软件框架,可以将单个计算作业分配给多台计算机进行执行。它假定这些作业在单机上运行需要很长时间,因此使用多台机器缩短运行时间。

MapReduce 在大量节点组成的集群上运行。它的工作流程是:单个作业被分成很多小份,输入数据也被切片分发到每个节点,各个节点只在本地数据上做运算,对应的运算代码称为 mapper,这个过程被称作 map 阶段。每个 mapper 的输出通过某种方式组合(一般会有排序),排序后的结果再被分为小份分发到各个节点进行下一步处理。第二步的初级称为 reduce 阶段,对应的运行代码称为 reducer。reducer 的输出就是程序执行的最终结果。

MapReduce 的优势在于它使得程序以并行方式进行。

注意:在任何时候,每个 mapper 或者 reducer 之间都不进行通信。每个节点只处理自己的事务,并且在本地分配的数据集上进行运算。

不同类型的作业可能需要不同数目的 reducer。此外,在 MapReduce 的框架中还有其他一些灵活的配置选项。MapReduce 的整个编配工作由主节点(master node)控制。这些主节点控制整个 MapReduce 的作业编配,包括每份数据存放的节点位置,以及 map,sort 和 reduce 等阶段的时序控制等。此外,主节点还要包含容错机制。一般的,每份 mapper 的输入数据会同时分配到多个节点形成多分副本,用于事物的失效处理。

一个 MapReduce 集群的简单示意图

上图中的每台机器都有两个处理器,可以同时处理两个 map 或者 reduce 任务。如果机器0在 map 阶段宕机,主节点将会发现这一点,并在发现该问题后将机器0移出集群,并在剩余的节点上继续作业。在一些 MapReduce 的实现中,在多个机器上都保存有数据的多个备份。同时每个节点都必须与主节点通信,表明自己工作正常。若节点失效或工作异常,主节点将重启该节点或将该节点移出可用机器池。

小小的总结一下:

  1. 主节点控制 MapReduce 的作业流程
  2. MapReduce 的作业可分为 map 任务和 reduce 任务
  3. map 任务之间不做任何数据交流,reduce 任务也是一样
  4. 在 map 和 reduce 任务中间有一个 sort或者combine 阶段
  5. 数据被重复存放在不同的机器上,以防止某个机器失效
  6. mapper 和 reducer 之间的数据传递形式是键值对

Apache 的 Hadoop 项目是 MapReduce 框架的一个实现,下面我们讨论 Hadoop 项目,并介绍如何用 python 使用它。

Hadoop流

Hadoop 是一个开源的 JAVA 项目,为运行 MapReduce 提供了大量所需的功能。除了分布式计算之外,Hadoop 自带分布式文件系统。

这里只是初探 Hadoop,关于更深层的使用会在日后更新。

下面将使用 python 编写 MapReduce 代码,并在 Hadoop流 中运行。Hadoop流 很想 Linux 系统中的管道。如果用 mapper.py 调用 mapper,那么Hadoop流 可以像 Linux 命令一样执行。例如:

1
2
cat test.txt | python mapper.py | sort | python reducer.py >
output.txt

这样,类似的 Hadoop流 就可以在多台机器上分布式执行,用户可以通过 Linux 命令来测试python编写的 MapReduce 脚本

基础概念就先介绍到这里,之后系列的文章将介绍具体实现,可能会用到亚马逊提供的服务器。