Spark机器学习实战

978-7-115-54142-0
作者: 西亚玛克•阿米尔霍吉(Siamak Amirghodsi)
译者: 陆靖桥
编辑: 胡俊英

图书目录:

详情

机器学习是一门多领域交叉学科,可以通过模拟来让计算机获取新的知识或技能。Apache Spark是一种通用大数据框架,也是一种近实时弹性分布式计算和数据虚拟化技术,Spark使人们可以大规模使用机器学习技术,而无须在专用数据中心或硬件上进行大量投资。 本书提供了Apache Spark机器学习API的全面解决方案,不仅介绍了用Spark完成机器学习任务所需的基础知识,也涉及一些Spark机器学习的高级技能。全书共有13章,从环境配置讲起,陆续介绍了线性代数库、数据处理机制、构建机器学习系统的常见攻略、回归和分类、用Spark实现推荐引擎、无监督学习、梯度下降算法、决策树和集成模型、数据降维、文本分析和Spark Steaming的使用。 本书是为那些掌握了机器学习技术的Scala开发人员准备的,尤其适合缺乏Spark实践经验的读者。本书假定读者已经掌握机器学习算法的基础知识,并且具有使用Scala实现机器学习算法的一些实践经验。但不要求读者提前了解Spark ML库及其生态系统。

图书摘要

版权信息

书名:Spark机器学习实战

ISBN:978-7-115-54142-0

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [美]西亚玛克·阿米尔霍吉(Siamak Amirghodsi)

     [印]明那什·拉杰德兰(Meenakshi Rajendran)

     [美]布罗德里克·霍尔(Broderick Hall)

     [美]肖恩·梅(Shuen Mei)

译    陆靖桥

责任编辑 胡俊英

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright ©2017 Packt Publishing. First published in the English language under the title

Apache Spark 2.x Machine Learning Cookbook.

All rights reserved.

本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


机器学习是一门多领域交叉学科,可以通过模拟来让计算机获取新的知识或技能。Apache Spark是一种通用大数据框架,也是一种近实时弹性分布式计算和数据虚拟化技术,Spark使人们可以大规模使用机器学习技术,而无须在专用数据中心或硬件上进行大量投资。

本书提供了Apache Spark机器学习API的全面解决方案,不仅介绍了用Spark完成机器学习任务所需的基础知识,也涉及一些Spark机器学习的高级技能。全书共有13章,从环境配置讲起,陆续介绍了线性代数库、数据处理机制、构建机器学习系统的常见攻略、回归和分类、用Spark实现推荐引擎、无监督学习、梯度下降算法、决策树和集成模型、数据降维、文本分析和Spark Steaming的使用。

本书是为那些掌握了机器学习技术的Scala开发人员准备的,尤其适合缺乏Spark实践经验的读者。本书假定读者已经掌握机器学习算法的基础知识,并且具有使用Scala实现机器学习算法的一些实践经验。但不要求读者提前了解Spark ML库及其生态系统。


陆靖桥,毕业于计算机系,获硕士学位,Python爱好者,喜欢钻研机器学习、深度学习、大数据分析等技术,对网络科学和智能算法有浓厚的兴趣。


西亚玛克·阿米尔霍吉(Siamak Amirghodsi)(Sammy)是世界级的高级技术执行主管,在大数据战略、云计算、定量风险管理、高级分析、大规模监管数据平台、企业架构、技术路线图、多项目执行等领域具有丰富的企业管理经验,而且入选了《财富》全球二十大人物。

Siamak是一位人工智能专家,精通大数据、云计算、机器学习,目前就职于美国的一级金融机构,负责大规模的云平台开发和高级风险分析。Siamak擅长多个领域:建立高级技术团队、执行管理、Spark、Hadoop、大数据分析、人工智能、深度学习网络、TensorFlow、认知模型、群体算法、实时流系统、量子计算、金融风险管理、交易信号发现、计量经济学、长期财务周期、物联网、区块链、概率图形模型、密码学和自然语言处理。

Siamak已获得Cloudera大数据认证,并熟悉Apache Spark、TensorFlow、Hadoop、Hive、Pig、Zookeeper、Amazon AWS、Cassandra、HBase、Neo4j、MongoDB和GPU架构,同时非常擅长传统IBM/Oracle/Microsoft技术栈解决商业连续和集成业务问题。

Siamak拥有PMP认证,拥有计算机科学的高级学位和芝加哥大学(ChicagoBooth)的MBA学位,擅长战略管理、量化金融和计量经济学。

明那什·拉杰德兰(Meenakshi Rajendran)是一位大数据分析和数据管理经理,在大规模数据平台和机器学习方面非常专业,在全球技术人才圈中也非常出类拔萃。她为顶尖金融机构提供一整套全面的数据分析和数据科学服务,经验非常丰富。Meenakshi拥有企业管理硕士学位,获得PMP认证,在全球软件交付行业拥有十几年的经验,不仅了解大数据和数据科学技术的基础知识,而且对人性也有很深刻的理解。

