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

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介:

本节书摘来自华章计算机《大数据架构和算法实现之路:电商系统的技术实战》一书中的第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框架的基本流程和对应的模块。

screenshot

有了分布式文件系统(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章。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
3月前
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
72 5
|
3月前
|
存储 机器学习/深度学习 缓存
软考软件评测师——计算机组成与体系结构(分级存储架构)
本内容全面解析了计算机存储系统的四大核心领域:虚拟存储技术、局部性原理、分级存储体系架构及存储器类型。虚拟存储通过软硬件协同扩展内存,支持动态加载与地址转换;局部性原理揭示程序运行特性,指导缓存设计优化;分级存储架构从寄存器到外存逐级扩展,平衡速度、容量与成本;存储器类型按寻址和访问方式分类,并介绍新型存储技术。最后探讨了存储系统未来优化趋势,如异构集成、智能预取和近存储计算等,为突破性能瓶颈提供了新方向。
|
4月前
|
存储 监控 算法
解析公司屏幕监控软件中 C# 字典算法的数据管理效能与优化策略
数字化办公的时代背景下,企业为维护信息安全并提升管理效能,公司屏幕监控软件的应用日益普及。此软件犹如企业网络的 “数字卫士”,持续记录员工电脑屏幕的操作动态。然而,伴随数据量的持续增长,如何高效管理这些监控数据成为关键议题。C# 中的字典(Dictionary)数据结构,以其独特的键值对存储模式和高效的操作性能,为公司屏幕监控软件的数据管理提供了有力支持。下文将深入探究其原理与应用。
83 4
|
5月前
|
机器学习/深度学习 监控 算法
员工上网行为监控软件中基于滑动窗口的C#流量统计算法解析​
在数字化办公环境中,员工上网行为监控软件需要高效处理海量网络请求数据,同时实时识别异常行为(如高频访问非工作网站)。传统的时间序列统计方法因计算复杂度过高,难以满足低延迟需求。本文将介绍一种基于滑动窗口的C#统计算法,通过动态时间窗口管理,实现高效的行为模式分析与流量计数。
108 2
|
5月前
|
人工智能 运维 算法
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
110 3
|
6月前
|
监控 算法 安全
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
101 1
|
2月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
62 4
|
4月前
|
机器学习/深度学习 存储 监控
上网管理监控软件的 Go 语言流量特征识别算法实现与优化
本文探讨基于Go语言的流量特征识别算法,用于上网管理监控软件。核心内容涵盖AC自动机算法原理、实现及优化,通过路径压缩、哈希表存储和节点合并策略提升性能。实验表明,优化后算法内存占用降低30%,匹配速度提升20%。在1000Mbps流量下,CPU利用率低于10%,内存占用约50MB,检测准确率达99.8%。未来可进一步优化高速网络处理能力和融合机器学习技术。
130 10
|
4月前
|
监控 算法 安全
基于 PHP 的员工电脑桌面监控软件中图像差分算法的设计与实现研究
本文探讨了一种基于PHP语言开发的图像差分算法,用于员工计算机操作行为监控系统。算法通过分块比较策略和动态阈值机制,高效检测屏幕画面变化,显著降低计算复杂度与内存占用。实验表明,相比传统像素级差分算法,该方法将处理时间缩短88%,峰值内存使用量减少70%。文章还介绍了算法在工作效率优化、信息安全防护等方面的应用价值,并分析了数据隐私保护、算法准确性及资源消耗等挑战。未来可通过融合深度学习等技术进一步提升系统智能化水平。
66 2
|
4月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
92 4