【机器学习实战-python3】大数据与MapReduce

本篇的数据和代码参见:https://github.com/stonycat/ML-in-Action

一、MapReduce:分布式计算的框架
MapReduce

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

Google公司的Jeffrey Dean和Sanjay Ghemawat在2004年的一篇论文中第一次提出了这个思想,该论文的题目是“MapReduce:Simplified Data Processing on Large Clusters” 1 MapReduce的名字由函数式编程中常用的map和reduce两个单词组成。

MapReduce的优势在于,它使得程序以并行方式执行。
这里写图片描述

在一些MapReduce的实现中,在多个机器上都保存有数据的多个备份,
例如在机器0上存放的输入数据可能还存放在机器1上,以防机器0出现问题。同时,每个节点都必须与主节点通信,表明自己工作正常。如果某节点失效或者工作异常,主节点将重启该节点或者将该节点移出可用机器池。
总结一下上面几个例子中关于MapReduce的学习要点:

 主节点控制MapReduce的作业流程;
 MapReduce的作业可以分成map任务和reduce任务;
 map任务之间不做数据交流,reduce任务也一样;
 在map和reduce阶段中间,有一个sort或combine阶段;
 数据被重复存放在不同的机器上,以防某个机器失效;
 mapper和reducer传输的数据形式为key/value对。

Apache的Hadoop项目是MapReduce框架的一个实现。下一节将开始讨论Hadoop项目,并介绍如何在Python中使用它。

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

下面将使用Python编写MapReduce代码,并在Hadoop流中运行。Hadoop流(http://hadoop.apache. org/ common/docs/current/streaming.html)很像Linux系统中的管道(管道使用符号 | ,可以将一个命令的输出作为另一个命令的输入)。如果用mapper.py调用mapper,用reducer.py调用reducer,那么Hadoop流就可以像Linux命令一样执行。
测试书中代码:mrMeanMapper.py

$ cat inputFile.txt | python mrMeanMapper.py
100 0.509570 0.344439
report: still alive

其中第一行是标准输出,也就是reducer的输入;第二行是标准错误输出,即对主节点做出的响应报告,表明本节点工作正常。

至此,mapper已经可以工作了,下面介绍reducer。根据前面的介绍,mapper接受原始的输入并产生中间值传递给reducer。很多mapper是并行执行的,所以需要将这些mapper的输出合并成一个值。mrMeanReducer.py

cat inputFile.txt | python mrMeanMapper.py | python mrMeanReducer.py
report: still alive
100 0.509570 0.344439
report: still alive

三、MapReduce 上的机器学习
下面的清单简要列出了本书常用的机器学习算法和对应的MapReduce实现。

简单贝叶斯——它属于为数不多的可以很自然地使用MapReduce的算法。在MapReduce中计算加法非常容易,而简单贝叶斯正需要统计在某个类别下某特征的概率。因此可以将每个指定类别下的计算作业交由单个的mapper处理,然后使用reducer来将结果加和。

k-近邻算法——该算法首先试图在数据集上找到相似向量,即便数据集很小,这个步骤也将花费大量的时间。在海量数据下,它将极大地影响日常商业周期的运转。一个提速的办法是构建树来存储数据,利用树形结构来缩小搜索范围。该方法在特征数小于10的情况下效果很好。高维数据下(如文本、图像和视频)流行的近邻查找方法是局部敏感哈希算法。

支持向量机(SVM)——使用的Platt SMO算法在MapReduce框架下难以实现。但有一些其他SVM的实现使用随机梯度下降算法求解,如Pegasos算法。另外,还有一个近似的SVM算法叫做最邻近支持向量机(proximal SVM),求解更快并且易于在MapReduce框架下实现 。

奇异值分解——Lanczos算法是一个有效的求解近似特征值的算法。该算法可以应用在一系列MapReduce作业上,从而有效地找到大矩阵的奇异值。另外,该算法还可以应用于主成分分析。

K-均值聚类——一个流行的分布式聚类方法叫做canopy聚类,可以先调用canopy聚类法取得初始的k个簇,然后再运行K-均值聚类方法。

注:书中涉及的在Python中使用mrjob自动化MapReduce和分布式SVM的Pegasos算法示例这里省略,感兴趣可参考其他blog如:
http://blog.forec.cn/2016/02/27/machinelearning15/

你真的需要 MapReduce 吗?
充分利用已有资源可以节省时间和精力。如果你的作业花费了太多的时间,先问问自己:代码是否能用更有效率的语言编写(如C或者Java)?如果语言已经足够有效率,那么代码是否经过了充分的优化?影响处理速度的系统瓶颈在哪里,是内存还是处理器?或许你不知道这些问题的答案,找一些人做些咨询或讨论将非常有益。大多数人意识不到单台机器上可以做多少数字运算。如果没有大数据的问题,一般不需要用到MapReduce和Hadoop。但对MapReduce和Hadoop稍作了解,在面临大数据的问题时知道它们能做些什么,还是很棒的一件事情。
——————————————————————————————————————————————————————————
小结:
当运算需求超出了当前资源的运算能力,可以考虑购买更好的机器,或者租用网络服务并使用MapReduce框架并行执行。很多机器学习算法都可以容易地写成MapReduce作业,而某些需要经过重写。大部分情况下,MapReduce并不需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章