Meenakshi喜欢Python、R、Julia和Scala等语言,研究领域和兴趣包括Apache Spark、云计算、数据治理、机器学习、Cassandra和大规模全球数据团队管理,业余时间还对软件工程管理文献、认知心理学和国际象棋感兴趣。

布罗德里克·霍尔(Broderick Hall)是一位大数据分析专家,拥有计算机科学硕士学位,在设计和开发大规模的实时性和符合制度要求的复杂企业软件应用程序方面拥有20多年的经验。曾经为美国的一些顶级金融机构和交易所设计和构建实时金融应用程序,在这些方面拥有丰富的经验。此外,他还是深度学习的早期开拓者,目前正在开发具有深度学习网络扩展功能的大规模基于云的数据平台。

Broderick在医疗保健、旅行、房地产和数据中心管理方面拥有丰富的经验,还担任副教授职务,教授Java编程和面向对象编程等课程。目前专注于在金融服务行业中交付实时大数据关键任务分析的应用程序。

很早以来,Broderick一直积极应用Hadoop、Spark、Cassandra、TensorFlow和深度学习,同时积极追求机器学习、云架构、数据平台、数据科学和认知科学的实际应用,还喜欢使用Scala、Python、R、Java和Julia进行编程。

肖恩·梅(Shuen Mei)是一位大数据分析平台专家,在金融服务行业已经从业超过15年,在设计、构建和执行具有关键任务、低延迟要求的大型企业分布式财务系统方面具有丰富的经验。目前已通过Apache Spark、Cloudera大数据平台(包括Developer、Admin和HBase)的认证。

Shuen已经通过AWS解决方案架构师认证,擅长数据PB级数据的实时数据平台系统,是一位技能非常熟练的软件工程师,为《财富》一百强公司提供交易和金融基础设施、编码、数据体系结构以及性能优化等方面的解决方案,拥有丰富的经验。

Shuen拥有伊利诺伊大学的MIS硕士学位,喜欢Spark、TensorFlow、Hadoop、Spark、云体系结构、Apache Flink、Hive、HBase、Cassandra等技术架构,还对Scala、Python、Java、Julia、云计算、机器学习算法和大规模深度学习充满热情。


苏米特·帕尔(Sumit Pal)是SQL on Big Data-Technology, Architecture and Innovations的作者,在软件行业中担任过从初创企业到企业的各种职位,已有22年以上的经验。

Sumit是一位负责大数据、数据可视化和数据科学的独立顾问,也是一位构建端到端数据驱动分析系统的软件架构师。

Sumit在22年的职业生涯中,就职过Microsoft(SQL服务器开发团队)、Oracle(OLAP开发团队)和Verizon(大数据分析团队)等大型公司。目前同时为多个客户提供服务,主要是针对数据体系结构和大数据解决方案提供建议,使用Spark、Scala、Java和Python等语言编码。

Sumit曾经在下面的大数据会议上发表了讲话:

Sumit还为Experfy开发了一个大数据分析师培训课程,有关更多详细信息可以访问experfy网站上的big-data-analyst课程。同时,他在运用大数据和NoSQL DB技术构建从中间层和数据层到分析应用程序可视化的可伸缩系统方面拥有丰富的经验。此外,对于数据库内部原理、数据仓库、维度建模、使用Java和Python的数据科学以及SQL技术,Sumit也拥有深厚的专业知识。

Sumit的职业生涯始于1996年和1997年,第一份工作是在Microsoft SQL Server开发团队,然后在马萨诸塞州伯灵顿的OLAP开发团队担任Oracle Corporation的核心服务器工程师。

Sumit还曾在Verizon担任大数据架构副总监一职,负责分析和机器学习应用程序有关的战略、管理、架构、平台开发并提供解决方案。他还曾在ModelN/LeapfrogRX(2006-2013年)担任首席架构师,其间在J2EE上使用开源OLAP引擎(Mondrian)构建了中间层核心分析平台,并解决一些复杂的维度ETL、建模和性能优化问题。

Sumit拥有计算机科学的硕士学位和理学学士学位。2016年10月,还参加过登山运动,到达了珠穆朗玛峰大本营。


教育不是学习已有的知识,而是训练思想。

——爱因斯坦

数据是我们这个时代的新载体,机器学习与受生物学启发的认知系统结合在一起,不仅成为第四次工业革命的核心基础,而且还促进了第四次工业革命的诞生。本书的完成应该归功于我们的父母,他们通过异常的艰辛和牺牲,让我们接受教育,并教会我们始终保持友善。

本书由4个具有不同背景的作者编写而成,他们在多个行业和学术领域都拥有丰富的经验。这本书不仅是团队友谊的见证,更是一本讲述Spark和机器学习的图书。我们希望将大家的思想汇总起来,编写成一本书,不仅将Spark机器学习代码和现实世界的数据集结合在一起,而且还提供与之相关的解释和参考资料,便于读者深入理解并开展进一步的研究。本书反映了团队在开始使用Apache Spark时所希望拥有的知识和技能。

