当运算需求超出了当前资源的运算能力,一、可以考虑购买更好的机器;二、可以将计算转换成并行作业,MapReduce就提供了这种方案的一个具体实施框架。
MapReduce:分布式计算的框架
MapReduce是一个软件框架,可以将单个计算工作分配给多台计算机执行。工作流程包括map和reduce阶段。第一阶段,输入数据被切片分发到节点上,各个节点对本地数据进行处理对应的运算代码叫做mapper。第二阶段,每个mapper输出的结果通过某种方式组合后,分发给各个节点进行下一步的处理,相应的代码被称为reducer。以计算一大堆数据的最大值为例,每个mapper产生一个最大值,reducer负责比较所有mapper输出的最大值,得到全局的最大值。
关于MapReduce的学习要点:
- 主节点控制 MapReduce 的作业流程
- MapReduce 的作业可以分成map任务和reduce任务
- map 任务之间不做数据交流,reduce 任务也一样
- 在 map 和 reduce 阶段中间,有一个 sort 和 combine 阶段数据被重复存放在不同的机器上,以防止某个机器失效
- mapper 和 reducer 传输的数据形式为 key/value对
Hadoop流
Hadoop是MapReduce框架的一个开源实现,可以运行除Java之外其他语言编写的分布式程序。Hadoop流(http://hadoop.apache. org/ common/docs/current/streaming.html)很像Linux系统中的管道(管道使用符号 | ,可以将一个命令的输出作为另一个命令的输入)。如果用mapper.py调用mapper,用reducer.py调用reducer,那么Hadoop流就可以像Linux命令一样执行。
例如:
cat inputFile.txt | python mapper.py | sort | python reducer.py >
outputFile.txt
分布式均值和方差计算的mapper
这是一个简单的例子,测试mapper,在Linux终端执行以下命令:
cat inputFile.txt | python mrMeanMapper.py
在Windows系统下,在DOS窗口输入以下命令:
python mrMeanMapper.py < inputFile.txt
分布式均值和方差计算的reducer
测试reducer,在Linux终端执行以下命令:
%cat inputFile.txt | python mrMeanMapper.py | python mrMeanReducer.py
在Windows系统下,在DOS窗口输入以下命令:
%python mrMeanMapper.py < inputFile.txt | python mrMeanReducer.py
在Amazon网络服务上运行Hadoop程序
如果要在100台机器上同时运行mapReduce作业,那么就需要找到100台机器,可以采取购买方式,或者从其他地方租用。Amazon网络服务(AWS)允许用户按时长租借计算资源。弹性MapReduce(EMR)是Amazon上一个常用的工具,可以帮助用户在AWS上运行Hadoop流工作。