《大数据架构和算法实现之路:电商系统的技术实战》——1.5 相关软件:R和Mahout

本节书摘来自华章计算机《大数据架构和算法实现之路:电商系统的技术实战》一书中的第1章,第1.5节,作者 黄 申,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.5 相关软件:R和Mahout

了解了机器学习和分类的基本知识之后,你会发现相关算法本身的实现也是需要大量的专业知识的,开发的门槛也比较高。如果一切从头开始,整个流程将包括构建算法模型、计算离线评估的指标、打造在线实时服务等内容,完成所有这些我们才有可能满足业务的需求,如此之长的战线,对于竞争激烈的电商而言是无法接受的。那么有没有现成的软件可以帮助我们完成这个艰巨的任务呢?答案是肯定的。这里将介绍两个常见的机器学习软件工具:R和Mahout。

1.5.1 R简介

R(https://www.r-project.org/ )提供了一套基于脚本语言的解决方案,协助没有足够计算机编程知识的用户进行机器学习的测试,并快速地找到适合的解决方案。R虽然只有一个字母,但是其代表了一整套的方案,包括R语言及其对应的系统工具。早在1980年左右诞生了一种S语言,它广泛应用于统计领域,而R语言是它的一个分支,可以认为是S语言的一种实现。相对于Java和稍后要介绍的Mahout而言,R的脚本式语言更加容易理解,而且它还提供了颇为丰富的范例供大家直接使用。此外R的交互式环境和可视化工具也极大地提高了生产效率,人们可以从广泛的来源获取数据,将数据整合到一起,并对其进行清洗等预处理,然后用不同的模型和方法进行分析,最后通过直观的可视化方式来展现结果。当然,还有一点非常关键:R是免费的,相对于价格不菲的商业软件而言,它的性价比实在是太高了。下面是R的几个主要功能。

  • 交互式的环境:R具有良好的互动性。它拥有图形化的输入输出窗口,对于编辑语法中出现的错误会马上在窗口中予以提示,还会记忆之前输入过的命令,可以随时再现、编辑历史记录以满足用户的需要。输出的图形可以直接保存为JPG、BMP、PNG等多种图片格式。
  • 丰富的包(Package):R提供了大量开箱即用的功能,称为包。你可以将其理解为R社区用户贡献的模块,从简单的数据处理,到复杂的机器学习和数据挖掘算法,都有所涵盖。截至本书撰写的时候,包的总数已经超过了1万,横跨多个领域。初次安装R的时候自带了一系列默认的包,会提供默认的函数和数据集,其他的扩展可根据需要下载并安装。
  • 直观的图示化:俗话说,“一图胜千言”,图形展示是最高效且形象的描述手段,巧妙的图形展示也是高质量数据分析报告的必备内容。因此一款优秀的统计分析软件必须具备强大的图形展示功能,R也不例外。同样,画图都有现成的函数可供调用,包括直方图(hist())、散点图(plot())、柱状图(barplot())、饼图(pie())、箱线图(boxplot())、星相图(stars())、脸谱图(faces())、茎叶图(stem())等。

1.5.2 Mahout简介

虽然R语言及其工具非常强大,但是由于脚本语言的限制,其性能往往不能达到大规模在线应用的要求。因此,还可以考虑Apache的Mahout(http://mahout.apache.org )。Mahout项来源于Lucene开源搜索社区对机器学习的兴趣,其初衷是希望实现一些常见的用于数据挖掘的机器学习算法,并拥有良好的可扩展性和维护性,达到帮助开发人员方便快捷地创建智能应用程序的目的。该社区最初基于一篇关于在多核服务器上进行机器学习的学术文章进行了原型的开发,此后在发展中又并入了更多广泛的机器学习方法。因此,Mahout除了提供最广为人知的推荐算法之外,还提供了很多分类、聚类和回归挖掘的算法。和其他的算法系统相比,Mahout通过Apache Hadoop将算法有效地扩展到了分布式系统中。随着训练数据的不断增加,非分布式的系统用于训练的时间或硬件需求并不是线性增加的,这点已经在计算机系统中被广泛验证。因为5倍的训练数据而导致100倍的训练时间,那将是用户无法接受的事情。Mahout可以将数据切分成很多小块,通过Hadoop的HDFS存储,通过Map-Reduce来计算。分布式的协调处理可将时间消耗尽量控制在线性范围之内。因此,当训练的数据量非常庞大的时候,Mahout的优势就会体现出来。按照其官方的说法,这个规模的临界点在百万到千万级,具体还要看每个数据对象和挖掘模型的复杂程度。

Mahout中的分类算法,除了常见的决策树、朴素贝叶斯和回归,还包括了支持向量机(Support Vector Machine)、随机森林(Random Forests)、神经网络(Neural Network)和隐马尔科夫模型(Hidden Markov Model),等等。支持向量机属于一般化线性分类器,特点是能够同时最小化经验误差和最大化几何边缘区。随机森林是一个包含多个决策树的分类器,在决策树的基础上衍生而来,其分类标签的输出由多个决策树的输出投票来决定,这在一定程度上弥补了单个决策树的缺陷。最近几年随着深度学习(Deep Learning)的流行,神经网络再次受到人们的密切关注。众所周知,人脑是一个高度复杂的、非线性的并行处理系统。人工建立的神经网络起源于对生物神经元的研究,并试图模拟人脑的思维方式,对数据进行分类、预测及聚类。隐马尔科夫模型更适合有序列特性的数据挖掘,例如语音识别、手写识别和自然语音处理等,其中文字和笔画的出现顺序对后面的预测都会很有帮助。

不难发现,R和Mahout都实现了主要的机器学习算法。那么,它们的定位是否会重复呢?其实,它们有各自的长处,并不矛盾。通常,在具体的算法还未确定之前,我们可以使用R进行快速测试,选择合适的算法,预估大体的准确率。参照R所给出的结果,就可以确定是否可以采用相关的学习算法,以及具体的模型。在此基础之上,我们再利用Mahout打造大规模的、在线的后台系统,为前端提供实时性的服务。在下面的实践部分,我们就将展示这样的工作流程。

1.5.3 Hadoop简介

既然提到了Mahout和并行的分布式学习,就需要介绍一下Apache Hadoop。Apache Hadoop是一个开源软件框架,用于分布式存储和大规模数据处理。2003年,Google发表了一篇论文描述他们的分布式文件系统(Google File System,GFS),为另一个开源项目Nutch攻克数十亿网页的存储难题提供了方向。Nutch和Lucene的创始人Doug Cutting受到此文的启发,和团队一起开发了Nutch的分布式文件系统(Nutch Distributed File System,NDFS)。2004年,Google又发表了一篇重量级的论文《MapReduce:在大规模集群上的简化数据处理》(“MapReduce: Simplif?ied Data Processing on Large Clusters”)。之后,Doug Cutting等人开始尝试实现论文所阐述的计算框架MapReduce。此外,为了更好地支持该框架,他们还将其与NDFS相结合。2006年,该项目从Nutch搜索引擎中独立出来,成为如今的Hadoop(http://hadoop.apache.org)。两年之后,Hadoop已经发展成为Apache基金会的*项目,并应用于很多著名的互联网公司,目前其最新的版本是2.x。

Hadoop发展的历史决定了其框架最核心的元素就是HDFS和MapReduce。如今的Hadoop系统已经可以让使用者轻松地架构分布式存储平台,并开发和运行大规模数据处理的应用,其主要优势如下。

  • 透明性:使用者可以在不了解Hadoop底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。
  • 高扩展性:扩展分为纵向和横向,纵向是增加单机的资源,总是会达到瓶颈,而横向则是增加集群中的机器数量,获得近似线性增加的性能,不容易达到瓶颈。Hadoop集群中的节点资源,采用的就是横向方式,可以方便地进行扩充,并获得显著的性能提升。
  • 高效性:由于采用了多个资源并行处理,使得Hadoop不再受限于单机操作(特别是较慢的磁盘I/O读写),可以快速地完成大规模任务。加上其所具有的可扩展性,随着硬件资源的增加,性能将会得到进一步的提升。
  • 高容错和高可靠性:Hadoop中的数据都有多处备份,如果数据发生丢失或损坏,其能够自动从其他副本(Replication)进行复原。类似的,失败的计算任务也可以分配到新的资源节点,进行自动重试。
  • 低成本:正是因为Hadoop有良好的扩展性和容错性,所以没有必要再为其添置昂贵的高端服务器。廉价的硬件,甚至是个人电脑都可以称为资源节点。
  • 在使用HDFS的实践中,人们还发现其存在如下几个弱点。
  • 不适合实时性很强的数据访问。试想一下,对于一个应用的查询,其对应的数据通常是分散在HDFS中不同数据节点上的。为了获取全部的数据,需要访问多个节点,并且在网络中传输不同部分的结果,最后进行合并。可是,网络传输的速度,相对于本机的硬盘和内存读取都要慢很多,因此就拖累了数据查询的执行过程。
  • 无法高效存储大量小文件。对于HDFS而言,如果存在太多的琐碎文件,那就意味着存在庞大的元数据需要处理,这无疑大大增加了命名节点的负载。命名节点检索的效率明显下降,最终也会导致整体的处理速度放缓。

不过,整体而言,HDFS还是拥有良好的设计的,对Hadoop及其生态体系的流行起到了关键的作用。它所提供的对应用程序数据的高吞吐量访问,非常适合于存储大量数据,例如用户行为日志。在本书的第11章关于用户行为跟踪的内容中,我们将展示怎样结合使用HDFS与Flume。

而Hadoop的另一个要素MapReduce,其核心是哈希表的映射结构,其包含如下几个重要的组成模块。

  • 数据分割(Data Splitting):将数据源进行切分,并将分片发送到Mapper上。例如将文档的每一行作为最小的处理单元。
  • 映射(Mapping):Mapper根据应用的需求,将内容按照键-值的匹配,存储到哈希结构中。例如,将文本进行中文分词,然后生成<牛奶,1>这样的配对,表示“牛奶”这个词出现了一次。
  • 洗牌(Shuff?ling):不断地将键-值的配对发给Reducer进行归约。如果存在多个Reducer,则还会使用分配(Partitioning)对Reducer进行选择。例如,“牛奶”“巧克力”“海鲜”这种属于商品的单词,专门交给负责统计商品列表的Reducer来完成。
  • 归约(Reducing):分析所接受到的一组键值配对,如果是与键内容相同的配对,那就将它们的值进行合并。例如,一共收到12个<牛奶,1>({<牛奶,1>,<牛奶,1>}…<牛奶,1>}),那么就将其合并为<牛奶,12>。最终“牛奶”这个单词的词频就统计为12。

为了提升洗牌阶段的效率,可以减少发送到归约阶段的键-值配对。具体的做法是在映射和洗牌之间,加入合并(Combining)的过程,在每个Mapper节点上先进行一次本地的归约,然后只将合并后的结果发送到洗牌和归约阶段。

图1-4展示了MapReduce框架的基本流程和对应的模块。

《大数据架构和算法实现之路:电商系统的技术实战》——1.5 相关软件:R和Mahout

有了分布式文件系统(HDFS)和分布式计算框架MapReduce这两驾马车保驾护航,Hadoop系统近几年的发展可谓风生水起。不过,人们也意识到MapReduce框架的一些问题。比如,工作跟踪节点Job Tracker,它是MapReduce的集中点,完成了太多的任务,造成了过多的资源消耗,存在单点故障的可能性较大。而在任务跟踪(Task Tracker)节点端,用任务的数量来衡量负载的方式则过于简单,没有考虑*运算器CPU、内存和硬盘等的使用情况,有可能会出现负载不均和某些节点的过载。Map和Reduce任务的严格划分,也可能会导致某些场合下系统的资源没有被充分利用。

面对种种问题,研发人员开始思考新的模式,包括Apache Hadoop YARN(Yet Another Resource Negotiator)等。Apache Hadoop YARN是一种新的资源管理器,为上层应用提供了统一的Hadoop资源管理和调度。YARN将工作跟踪(Job Tracker)节点的两个主要功能分成了两个独立的服务程序:全局的资源管理器(Resource Manager)和针对每个应用的主节点(Application Master)。如此设计是为了让子任务的监测进行分布式处理,大幅减少了工作跟踪节点的资源消耗。同时,这里所说的应用既可以是传统意义上的MapReduce任务,也可以是基于有向无环图(DAG)的任务。因此,在YARN的基础上,甚至还可以运行Spark和Storm这样的流式计算和实时性作业,并利用Hadoop集群的计算能力和丰富的数据存储模型,提升数据共享和集群的利用率。对于Hadoop更多细节感兴趣的读者,可以阅读《大数据架构商业之路》的第3章和第4章。

上一篇:【C/C++】精确系统延时


下一篇:Visual Studio 2010开发AutoCAD 2012 .net 应用程序调试时断点不起作用