我对机器学习和人工智能的兴趣始于20世纪80年代中期,当时有机会阅读了在1986年2月出版的《人工智能》(国际期刊,第28卷,第1期)上列出的两个重要工件。尽管对于我们这一代的工程师和科学家来说,这是一段漫长的旅程。但是弹性分布式计算、云计算、GPU、认知计算、最优化和机器学习的技术进步实现了科学家们数十年的梦想。所有这些进步的相关技术对于当今的机器学习爱好者和数据科学家都是可以获取和学习的。

我们生活在历史上的一个特殊时期,一个多种技术和社会学趋势融合在一起的时期。云计算的灵活性以及对内嵌的机器学习和深度学习网络的结合,将为创建和占领新市场提供全新的机会。Apache Spark是一种通用编程框架,也是一种近实时弹性分布式计算和数据虚拟化技术,它为众多的公司提供了机会,使人们可以大规模使用机器学习技术,而无须在专用数据中心或硬件上进行大量投资。

本书提供了Apache Spark机器学习API的全面解决方案,书中所选择的Spark组件示例不仅可以提供基础知识,还可以帮助掌握机器学习和Apache Spark的高级职业技能。本书在展示的时候力求清晰性和简洁,相关内容反映了作者团队的经验(包括阅读源代码)和Apache Spark(从Spark 1.0开始)的学习曲线。

本书通过实践者的视角介绍Apache Spark、机器学习和Scala,在学习的过程中,开发人员和数据科学家需要从实践者的角度出发,不仅需要理解代码,而且还必须了解细节、理论和内部工作原理,这样才能在新经济中谋求一个理想的职业。

本书提供可运行的Apache Spark机器学习代码片段,结合相关理论、参考资料、各类数据集,这种全新形式的攻略有助于读者理解Spark机器学习背后的内容、方法和原因。本书有助于读者了解Spark机器学习的基础,便于开发人员迅速掌握Apache Spark机器学习算法。

第1章介绍Apache Spark在机器学习和实际的编码开发环境中的安装和配置。首先,书中的屏幕截图用于下载、安装和配置Apache Spark和IntelliJ IDEA以及必要的库,这些配置会在开发人员的开发环境中生效。然后列出40多个真实世界数据集的数据存储库目录,这些数据可以帮助读者进一步尝试和改进代码片段。最后在Spark上运行第一个机器学习程序,此外还讲解如何在机器学习程序中添加图形,这些操作将在后续章节中使用。

第2章介绍Spark机器学习最核心的一个应用——线性代数(向量和矩阵)的使用。这一章会使用若干攻略阐述Apache Spark中DenseVector、SparseVector和矩阵工具的详细用法。这一章还提供关于单机(或本地)和分布式矩阵的攻略,包括RowMatrix、IndexedRowMatrix、CoordinateMatrix和BlockMatrix,这些攻略会详细阐述相关技术的用法。之所以有这一章,是因为只有通过逐行阅读大多数源代码、了解矩阵分解和向量/矩阵算术在Spark众多粗粒度算法中的运行机制,才能熟练掌握Spark、Spark ML和MLlib。

第3章提供有关Apache Spark弹性分布式数据操作和处理的端到端的数据处理机制。这一章从实践者的角度出发,提供了包括RDD、DataFrame和Dataset工具的详细攻略。本章一共有17个攻略(包括示例、参考资料和原理解释),这些攻略可以帮助读者在机器学习学科领域打下坚实的职业基础。本章之所以提供函数(代码)和非函数(SQL 接口)的编程方法,不仅是为了巩固相关知识,也是展示前沿公司Spark机器学习工程师的实际需求。

第4章包含16个简短且实用的代码攻略,这些攻略覆盖了大多数机器学习系统中常见的任务,读者可以在自己的实际系统中使用这些代码攻略。这一章涵盖了各种各样的技术,包括使用Spark ML/MLlib工具进行数据标准化到评估模型输出的最佳实践。在日常工作的大多数情况下,我们需要组合使用这些攻略,但是单独讲解每个攻略可以节省内容、降低其他攻略难度。

第5章是关于Apache Spark回归和分类的第一部分。这一章首先从广义线性模型(GLM)开始,再扩展到Spark中具有不同优化技术的Lasso和岭回归。然后,本章将介绍等渗回归、具有多层感知器(神经网络)的分类器和One-vs-Rest分类器的生存回归模型。

第6章是关于Apache Spark回归和分类的第二部分,主要讲解基于RDD的回归系统,包括Spark中使用随机梯度下降和L_BFGS优化机制的线性模型、逻辑回归、岭回归。本章的最后3个攻略会涉及支持向量机、朴素贝叶斯,还会包含Spark机器学习生态系统中常用的机器学习管道技术。

第7章使用Spark ML工具处理数据集和构建电影推荐引擎。在介绍Spark协同过滤技术之前,本章首先会研究一个大型数据集,还会使用一些额外攻略介绍如何绘图以进一步研究各种推荐技术。

第8章介绍无监督学习中使用的技术,例如KMeans、混合和期望最大化(EM)、幂迭代聚类(PIC)和潜在狄利克雷分配(LDA),同时还会深入讲解这些技术的原理以更好地帮助读者掌握这些核心概念。基于Spark Streaming,本章通过一个实时的KMeans聚类攻略讲解如何结合无监督聚类技术将输入流转为有标签的类别。

第9章是专门讲解机器学习中的最优化技术。这一章会从解析解和二次函数优化技术出发,再使用梯度下降技术从头到尾完整地解决一个回归问题。本章会同步涉及Scala编码技能,介绍如何编码和真正理解随机梯度下降算法。需要说明的是,Spark ML库中已经包含需要完整实现的API,可直接使用。

第10章介绍使用Spark机器学习库的树模型和集成模型处理分类和回归模型。针对3个现实中的数据集,分别使用决策树、随机森林和梯度提升树解决分类问题和回归问题。这一章会深入分析这些方法的背后原理,还会通过额外的章节逐步深入研究Apache Spark的机器学习库源码。

第11章描述了数据降维的艺术和科学思想,并提供一个完整Spark ML/MLLib库的使用案例,这个案例会涉及“大规模机器学习”这一重要概念。这一章首先充分和全面地讲解数据降维的概念,然后再使用两个Spark案例帮助读者加深理解。本章会涉及第2章提及的奇异值分解(SVD),同时也会深入剖析主成分分析。

第12章包含Spark技术在大规模文本分析领域的应用案例。本章首先包含一个比较全面的基本攻略,例如词频和相似度技术(如Word2Vec),然后使用真实的Spark机器学习技术分析海量的维基百科语料数据集。在这一章中,我们会深入探讨和编码实现Spark中的隐语义分析(LSA)和隐狄利克雷分配的主题模型。

第13章首先介绍一个Spark Streaming的入门指导攻略,然后讲述如何使用基于RDD和结构化的Streaming构建一个基准测试。本章会包含Spark全部已有的机器学习Streaming算法(在本书完成之时)。这一章会提供流式DataFrame和流式Dataset的代码和案例,还会涉及如何使用queueStream进行调试,以及如何使用流式KMeans和流式线性模型(例如使用现实数据集的线性和逻辑回归模型)。

请参考下面的详细软件列表。

读者如果想运行本书中的代码,需要Windows 7以及以上的系统,或者macOS 10,所需要的安装软件参考下方列出的软件。

在本书的代码示例中会包含这些软件所需要的硬件需求。

本书是为那些已经掌握了机器学习技术的Scala开发人员准备的,但缺乏Spark实践经验的读者。本书假定读者已经掌握机器学习算法的基础知识,并且具有使用Scala实现机器学习算法的一些实践经验。但是,读者无须了解Spark ML库和相关的生态系统。

在本书中,你会发现几个频繁出现的小标题(准备工作、操作步骤、工作原理、更多和参考资料),这是为了更好地描述一个攻略中的相关内容,我们使用下面几部分内容。

描述当前攻略所要讲述的内容,所需要的软件包,以及掌握攻略所需要的先验配置。

当前攻略每一步的详细步骤。

用于解释“操作步骤”中的各个步骤的详细原理。

这部分会包含一些额外的内容,读者通过这部分内容可以更好和更深入地掌握当前攻略。

提供当前攻略之外的一些有用的参考信息。

在本书中,你会发现有许多用以区分不同类型信息的文本样式。以下是这些样式的一些示例,并对其含义进行了解释。文本中的代码、数据库表名称、文件夹名称、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄如下所示:“Mac用户注意,Spark2.0的安装目录位于/Users/USERNAME/spark/spark-2.0.0-bin-hadoop2.7//”。

代码块如下所示:

object HelloWorld extends App {
   println("Hello World!")
 }

命令行输入或输出的编写方式如下:

mysql -u root -p

 

 

警告或重要提示。

 

 

 

 

提示和技巧。

 


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书提供配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可获取。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/ selfpublish/submission即可)。

如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


在本章,我们将涵盖以下内容:

随着集群计算的快速发展和大数据的兴起,机器学习领域已经被推到了计算的最前沿。长久以来,交互平台对大规模的数据科学来说一直是个遥不可及的梦,而现在已经变为一个现实。

有3个技术领域促进和加速了交互数据科学的发展。

首先,需要配置包含以下几个组件的开发环境:

本章会提供若干攻略详细讲解安装和配置IntelliJ IDE、Scala插件和Spark。在成功配置开发环境之后,接着会运行一个 Spark 机器学习示例代码,测试开发配置是否正确。

Apache Spark正在逐步成为大数据分析领域的事实平台和交流语言,并作为Hadoop范式的补充。Spark 让数据科学家能用最有效、适合的工作流进行工作,Spark 不需要使用MapReduce(MR)或将中间结果重复写入磁盘,而是使用完全分布式的方式来处理负载。

Spark通过统一的技术栈提供一个易于使用的分布式框架,使其成为无须迭代算法(来产生最终结果)的数据科学项目的首选平台。数据科学项目中的迭代算法由于内部的工作机制会产生大量的中间结果,这些中间结果需要在中间步骤从一个阶段转到下一个阶段。由于交互式工具需要一个健壮的本地分布式机器学习库(MLlib),因此大多数的数据科学项目会舍弃使用基于磁盘的方法。

Spark对集群计算使用不同的方法,它将问题的解决视作一个技术栈而非生态系统。大量集中式管理的库和支持容错数据结构的快速计算引擎,使得Spark成为替代Hadoop的大数据平台的首选。如图1-1所示,Spark采用模块化的方式进行组织。

图1-1

机器学习的目的是提供一些能够模仿人类智能,将传统依靠人脑才能解决的任务自动化处理的机器和设备。机器学习算法被设计在相对较短的时间内处理大量数据,并能得到近似答案,而这些工作在过去需要花费大量人力和处理时间。

机器学习领域可以划分为许多形式,高层次来说可以分为有监督学习和无监督学习。有监督学习算法是一类使用训练数据(有标签)计算概率分布或图模型的机器学习算法,可以在没有人为干预的情况下对一个新的数据点分类。无监督学习是一类可以从没有标签的输入数据集中获取推断知识的机器学习算法。

Spark 创造性地提供了一套丰富的机器学习算法,不需要较多编码即可应用在大数据上。图1-2的思维导图(可以从异步社区下载大图)描述了Spark的MLlib算法范围。Spark MLlib库利用了可并行、容错的分布式数据结构,这种数据结构称为弹性分布式数据集或RDD。

图1-2

Scala是一种现代化的编程语言,正在逐步替换传统编程语言(如Java和C++)。Scala基于Java虚拟机(JVM-based),语法简洁,没有传统模块化的代码特性,还融合了面向对象和函数式编程,正在成为一种非常清晰且非常强大的类型安全的语言。

Scala采用了灵活多变且富有表现力的方法,非常适合和Spark MLlib进行交互。事实上,Spark本身就是用Scala编写的,这一强有力的证据表明Scala语言是一个全方位的编程语言,可以被用来创建高性能需求的复杂系统。

Scala建立在Java的传统之上,但解决了Java的一些缺点,同时又没有全盘接受或全盘否定。Scala代码被编译为Java字节码,可以和丰富的Java类库交互共存。Scala可以使用Java类库的能力为软件工程师提供一个持续和丰富的环境,可以在不全部丢弃Java传统和代码的前提下构建现代和复杂的机器学习系统。

Scala全面支持丰富的函数式编程范式,支持lambda、柯里化、类型推断、不变性、延迟计算和模式匹配,和Perl类似,但没有神秘的语法。Scala支持线性代数数据类型、匿名函数、协方差、对数方差和高阶函数,非常适合用于机器学习编程。

下面是使用Scala编写的hello world程序:

object HelloWorld extends App {
   println("Hello World!")
 }

在Scala中,采用图1-3的方式来编译和运行Hello World程序。

图1-3

如图1-4所示,本书给开发人员提供了多学科的视图,侧重于机器学习、Apache Spark和 Scala 的交集和统一。这一章提供额外的攻略讲解如何配置和运行开发人员所熟悉的综合开发环境,还会介绍如何在没有现代化IDE工具的情况下使用交互式界面运行代码片段。

图1-4

表1-1列出了本书所涉及的软件版本和使用类库的详细信息。如果读者依据本章所提及的说明要求进行操作,那么所需要的大部分软件包都会包含在表1-1中。特定攻略所需要的Jar或类文件,会在对应的章节提供额外的安装说明。

表1-1

核心系统

版本

Spark

2.0.0

Java

1.8

IntelliJ IDEA

2016.2.4

Scala-sdk

2.11.8

可能需要的其他Jar如表1-2所示。

表1-2

各种Jar

版本

bliki-core

3.0.19

breeze-viz

0.12

Cloud9

1.5.0

Hadoop-streaming

2.2.0

JCommon

1.0.23

JFreeChart

1.0.19

lucene-analyzers-common

6.0.0

Lucene-Core

6.0.0

scopt

3.3.0

spark-streaming-flume-assembly

2.0.0

spark-streaming-kafka-0-8-assembly

2.0.0

此外,我们还在Spark 2.1.1环境中测试了本书所有章节的程序代码,执行结果符合预期。如果是出于学习目的,那么建议使用表1-1和表1-2中列出的软件版本和类库。

为了和快速变化的Spark设计和文档保持一致,本书提及的Spark API参考链接是指最新版本的Spark 2.x.x,但具体章节中的API参考资料会明确说明针对Spark 2.0.0。

本书提及的所有Spark文档均指Spark网站的最新文档,如果读者倾向于查阅特定版本的Spark文档(如Spark 2.0.0),那么需要在Spark网站上查阅相应版本的文档。

考虑到本书的目的是清晰阐述Spark机器学习的用法,而不是展示Scala的高级特性,所以本书对代码做了简化处理。

首先下载Scala和Spark开发所需要的JDK。

访问Oracle官网,下载和安装指定版本的JDK。

下载成功之后,按照屏幕上的说明指南安装JDK。

IntelliJ社区版本是一个适用于Java SE、Groovy、Scala和Kotlin的轻量级IDE。配置Spark机器学习开发环境,需要安装IntelliJ IDE。

访问jetbrains网站,下载和安装IntelliJ。

在编写本书时,测试示例代码所用的IntelliJ版本是15.x或更新(如版本2016.2.4),不过读者也可以自由使用最新版本,如图 1-5 所示。文件下载之后,双击下载文件(.exe),开始安装IDE。如果不想做任何的改变,则将安装选项设置为默认值,并按照屏幕上的指引说明完成安装。

图1-5

访问Spark网站,下载和安装Spark。

访问Apache网站,如图1-6所示,勾选参数并下载指定版本Spark。

图1-6

确保接受默认选项(单击“下一步”),继续安装。

在运行Spark示例代码或本书的其他程序之前,需要配置一些参数确保IntelliJ设置正确。

在配置项目结构和全局库时,读者需要特别仔细。一旦完成所有设置之后,接着运行Spark机器学习示例代码以检查是否正确设置。示例代码可以在Spark目录下找到,也可以下载包含示例的Spark源码。

图1-7是针对Spark MLlib和运行Spark机器学习代码(examples目录)的IntelliJ的配置,示例代码位于Spark的home目录下。我们继续使用Scala示例进行演示。

1.依据图1-7所示,单击“Project Structure”,对项目结构进行设置。

图1-7

2.核对“Project Structure”选项卡上的信息,如图1-8所示。

图1-8

3.配置“Global Libraries”,将Scala SDK作为Global Library,如图1-9所示。

图1-9

4.选择最新的Scala SDK的Jar文件,单击“OK”完成下载,如图1-10所示。

图1-10

5.选择项目名称,如图1-11所示。

图1-11

6.确认设置项和其他类库是否正确,如图1-12所示。

图1-12

7.添加依赖的Jars。在“Project Structure”左侧窗口选择“Modules”,按照图1-13所示单击“Dependencies”,并选择所需要的Jar文件。

图1-13

8.选择Spark提供的Jar文件:选择Spark默认安装目录,并选择lib目录,如图1-14所示。

图1-14

9.选择专为Spark提供的Jar示例文件,如图1-15所示。

图1-15

10.选择和导入的所有Jar文件位于左侧窗格的“External Libraries”目录下,同时检查所导入的Jar文件是否正确,如图1-16所示。

图1-16

11.Spark 2.0使用Scala 2.11,运行示例程序还需要两个新的streaming Jar文件:Flume和Kafka,从Maven仓库可以下载得到。

下一步是下载和安装Flume和Kafka的Jar文件,如图1-17所示。

图1-17

12.下载和安装Kafka组件,如图1-18所示。

图1-18

13.下载和安装Flume组件,如图1-19所示。

图1-19

14.所有Jar文件下载完成之后,将所有Jar文件移动到Spark的jars目录中,本书选择C盘安装Spark,如图1-20所示。

图1-20

15.打开IDE,按照图1-21所示,检查左侧的“External Libraries”目录下的所有Jar文件是否都已正确配置。

图1-21

16.单击build菜单栏,对Spark示例项目执行build操作,确认设置成功,如图1-22所示。

图1-22

17.检查build操作是否成功,如图1-23所示。

图1-23

如果选用Spark 2.0之前的版本,那么需要Google的类库Guava提供I/O和表定义方法,以实现在集群中广播数据。由于存在难以解决的依赖问题,Spark 2.0不再使用Guava类库。如果需要使用Spark 2.0之前的版本(如1.5.2版本),Guava类库可以从GitHub的Guava项目下载得到。

如果读者需要使用Guava 15.0,可以从Maven仓库下载。

如果读者按照前述内容进行安装,请确保从已有的Jar文件中移除Guava类库。

在安装完成过程中需要的其他第三方类库或Jar文件,都可以从Maven仓库中下载得到。

这个攻略介绍一种检查IntelliJ是否正确配置的方法:下载Spark源码中的示例代码,并导入IntelliJ运行。

首选运行示例中的逻辑回归代码检查相关的安装配置是否正确。在下一节,会继续将这个程序扩展为适合特定需求的版本代码,输出程序结果能够更好地理解工作机制。

1.进入源码目录,挑选其中的一个机器学习示例代码运行,这里选择逻辑回归示例。

 

小技巧

如果在目录下无法找到源代码,可以直接下载Spark源码,解压缩就可以得到相应的示例代码。

 

2.按照图1-24所示,选择对应的示例代码,再选择“Edit Configurations”菜单。

图1-24

3.如图1-25所示,在“Configurations”选项卡中,选择如下选项。

图1-25

4.按照图1-26所示,点击“Run 'LogisticRegressionExample”运行逻辑回归。

图1-26

5.检查程序的退出代码,确保和图1-27所显示的一致。

图1-27

之前为机器学习项目寻找一个合适的数据非常具有挑战性,然而现在有大量适合机器学习的公开数据源。

除了大学和政府的资源外,还有许多其他开源数据可用于学习、编写自己的示例和项目。本节尽可能列出能获取到的数据集来源列表,同时展示如何更好地获取和下载每一章的数据集。

下面是开源数据集列表,如果想开发对应领域的应用,那么这些数据非常值得下载。

机器学习的其他数据集。

还有一些可能感兴趣的专业数据集(例如文本挖掘领域的西班牙数据、基因数据和IMF数据)。

在前面已经讲解了如何配置Spark 2.0开发环境,通过这个攻略可以进一步熟悉编译和运行示例代码,示例的各个步骤和详细内容将在后续章节进行讲解。

针对Spark 2.0编写个性化的程序,检查输出结果以更好地理解程序的工作原理。强调一下,这个攻略只是一个使用Scala语法糖的简单RDD程序,通过运行这个程序可以检查配置环境是否正确,以便后续编写更复杂的攻略。

1.使用 IntelliJ 或其他所喜欢的 IDE 创建一个新项目。检查是否包含必要的 Jar文件。

2.下载本书中的示例代码,找到myFirstSpark20.scala文件,将其放在下面的目录下。

在Windows环境下,Spark 2.0安装在C盘根目录的spark-2.0.0-bin-hadoop2.7目录下。

3.myFirstSpark20.scala存放的目录位置如图1-28所示。

图1-28

4.创建程序所在的package目录:

package spark.ml.cookbook.chapter1

5.导入SparkSession上下文访问集群所需的依赖包,减少Spark的输出数据:

import org.apache.spark.sql.SparkSession
import org.apache.log4j.Logger
import org.apache.log4j.Level

6.设置日志输出级别为ERROR,减少Spark日志输出:

Logger.getLogger("org").setLevel(Level.ERROR)

7.使用Builder模型,指定配置项初始化SparkSession,作为访问Spark集群的入口:

val spark = SparkSession
.builder
.master("local[*]")
 .appName("myFirstSpark20")
.config("spark.sql.warehouse.dir", ".")
.getOrCreate()

myFirstSpark20对象将运行在本地模型下。前面几个步骤中的代码块是创建SparkSession对象的典型方法。

8.创建一个数组变量:

val x =
Array(1.0,5.0,8.0,10.0,15.0,21.0,27.0,30.0,38.0,45.0,50.0,64.0)
val y =
Array(5.0,1.0,4.0,11.0,25.0,18.0,33.0,20.0,30.0,43.0,55.0,57.0)

9.在前述数组基础上,创建两个Spark RDD:

val xRDD = spark.sparkContext.parallelize(x)
val yRDD = spark.sparkContext.parallelize(y)

10.继续对上面的RDD进行操作,zip()函数将在上面2个RDD基础上创建一个新的RDD:

val zipedRDD = xRDD.zip(yRDD)
zipedRDD.collect().foreach(println)

在运行时,将看到控制台输出下面消息(关于IntelliJ如何运行的详细信息将在后续步骤讲解),如图1-29所示。

图1-29

11.对xRDD和yRDD求和,对zipedRDD求和。同时,求zipedRDD记录数目。

val xSum = zipedRDD.map(_._1).sum()
val ySum = zipedRDD.map(_._2).sum()
val xySum= zipedRDD.map(c => c._1 * c._2).sum()
val n= zipedRDD.count()

12.在控制台上,打印前面计算的结果值:

println("RDD X Sum: " +xSum)
println("RDD Y Sum: " +ySum)
println("RDD X*Y Sum: "+xySum)
println("Total count: "+n)

下面是控制台输出结果,如图1-30所示。

图1-30

13.停止SparkSession,关闭程序:

spark.stop()

14.当整个程序完成之后,IntelliJ项目浏览器中myFirstSpark20.scala文件的布局如图1-31所示。

图1-31

15.确保没有编译错误。如果发现问题,可以rebuild进行检查,如图1-32所示。

图1-32

如果rebuild成功,在控制台上会出现构建成功的消息,如图1-33所示。

图1-33

16.在“项目浏览器”中选中myFirstSpark20文件运行程序,在弹出的内容菜单选项中选择“Run myFirstSpark20”,如图1-34所示。

图1-34

此外,也可以选择菜单栏中的“运行”菜单执行相同的操作。

17.程序成功执行之后,能看到以下的消息:

Process finished with exit code 0

图1-35展示了相应的输出消息。

18.Mac用户使用IntelliJ时可以菜单上执行相同的操作,需要注意将代码放在正确的路径下。

图1-35

在这个例子中,在myFirstSpark20.scala文件中编写第一个Scala程序,展示在IntelliJ中的执行步骤。对于Windows和macOS,需要将代码放在各自对应的正确路径下。

在myFirstSpark20.scala代码中,展示了创建SparkSession的典型方法、本地模型下使用master函数配置和运行程序。根据数组对象创建两个RDD对象、使用zip函数创建一个新的RDD。

此外,对创建的RDD计算求和,在控制台上展示了计算结果。最后,调用spark.stop()退出程序和释放资源。

Spark安装文件可以从Spark网站下载,关于RDD的文档也可以在Spark网站的“编程指南”栏目获取到。

对于JetBrain IntelliJ的更多信息可以翻阅jetbrains的官网文档。

在这个攻略中,我们将讨论如何使用JFreeChart在Spark 2.0程序中添加图表。

1.安装JFreeChart库,JFreeChart的Jar文件可以在sourceforge网站上下载得到。

2.从图1-36可知本书中的JFreeChart版本为1.0.1。

图1-36

3.下载zip文件并解压。将zip文件解压到Windows的C盘下,并在解压的目录下找到lib目录。

4.找到所要的两个 Jar 类库(JfreeChart 需要 JCommon):JFreeChart-1.0.19.jar 和JCommon-1.0.23,如图1-37所示。

图1-37

5.将前面的两个Jar文件拷贝到图1-38所示的目录下。

图1-38

6.正如前面安装章节中所述,这个目录是IntelliJ项目设置的类路径。

7.使用IntelliJ或其他喜欢的IDE创建一个新项目,确保已经包含必要的Jar文件。

8.下载本书中的示例代码,找到MyChart.scala,将代码放在相应的目录下。

9.在Windows环境下,Spark 2.0安装在C盘的spark-2.0.0-bin-hadoop2.7目录下,将MyChart.scala代码放在整个示例代码的chapter1目录下。

10.创建程序所需的package目录:

package spark.ml.cookbook.chapter1

11.导入一些必要的软件包并通过SparkSession访问集群,导入log4j.Logger减少Spark日志输出。

12.导入JFreeChart包用于绘图:

import java.awt.Color
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
import org.jfree.chart.plot.{PlotOrientation, XYPlot}
import org.jfree.chart.{ChartFactory, ChartFrame, JFreeChart}
import org.jfree.data.xy.{XYSeries, XYSeriesCollection}
import scala.util.Random

13.设置日志输出级别为ERROR,减少Spark日志输出:

Logger.getLogger("org").setLevel(Level.ERROR)

14.使用Builder模型,指定配置项初始化一个SparkSession作为访问Spark集群的访问入口。

val spark = SparkSession
  .builder
  .master("local[*]")
  .appName("myChart")
  .config("spark.sql.warehouse.dir", ".")
  .getOrCreate()

15.myChart对象运行在本地模型,前面的代码块是创建SparkSession对象的典型方式。

16.根据随机数字和对应的索引,使用zipWithIndex函数创建一个RDD。

val data = spark.sparkContext.parallelize(Random.shuffle(1 to
15).zipWithIndex)

17.将RDD的结果打印在控制台上:

data.foreach(println)

下面是控制台的输出结果,如图1-39所示。

图1-39

18.创建数据Series,提供给JFreeChart展示使用:

val xy = new XYSeries("")
data.collect().foreach{ case (y: Int, x: Int) => xy.add(x,y) }
val dataset = new XYSeriesCollection(xy)

19.使用JFreeChart的ChartFactory方法创建一个chart对象,设置基本的参数:

val chart = ChartFactory.createXYLineChart(
  "MyChart",  // chart title
  "x",               // x axis label
  "y",                  // y axis label
  dataset,                  // data
  PlotOrientation.VERTICAL,
  false,                    // include legend
  true,                     // tooltips
  false                     // urls
)

20.根据chart对象创建一个plot对象,用于后续图表展示:

val plot = chart.getXYPlot()

21.配置plot:

configurePlot(plot)

22.configurePlot函数定义如下,该函数为图表配置了一些基本的配色方案:

def configurePlot(plot: XYPlot): Unit = {
  plot.setBackgroundPaint(Color.WHITE)
  plot.setDomainGridlinePaint(Color.BLACK)
  plot.setRangeGridlinePaint(Color.BLACK)
  plot.setOutlineVisible(false)
}

23.展示chart:

show(chart)

24.show函数定义如下,它包含了一个标准的基于框架的图形显示功能:

def show(chart: JFreeChart) {
  val frame = new ChartFrame("plot", chart)
  frame.pack()
  frame.setVisible(true)
}

25.一旦图表show函数成功执行,将弹出图1-40所示的图表。

图1-40

26.对SparkSession函数调用stop函数关闭程序:

spark.stop()

在这个示例代码中,编写MyChart.scala文件,学习IntelliJ执行程序的步骤。根据Windows和Mac OS的不同,将代码置于对应的目录下。在代码中可以看到创建SparkSession对象的典型方法,以及如何使用master()函数。通过zip函数根据将数字1~12与对应的索引创建一个包含Array的RDD。

使用JFreeChart构建一个包含x和y坐标轴的基本chart,使用前述步骤中创建的原始RDD作为数据源,将其应用到chart上。

设置chart模式,调用JFreeChart的show()函数在xy轴的线性图表中展示结果。

最后,调用spark.stop()来退出和释放资源。

关于JFreeChart的更多信息可以在JFree网站查阅得到。

有关JFreeChart特性和功能的其他示例,可以在JFree网站下载得到。


相关图书

ChatGPT原理与应用开发
ChatGPT原理与应用开发
动手学机器学习
动手学机器学习
基于机器学习的个性化推荐算法及应用
基于机器学习的个性化推荐算法及应用
机器学习与数据挖掘
机器学习与数据挖掘
机器学习公式详解 第2版
机器学习公式详解 第2版
自然语言处理迁移学习实战
自然语言处理迁移学习实战

相关文章

相关课程