精通Spark数据科学

978-7-115-54156-7
作者: 安德鲁·摩根(Andrew Morgan)
译者: 柯晟劼刘少俊
编辑: 胡俊英
分类: Spark

图书目录:

详情

Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。这是一本专门介绍Spark的图书,旨在教会读者利用Spark构建实用的数据科学解决方案。 本书内容包括14章,由浅入深地介绍了数据科学生态系统、数据获取、输入格式与模式、探索性数据分析、利用Spark进行地理分析、采集基于链接的外部数据、构建社区、构建推荐系统、新闻词典和实时标记系统、故事除重和变迁、情感分析中的异常检测、趋势演算、数据保护和可扩展算法。 本书适合数据科学家以及对数据科学、机器学习感兴趣的读者阅读,需要读者具备数据科学相关的基础知识,并通过阅读本书进一步提升Spark运用能力,从而创建出高效且实用的数据科学解决方案。

图书摘要

版权信息

书名:精通Spark数据科学

ISBN:978-7-115-54156-7

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

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

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

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

著    [美]安德鲁·摩根(Andrew Morgan)

     [英]安托万·阿门德(Antoine Amend)

     [英]大卫·乔治(David George)

     [英]马修·哈利特(Matthew Hallett)

译    柯晟劼 刘少俊

责任编辑 胡俊英

人民邮电出版社出版发行  北京市丰台区成寿寺路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 Mastering Spark for Data Science.

All rights reserved.

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

版权所有,侵权必究。


Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。这是一本专门介绍Spark的图书,旨在教会读者利用Spark构建实用的数据科学解决方案。

本书内容包括14章,由浅入深地介绍了数据科学生态系统、数据获取、输入格式与模式、探索性数据分析、利用Spark进行地理分析、采集基于链接的外部数据、构建社区、构建推荐系统、新闻词典和实时标记系统、故事除重和变迁、情感分析中的异常检测、趋势演算、数据保护和可扩展算法。

本书适合数据科学家以及对数据科学、机器学习感兴趣的读者阅读,需要读者具备数据科学相关的基础知识,并通过阅读本书进一步提升Spark运用能力,从而创建出高效且实用的数据科学解决方案。


当前,大数据分析是一个广受关注的技术领域,大数据无法在一定时间范围内用常规软件工具进行采集、管理和分析处理,我们需要更强大的平台才能具备更强的决策力、洞察力和流程优化能力。而Spark就是满足这种需求的一款优秀的大数据统一分析引擎,它速度快、易使用、通用性强,可以在不同的平台(Hadoop、Apache Mesos、Kubernetes、单节点或云平台)上运行。

本书是一部专门介绍Spark的著作,你能从中学习到Spark API的核心内容并掌握如何应用框架中的库,但本书并不局限于讲解Spark框架本身,而是致力于深入研究如何使用Spark来提供生产级的数据科学解决方案。作者们凭借丰富的数据科学业界经验,为我们指出大数据实战需要注意的技巧和初学者容易陷入的各种“坑”。本书让我们了解在不同的用户场景下,如何用Spark实现数据处理全流程。本书有丰富的示例代码,通过阅读本书,读者会获益良多,并能够应对常见的大数据分析场景。

在这里,要特别感谢福州外语外贸学院,因为本书受福州外语外贸学院著作基金支持,并作为省级一流专业建设点——物流专业新文科工作的建设成果。还要感谢人民邮电出版社胡俊英编辑专业、细心地审核本书,与她合作很轻松、很开心。

此外,由于译者水平有限,书中难免有欠妥之处,如有任何意见和建议,请不吝告知,我们将感激不尽。我们的邮箱分别是18150095612@189.com和liusj@fjinfo.org.cn。

译者

在这里,特别感谢福建省科学技术信息研究所教授级高级工程师方延风以及福州外语外贸学院经管学院副院长刘丹的热心帮助。

——柯晟劼

我要感谢我的妻子张梅在翻译过程中的大力支持与帮助。还要感谢刘一宁小朋友,虽然在本书的翻译过程中,她已经学会跑进书房说“爸爸不要坐在电脑前面工作,来陪我玩!”——让我的翻译周期变长了一点点。但她的笑声却是我工作的无穷动力!

——刘少俊


柯晟劼 日本东京海洋大学流通情报(信息)研究室应用环境系统学博士,福州外语外贸学院经管学院副教授,任教管理信息系统、数据分析等多门课程。近年研究方向为深度学习技术在跨境电商领域的应用。与跨境电商企业合作,基于企业经营数据、企业供应商报价数据及电子商务平台大数据等,开发了多个物流方案优化、产品市场分析等相关系统。主要翻译了第2、4、6、8、10、12、13章的内容。

刘少俊 工程师,任职于福建省科学技术信息研究所。毕业于东北师范大学,获得计算机软件与理论理学硕士学位。目前的研究方向是信息抽取、数据分析、知识组织等。主要翻译了第1、3、5、7、9、11、14章的内容。


Spark对数据科学领域的影响令人震惊,Spark已然成为大数据架构的全能内核。Spark 1.0发布之时,我们就将其作为巴克莱的核心技术之一,这在当时被认为是一个大胆(抑或鲁莽)的举动。而现在,Spark已被认定为开展大数据科学项目的基础工具。

随着数据科学作为一项活动和一个公认的术语发展普及,人们对“独角兽数据科学家”(unicorn data scientist)的讨论也日益增多。独角兽数据科学家既精通数学又擅长编程,简直令人惊叹。显然,这种人才很难找到,要留住更难。我的团队更多考虑的是以下3个数据科学技能:模式识别、分布式计算和自动化。如果说数据科学是研究从生产的数据中获取见解,那么你需要从一开始就能够利用这3个技能来开发数据应用。使用无法随数据进行扩展的机器学习方法,或者构建需要重新编码才能达到生产质量的分析内核,都毫无意义!我们需要一位独角兽数据科学家或者一个独角兽数据科学团队(我倾向于此)来做这项工作。

Spark就是“独角兽技术”。没有任何一种语言可以像 Spark那样,不仅可以优雅地表达分析概念、毫不费力地将数据规模扩展到大数据,而且可以自然产出产品级别的代码(利用Scala API)。通过Spark,我们用几行代码就可以组建一个模型;在集群上运行与笔记本电脑上的测试代码完全相同的代码;构建稳定的、经过单元测试的、可以在关键业务用例中运行的JVM应用。Scala函数式编程与Spark抽象的结合具有独特、强大的功能,这是过去3年我们团队取得成功的重要因素。

Spark在数据科学领域的应用非常强大,但相关的教程或图书却比较少,我们能搜索到的往往也仅限于对Spark API和库的介绍性资料。你很难或压根找不到有关Spark如何适应广泛的架构,或者如何可持续地管理数据ETL的相关资料。

在阅读本书时,你会发现本书采用的实践方法与其他的书截然不同。本书的每一章都是一项新的挑战,每一章的阅读过程都是一次全新的探索之旅,结果只有经过探索才可获知。本书从一开始就清楚地阐述了正确开展数据科学的重要意义。这是一本为有实践需求的人而编写的Spark教程,这些人想要从事确实会对他们的工作产生实质影响的数据科学工作。希望你们喜欢这本书。

——哈里 · 鲍威尔(Harry Powell)

巴克莱银行高级分析主管


安德鲁·摩根(Andrew Morgan)是数据战略及其执行方面的专家,在支持技术、系统架构和实现数据科学方面拥有丰富的经验。他在数据行业拥有20多年的经验,曾为一些久负盛名的公司及其全球客户设计系统——通常是大型、复杂和国际性的项目。2013年,他创办了数据科学和大数据工程咨询公司ByteSumo,目前在与欧洲和美国的客户进行合作。Andrew是一位活跃的数据科学家,也是趋势演算(TrendCalculus)算法的发明者。该算法是他为自己的研究项目而开发的,该项目旨在研究基于机器学习的长期预测,这些预测可以在不断变化的文化、地缘政治和经济趋势中发现规律。他还是Hadoop Summit EU数据科学委员会的成员,并在许多会议上就各种数据主题发表过演讲。他也活跃于他的居住地伦敦的数据科学和大数据社区。

谨以本书献给我的妻子Steffy、我的孩子Alice和Adele,以及我所有的朋友和同事,感谢他们一直支持着我。这本书也是为了纪念我在多伦多大学学习时的第一位导师——Ferenc Csillag教授。早在1994年,Ferko就用未来愿景激励我:我们可以使用全球范围的数据集和复杂算法来监测和优化周遭的世界。这是一个改变我人生的信念,关于用大数据科学拯救世界的梦想,我仍在追寻。

安托万·阿门德(Antoine Amend)是一位对大数据工程和可扩展计算充满热情的数据科学家。这本书的主题是“折腾”天文数字量级的非结构化数据以获得新的见解,这主要源于Antoine的理论物理学背景。他于2008年毕业并获得天体物理学硕士学位。在Hadoop的早期阶段,在大数据的概念普及之前,他曾在瑞士的一家大型咨询公司工作。从那时起,他就开始接触大数据技术。现在他在巴克莱银行担任网络安全数据科学部门的主管。通过将科学方法与核心IT技能相结合,Antoine连续两年获得了在得克萨斯州奥斯汀举行的大数据世界锦标赛决赛资格。他在2014年和2015年都名列前12位(超过2 000多名竞争对手),这两次比赛中他还使用了本书介绍的方法和技术赢得了创新奖。

我要感谢我的妻子伴我同行,她一直是我不断增进知识和推动事业发展的动力。另外,还要感谢我的孩子们,他们教会我如何在必要时放松心情并获得新的想法。

我要感谢同事们,特别是Samuel Assefa博士、Eirini Spyropoulou博士和Will Hardman,他们耐心倾听我的“疯狂”理论。还要感谢过去几年有幸与之合作的其他人。最后,我想特别感谢以前的经理和导师,他们帮助我在数据科学的职业生涯中顺利发展,谢谢Manu、Toby、Gary和Harry。

大卫·乔治(David George)是一位杰出的分布式计算专家,拥有超过15年的数据系统从业经验,主要服务于全球闻名的IT咨询机构和品牌。他很早以前就开始使用Hadoop核心技术,并做过大规模的实施。David总是采用务实的方法进行软件设计,并重视简约中的优雅。

如今,他继续作为首席工程师为金融行业客户设计可扩展的应用,并满足一些较为严苛的需求。他的新项目侧重于采用先进的人工智能技术来提高知识产业的自动化水平。

本书献给Ellie、Shannon、Pauline和Pumpkin等人,此处无法一一列出了!

马修 · 哈利特(Matthew Hallett)是一名软件工程师和计算机科学家,拥有超过15年的从业经验。他是一名面向对象的“专家级程序员”和系统工程师,拥有丰富的底层编程范式知识。在过去的几年里,他在Hadoop和关键业务环境中的分布式编程方面积累了丰富的专业知识,这些环境由数千节点的数据中心组成。Matthew在分布式算法和分布式计算体系结构的实施方面拥有多种语言的咨询经验,目前是“四大审计公司”数据科学与工程团队的数据工程师顾问。

感谢Lynnie的理解和支持,让我有时间在深夜、周末和假期写这本书。也感谢Nugget让本书变得有价值。

还要感谢Gary Richardson、David Pryce博士、Helen Ramsden博士、Sima Reichenbach博士和Fabio Petroni博士提供的宝贵建议和指导,这些建议和指导为本书的完成提供了帮助——如果没有他们的帮助和贡献,这本书可能永远无法完成!


素密·帕尔(Sumit Pal)曾在Apress出版社出版过SQL on Big Data——Technology, Architecture and Innovations一书。他在软件行业有20多年的从业经验,曾服务于初创企业和大型企业,并担任过不同的角色。

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

在20多年的职业生涯中,Sumit曾在Microsoft(SQL Server开发团队)、Oracle(OLAP开发团队)和Verizon(大数据分析团队)等公司工作过。目前,他为多个客户提供数据架构方面和大数据解决方案方面的咨询,并使用Spark、Scala、Java和Python等进行编程。

Sumit曾在波士顿、芝加哥、拉斯维加斯和温哥华等地举办的大数据会议上做过演讲,并于2016年10月在Apress出版社出版了相关主题的书。

他使用大数据和NoSQL数据库等技术,在跨技术栈构建可扩展系统方面有丰富的经验,这些系统涵盖了从中间层、数据层到用于分析应用的可视化层等多个层。Sumit在数据库内部、数据仓库、维度建模,以及用Java、Python和SQL实现数据科学等方面拥有深厚的专业知识。

1996年,Sumit在微软开始了他的职业生涯,他是SQL Server开发团队的一员。然后,他在马萨诸塞州的伯灵顿作为Oracle公司的核心服务器工程师加入OLAP开发团队。

Sumit还曾在Verizon担任大数据架构副总监,他为各种分析平台、解决方案以及机器学习应用程序制定战略,进行管理,设计架构和开发。

Sumit还担任过ModelN/LeapFrogRX(2006—2013年)的首席架构师,使用J2EE标准的开源OLAP引擎(Mondrian)构建了中间层核心分析平台,并解决了一些复杂维度ETL、建模和性能优化等方面的问题。

Sumit还拥有计算机科学硕士和理学学士学位。

Sumit于2016年10月徒步攀登至珠穆朗玛峰大本营。


数据科学的目标是利用数据改变世界,而这个目标主要是通过打乱和改变实际行业中的流程来实现的。要在这个层面上操作,我们需要建立实用的数据科学解决方案,这种方案能解决真正的问题,能可靠地运行,能让人们信任并采取相应的行动。

本书介绍了如何使用Spark来提供生产级的数据科学解决方案,使之具有足够的创新性、颠覆性和可靠性,并值得信赖。在写这本书的时候,作者试图提供一个“超越传统指导教程”风格的作品:不仅提供代码的例子,而且拓展了技术和思维方法。你要像专业人员那样去探索内容;正如他人所言,“内容为王”!读者会注意到本书着重于新闻分析,偶尔也引入其他数据集,如Twitter数据集。这种对新闻数据的强调不是偶然的,是因为作者一直关注全球范围内的数据集。

本书致力于解决的隐含问题是:缺乏数据,以至于无法提供人们如何以及为什么做出决策的背景信息。通常,可直接访问的数据源非常关注问题的细节,因此,要想了解人们做出决策的依据就需要更广泛的数据集。

思考一个简单的例子,网站用户的关键信息(如年龄、性别、位置、购物行为、订单等)都是已知的,我们可以使用这些数据,根据人们的购物习惯和喜好来进行推荐。

但要想更进一步,就需要更多的背景数据来解释人们为什么会这样做。新闻报道称,一场巨大的大西洋飓风正在逼近佛罗里达海岸线,可能在36小时内到达海岸,这时我们应该推荐人们可能需要的产品,如支持USB的电池组,用于手机充电,还有蜡烛、手电筒、净水器等。通过了解决策的背景,我们可以进行更好的科学研究。

本书提供配套代码,而且在许多情况下这些代码是独一无二的实现。本书深入研究掌握数据科学所需要的技术和技能,其中一些经常被忽视或根本不被考虑。作者拥有多年的商业经验,充分利用自己丰富的知识体系,为大家呈现了一个真实的、令人兴奋的数据科学世界。

第1章:数据科学生态系统。这一章介绍处理大规模数据的方法和大数据生态系统。它侧重于讲解在后面章节中使用的数据科学工具和技术,并介绍环境以及如何正确地配置环境。此外,它还介绍与整体数据架构相关的一些非功能性注意事项。

第2章:数据获取。一名数据科学家最重要的任务之一是准确地将数据加载到数据科学平台上。我们不需要不受控制、临时组织的流程,这一章介绍如何在Spark中构建通用的数据采集管道,这些管道作为许多输入数据馈送流中的可重用组件。

第3章: 输入格式与模式。这一章演示如何将数据从原始格式加载到不同的模式,从而能在相同的数据上执行各种不同类型的分析。考虑到这一点,我们将研究数据模式易于理解的领域,涵盖传统数据库建模的关键领域,并解释一些基础原则仍适用于Spark的原因。此外,在训练Spark技能的同时,我们将分析GDELT数据集,并展示如何以高效和可扩展的方式存储这个大型数据集。

第4章:探索性数据分析。一个常见的误解是EDA仅能用于发现数据集的统计属性,和提供关于如何运用数据集的见解。实际上,这种看法非常片面。完整的EDA将改变这种看法,并包含对“在生产中使用此数据流的可行性”的详细评估。同时它还要求我们了解如何为数据集指定工业级的数据加载方法,这种方法可能在“熄灯模式”下运行多年。本章使用“数据剖析”技术提供一种进行数据质量评估的快速方法,这种方法能加快整个进程。

第5章:利用Spark进行地理分析。地理处理是Spark强有力的使用案例之一,这一章将演示如何入门地理处理。这一章的目标是说明数据科学家如何使用Spark处理地理数据,并在非常大的数据集上生成强大的、基于地图的视图。我们演示如何通过集成GeoMesa的Spark轻松处理时空数据集,这有助于将Spark转变为复杂的地理处理引擎。这一章还涉及利用这些时空数据将机器学习应用于预测油价。

第6章:采集基于链接的外部数据。这一章旨在解释一种通用的模式,通过URL或API(如GDELT和Twitter)找到外部内容来增强本地数据。我们提供一个使用GDELT新闻索引服务作为新闻来源的教程,演示如何建立一个全网规模的新闻扫描器,用来从互联网上采集感兴趣的全球突发新闻。我们进一步阐述如何使用专业的Web采集组件克服因规模的扩大而引发的挑战。

第7章:构建社区。这一章旨在解决数据科学和大数据中的常见用例。随着越来越多的人互动、交流、交换信息,或者仅是在不同的主题上分享共同兴趣,整个世界就可以用一个图来表示。数据科学家必须能够在图结构上发现社区,找到主要参与者,并检测可能的异常。

第8章:构建推荐系统。如果要选择一个算法向公众展示数据科学,推荐系统肯定会被选中。如今,推荐系统随处可见,其流行的原因是它们良好的通用性、实用性和广泛适用性。在本章中,我们将演示如何使用原始音频信号推荐音乐内容。

第9章:新闻词典和实时标记系统。虽然分层数据仓库将数据存储在文件夹里的文件中,但典型的基于Hadoop的系统仍依赖扁平架构来存储数据。如果没有适当的数据管理或对全部数据内容的清晰理解,那“数据湖”就将不可避免地变成“沼泽”。在沼泽中,像GDELT这样的有趣数据集只不过是一个包含大量非结构化文本文件的文件夹。在这一章中,我们将描述一种以非监督方式和近实时方式标记输入GDELT数据的创新方法。

第10章:故事除重和变迁。在这一章中,我们对GDELT数据库进行重复数据消除并建立索引将其转换为故事,然后随着时间的推移跟踪故事并了解它们之间的联系、它们可能如何变异,以及它们在不久的将来是否会引发后续事件。本章的核心是Simhash的概念,它用于检测近似重复以及利用随机索引建立向量以降低维度。

第11章:情感分析中的异常检测。2016年较为引人注目的事件可能是美国总统选举及其最终结果——唐纳德·特朗普当选总统。这场选举将长期被人们铭记,尤其是它史无前例地使用了社交媒体,并且唤起了用户的激情,大多数人都使用社交媒体来表达自己的感受。在这一章中,我们不会试图预测结果本身,而是将目标放在使用实时Twitter馈送来检测在美国大选期间的异常推文。

第12章:趋势演算。早在数据科学家流行研究“什么是趋势”的概念之前,数据科学还没有很好地解决一个老问题:趋势。目前,对趋势的分析主要由人们的“注视”时间序列图表提供解释。但人们的眼睛到底是在看什么呢?本章介绍在Apache Spark中实现的一种新的数值化研究趋势的算法:趋势演算。

第13章:数据保护。在这本书中,我们涉及数据科学的许多领域,经常误入那些传统上与数据科学家的核心工作无关的知识领域。在这一章中,我们将访问一个经常被忽视的领域——保护数据。更具体地说,本章将介绍如何在数据生命周期的所有阶段保护你的数据和分析结果。本章的核心是在Spark中构建商业级加密解码器。

第14章:可扩展算法。在这一章中,我们将说明为什么有时能在小规模数据下工作的基础算法会在大数据工作中失败。我们将说明在编写运行于海量数据集上的Spark作业时要如何避免出现问题,并介绍算法的结构以及如何编写可扩展到超过PB级数据的自定义数据科学分析。这一章还介绍了并行化策略、缓存、洗牌策略、垃圾回收优化和概率模型等功能,并说明如何使用这些功能帮助你充分利用Spark。

本书采用Spark 2.0,并结合Scala 2.11、Maven和Hadoop。这是所需的基本环境,各相关章节还会介绍许多要用到的其他技术。

我们假定阅读这本书的数据科学家已经对数据科学、常用的机器学习方法和流行的数据科学工具有一定的了解,已在工作过程中进行了概念验证研究并构建了原型。本书向读者介绍建立数据科学解决方案的先进技术和方法,并展示如何构建商业级数据产品。

在本书中,读者会发现一些不同的文本样式被用来区别不同种类的信息,下面是一些示例及其各自的含义。

在文本、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入信息、Twitter条目等位置出现的代码关键词用这样的方式展示:代码的下一行读取了链接,并将其分配给BeautifulSoup函数。

代码块的格式设置如下:

import org.apache.spark.sql.functions._

val rdd = rawDS map GdeltParser.toCaseClass
val ds = rdd.toDS()
// DataFrame-style API
ds.agg(avg("goldstein")).as("goldstein").show()

如果要吸引你注意代码块中的特定部分,相关的行或项目会被加粗:

spark.sql("SELECT V2GCAM FROM GKG LIMIT 5").show
spark.sql("SELECT AVG(GOLDSTEIN) AS GOLDSTEIN FROM GKG WHERE GOLDSTEIN IS
NOT NULL").show()

新词重要的关键词会由加粗的字体显示。

 

 

这里出现的是警告或者重要的注意点。

 

 

 

这里出现的是提示和技巧。

 


本书由异步社区出品,社区(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、测试、前端、网络技术等。

异步社区

微信服务号


作为一名数据科学家,你应该已经能非常熟练地处理文件和大量数据。但是除了对单一类型的数据进行简单分析外,你还需要一种组织和编目数据的方法,以便有效地管理数据。这种能力实际上是成为一名伟大的数据科学家的基础。因为随着数据量的增加和复杂性的提高,成功的泛化和失败的过拟合之间的区别就在于是否有一个一致且强大的方法。

本章介绍处理大规模数据的方法和生态系统,侧重于介绍数据科学的工具和技术。本章主要介绍运行环境和如何正确配置环境,同时也介绍一些与整体数据架构相关的非功能性注意事项。虽然这一阶段还没涉及具体的数据科学研究,但它为本书的成功提供了坚实的平台。

在这一章里,我们将探讨以下主题。

在数据持续产生、变动和更新的时代,数据管理显得尤为重要。在这种情形下,我们需要一种存储、结构化和审计数据的方法,从而对数据进行持续处理,对模型和结果进行不断改进。

本章将介绍如何最优地保存和管理数据,以便在满足日常需求的数据架构环境中集成Apache Spark和相关工具。

就算暂且不做长远的打算,即使你只是想在家里随便“玩”一点数据,如果没有适当的数据管理,往往问题会逐步升级直至你在数据中完全迷失,进而犯下错误。花时间思考如何组织你的数据,特别是如何进行数据采集是至关重要的。假如你花了很长的时间运行并分析代码,然后整理结果并生成报告,最终你发现使用了错误版本的数据,或者数据并不完整(例如缺失字段),或者更糟糕的是你把结果误删了。没有什么比这些更让人“抓狂”了!

这里还有个坏消息——虽然数据管理相当重要,但商业和非商业组织对它都并不太重视,尤其是缺少现成的解决方案。但好消息是,使用本章介绍的基础构建模块来完成这一工作会容易得多。

在考虑数据时,我们很容易忽视该领域需要考虑的真实范畴。实际上,大部分数据“新手”会按照以下方式考虑数据范畴。

实际上,关于数据,我们需要考虑的因素还有很多。数据管理的职责就是判断在特定的工作中需要具体考虑哪些因素。以下数据管理构建模块将有助于解答一些关于数据的重要问题。

如果上述内容仍无法说服你,那么在你继续使用gawk和crontab命令编写bash脚本之前,请继续阅读,你将会发现一种更快、更灵活且更安全的模式,可以让你从小规模开始逐步构建商业级的数据采集管道!

Apache Spark是新兴的可扩展数据处理的事实标准。在撰写本书时,它是最活跃的Apache软件基金会(ASF)项目,并提供了丰富的配套工具。每天都会出现新的工具,但其中许多工具在功能上有所重叠,因此我们需要花很多时间来学习它们的功能并判断其是否适用,而且这个过程没有捷径。通常来说,很少有万能的解决方案,总是需要根据实际情况进行具体场景分析。因此,读者需要探索可用的工具并做出明智的选择。

不同的技术将贯穿本书,希望它们能给读者提供更实用的技术引导,帮助读者在项目中使用相应技术。此外,如果代码编写合理,即使发现选择的某个技术是错误的,也可以利用应用程序接口(API)(或者Spark Scala中的高阶函数)来更换技术。

我们先对数据架构进行深入的解释,包括它是做什么的,它为什么有用,何时使用它,以及Apache Spark如何匹配它。

在常见的场景下,现代数据体系结构有4个基本特征,如图1-1所示。

图1-1 数据架构

我们将对每一项进行介绍,然后在后续章节里,再对其进行详细解释。

从传统的角度来看,应该在严格的规则下采集数据,并根据预定模式对数据进行格式化。这个处理过程称为提取(Extract)、转换(Transform)和加载(Load),简称ETL,如图1-2所示,它在广泛的实践中得到了大量的商业工具和开源产品的支持。

图1-2 ETL方法

ETL方法趋向于前端检查,确保数据质量和模式一致性,以简化后续的在线分析处理。它特别适合处理具有特定特征集的数据,即涉及经典实体关系模型的数据。不过,它并不完全适用于所有场景。

在“大数据革命”期间,对结构化、半结构化和非结构化的数据的潜在需求猛增,产生了可处理不同特性数据的系统。这些数据有4V特点:大体量(Volume)、多样性(Variety)、高速度(Velocity)和准确性(Veracity)。传统的ETL方法在这种情况下陷入困境,因为它需要太多的时间来处理大量的数据,并且面对变化时过于僵化。现在出现了一种不同的方法,称为“基于读时模式”的范式。该方法以原始形式(或至少非常接近)采集数据,而归一化、验证及其他的细节操作在分析过程中一并完成。

这个处理过程称为提取、加载和转换(简称ELT),参考传统方法的表示,它的表示如图1-3所示。

图1-3 ELT方法

这种方法重视数据传递的即时性,它对细节操作进行延迟直到必须要处理为止。这样,数据科学家可以第一时间对数据进行操作,并采用一系列技术来找出数据中的隐藏知识,这在传统方法中是不可能实现的。

虽然我们只是做了一个较高层次的概述,但这种方法是非常重要的,本书将通过实现多种基于读时模式的算法进行深入研究。假定我们都采用ELT方法进行数据采集,也就是说,我们鼓励在用户方便的时间加载数据。这可能是在每n分钟、通宵或者低负载的时间段。然后用户判断是否采用诸如离线批量处理的方式来进行数据完整性、质量等方面的检查。

数据湖是一种方便的、普遍适用的数据存储方式。它很有用,因为它有一些重要的优点,主要如下。

下面对这些优点做简要说明。

1.可靠的存储

实现数据湖的底层存储有很好的预选方案,包括Hadoop分布式文件系统(HDFS)、MapR-FS和亚马逊S3等。

在本书中,HDFS是我们预设的存储实现方式。此外,本书作者使用分布式Spark配置,部署在另一种资源协调者YARN上,并在Hortonworks的HDP环境中运行。因此,除非另有说明,否则本书使用的技术就是HDFS。如果你对其中的某些技术还不太熟悉,我们会在本章中进一步讨论。

在任何情况下我们都必须知道,Spark在本地引用HDFS位置,通过前缀file://访问本地文件位置,通过前缀s3a://引用S3位置。

2.可扩展的数据处理能力

显然,Apache Spark是我们选择的数据处理平台。Spark允许用户在自己偏爱的环境中执行代码,可以是本地、独立节点、YARN或Mesos,只要在masterURL中配置合适的集群管理器。这可以在以下3个位置中的任何1个位置完成。

如果你还不熟悉HDFS,或者没有访问过集群,那你可以使用本地文件系统运行本地Spark实例,这对于测试来说是很有帮助的。不过请注意,经常出现的不良行为往往只在集群上执行时才出现。所以,如果你想认真地使用Spark,那么应该在分布式集群管理器上进行投资,为什么不试试Spark的独立集群模式,或者使用亚马逊的AWS EMR呢?例如,亚马逊提供了许多成本较低的云计算方案,你可以访问亚马逊的AWS网站了解Spot实例的思路。

数据科学平台提供了大量的服务和API,使数据科学工作能够有效地进行,如探索性的数据分析、机器学习模型创建和改进、图像和音频处理、自然语言处理和文本情感分析等。

数据科学平台是Spark真正强大的地方,也是本书介绍的要点,它开发了一系列强大的本地机器学习库,具有难以比拟的并行图形处理能力,并构建了一个强大的社区。Spark为数据科学提供了无限的可能。

本书接下来的部分章节将深入分析这些领域,包括第6~8章。

数据湖中的数据最常被数据工程师和科学家利用Hadoop生态系统工具访问,如Apache Spark、Pig、Hive、Impala或Drill等。然而,其他用户,甚至是其他系统需要访问数据的时候,常用的工具要么太技术化,要么不能满足用户在现实世界中关于延时的要求。

这种情况下,数据通常要被复制到数据集市或索引存储库中,这样,它才可能被应用于更传统的应用方法,如报表或面板。这个过程称为数据出口,通常涉及索引创建和为了实现低延迟而进行的数据重构。

幸运的是,Apache Spark有各种各样的适配器和连接器可以连接数据库、商业智能(BI)软件以及可视化软件和报表软件。本书将介绍相关内容。

Hadoop首次启动时,Hadoop这个名称指的是HDFS和MapReduce处理范式的结合,因为这一结合就是谷歌提出MapReduce时的原始框架。从那时起,有大量的技术被整合到Hadoop中。随着Apache YARN的发展,像Spark这样不同的范式处理软件也开始出现。

Hadoop现在常常被作为大数据软件栈的口语表述,因此本书将谨慎地界定软件栈的范围。本书将介绍的典型数据架构和所选技术如图1-4所示。

图1-4 典型数据架构和所选技术

这些技术之间的关系是相当复杂的,因为它们之间存在着复杂的相互依赖关系,例如,Spark依赖于GeoMesa,而GeoMesa依赖于Accumulo,而Accumulo又依赖于ZooKeeper和HDFS。因此,为了管理这些关系,出现了Cloudera、Hortonworks HDP以及类似的平台。这些平台提供了统一的用户界面和集中配置。选择何种平台是用户的自由,但建议不要先单独安装部分软件然后再迁移到托管平台上,因为这样会遇到非常复杂的版本问题。在一台“干净”的机器上安装会比较容易,在安装前要确定技术类型。

本书使用的所有软件都是与平台无关的,因此可以适用于之前介绍的常规架构。这些软件可以在不使用托管平台的情况下独立安装,不论在单个还是多个服务器环境中使用都比较简单。

Apache Spark是将这些组件组合在一起的“胶水”,它渐渐成为软件栈的中心,集成了各种各样的组件但并不使用“硬连线”连接它们。实际上,你甚至能将底层存储机制替换掉。将这一功能与利用不同框架的能力相结合,意味着最初的Hadoop技术实际上是组件而不是框架。架构的逻辑如图1-5所示。

图1-5 架构逻辑

Spark的发展迅猛,并获得许多行业的认可,很多针对不同组件的原始Hadoop实现已经对Spark进行了重构。这使图1-5所示的架构逻辑更加复杂了,如利用特定组件通常有几种不同的可用编程方式,尤其是命令式和声明式版本,这取决于API是否已从原始Hadoop Java实现中移植。在后面的章节中,本书将尽可能保持Spark的风格。

现在我们已经建立了一个技术栈,下面具体描述技术栈中的每个组件以及它们在Spark环境中的作用。1.4节是作为参考而不是供读者直接阅读的。如果你对大部分技术相当熟悉,可以快速浏览知识然后继续阅读第2章。

HDFS是一个内置冗余的分布式文件系统。在默认情况下,它在3个或更多节点上工作,尽管只有1个节点也能正常工作并且可以增加节点限制,这一机制为系统提供了在重复的块中存储数据的能力。因此每个文件不仅被分成很多数据块进行存储,而且还存储了这些数据块的3个副本。这一巧妙的机制不但提供了数据冗余(如果一个数据块丢失了还有其他两个数据块),也具有数据局部性。当在HDFS运行分布式作业时,系统不仅会收集输入该作业所需的数据相关的所有数据块,而且还会仅使用物理上靠近运行该作业的服务器的数据块,因此它可以仅使用本地存储中的数据块或者靠近该作业服务器节点上的数据块来降低网络带宽使用率。它的具体实现是将HDFS物理磁盘分配给节点,将节点分配到机架;块分别以节点本地、机架本地和集群本地的模式写入。HDFS的所有指令都通过名为NameNode的中央服务器传递,这就存在一个可能的中心故障点,但是相应地有多种方法可以提供NameNode冗余配置。

此外,在多租户HDFS使用场景中,当多个进程同时访问同一个文件,也可以通过使用多个块来实现负载均衡。例如,如果一个文件占用一个块,则该块被复制3次,因此可以同时从3个不同的物理位置读取数据。虽然这看上去不算一个巨大的优势,但是在有着成百上千个节点的集群上,网络I/O通常是正在运行的作业的最大限制因素。在数千个节点的集群上,因为大量的其他线程调用数据,而耗尽了网络带宽,导致作业需要数个小时才能完成。

如果你正在使用笔记本电脑,需要把数据存储在本地,或者希望使用已有的硬件,那么HDFS是一个不错的选择。

1.优点

下面介绍HDFS的优点。

2.缺点

以下是HDFS的缺点。

3.安装

要使用HDFS,应该事先决定是以本地、伪分布式还是完全分布式的方式运行Hadoop;对于单个服务器来说,采用伪分布式方式非常有用,因为在这一方式下数据分析可以直接从当前服务器转换到任意的Hadoop集群。无论如何,安装Hadoop至少需要包括以下组件。

可以通过官方网站下载安装Hadoop。

Hadoop与Spark集成时,Spark需要知道Hadoop配置的位置,特别是以下文件的位置:hdfs-site.xml,core-site.xml。然后在Spark配置中对HADOOP_CONF_DIR配置参数进行设置。

然后就可以直接使用HDFS了,在Spark中可以用/user/local/dir/text.txt来直接访问hdfs://user/local/dir/text.txt文件。

S3解决了与并行性、存储限制和安全性相关的问题,以非常低的成本运行非常复杂的并行读写操作以及非常好的服务级别协议(SLA)。如果你需要快速启动与运行程序,但却无法在本地存储数据,或者不知道未来的存储需求,那么S3将是完美的选择。s3n和s3a是使用对象存储模型,而不是文件存储模型,因此需要做出妥协。

可以利用命令行工具(s3cmd)通过网页或利用大部分语言的API访问S3,可以进行一些简单的配置,将S3与Hadoop和Spark进行本地集成。

1.优点

下面介绍的是亚马逊S3的优点。

2.缺点

以下是亚马逊S3的缺点。

3.安装

可以在亚马逊AWS官网上创建一个AWS账户,通过这个账户,只需要创建凭证就可以访问S3了。

目前的S3标准是s3a,要想通过Spark使用它需要修改Spark配置:

spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key=MyAccessKeyID
spark.hadoop.fs.s3a.secret.key=MySecretKey

如果使用HDP,还完成需要以下配置:

spark.driver.extraClassPath=${HADOOP_HOME}/extlib/hadoop-aws-
currentversion.jar:${HADOOP_HOME}/ext/aws-java-sdk-1.7.4.jar

然后,可以在S3对象引用前使用s3a://前缀来访问Spark中的所有S3文件:

Val rdd = spark.sparkContext.textFile("s3a://user/dir/text.txt")

如果已经设置了spark.hadoop.fs.s3a.impl,也可以使用内联的AWS凭证:

spark.sparkContext.textFile("s3a://AccessID:SecretKey@user/dir/file")

如果密钥中存在正斜杠符号/,这一方法就无法使用。通常的解决方法是从AWS获取另外的密钥来解决(一直生成新的密钥,直到密钥中不存在正斜杠符号),也可以通过AWS账户中S3选项卡下的网页界面浏览对象。

Apache Kafka是一个用Scala编写的分布式消息系统,可以在Apache软件基金会许可下使用。该项目旨在提供统一、高吞吐量、低延迟的平台,用于处理实时数据馈送。本质上它是一个灵活的大规模发布—订阅消息队列,这使得它对需要建立处理流数据的基础设施的企业来说非常有价值。

1.优点

下面介绍的是Apache Kafka的优点。

2.缺点

以下是Apache Kafka的缺点。

3.安装

由于Kafka是发布—订阅工具,功能是管理消息(发布者)并将其指向相关的终点(订阅者),是用Kafka安装后提供的代理来具体实现的。Hortonworks HDP平台安装后Kafka就立即可用,也可以在Kafka官网上下载后单独安装。

Kafka使用ZooKeeper来管理领导节点选举(因为Kafka可以分布式安装从而允许冗余)。Kafka官网上的快速入门指南可以指导设置单节点ZooKeeper实例,还提供了一个客户端及消费者发布和订阅主题的消息处理机制范例。

自Hadoop诞生以来,基于列的格式(与基于行相反)的想法得到了越来越多的支持。因此为了利用压缩和高效的列数据表示形式,Parquet被开发出来,为复杂的嵌套数据结构而设计,这一算法的灵感来源于谷歌发表的介绍Dremel的论文《Dremel:网络规模数据集的交互式分析》(Dremel: Interactive Analysis of Web-Scale Datasets)。Parquet允许在每列上指定压缩方案,并且支持在未来新编码被实现时进行添加。它还被设计为在整个Hadoop生态系统中提供兼容性,而且与Avro一样,将数据模式与数据一起存储。

1.优点

下面介绍的是Apache Parquet的优点。

2.缺点

以下是Apache Parquet的缺点。

3.安装

Parquet在Spark中是原生可用的,可以像下面这样直接访问:

val ds = Seq(1, 2, 3, 4, 5).toDS
ds.write.parquet("/data/numbers.parquet")
val fromParquet = spark.read.parquet("/data/numbers.parquet")

Apache Avro最初是为Hadoop开发的数据序列化框架,它使用JSON来定义数据类型和协议(另外,接口描述语言也是可选的),并以紧凑的二进制格式序列化数据。Avro既提供持久性数据的序列化格式,也提供Hadoop节点之间以及客户端程序与Hadoop服务器之间通信的电报格式。它的另一个有用的特性是能够将数据模式与数据一起存储,因此无须引用外部源就可以读取任何Avro文件。此外,Avro支持模式演变,因此可以使用较新的模式版本读取旧模式版本编写的Avro文件,保持了向后兼容性。

1.优点

下面介绍的是Apache Avro的优点。

2.缺点

以下是Apache Avro的缺点。

3.安装

由于本书中使用Scala、Spark和Maven环境,因此可以用如下方式导入Avro:

<dependency>
   <groupId>org.apache.avro</groupId>
   <artifactId>avro</artifactId>
   <version>1.7.7</version> 
</dependency>

可以创建一个模式并生成Scala代码,并且可以使用该模式将数据写入Avro。第3章将对此进行详细说明。

Apache NiFi源自美国国家安全局(NSA),它作为NSA技术转让计划的一部分于2014年开源发布。NiFi可在简单的用户界面内生成可扩展的数据路由和转换的有向图,它还支持数据来源、众多的预构建处理程序,以及快速高效地构建新处理程序的能力。它具有优先级,可调传输容差和背压功能,允许用户根据特定要求调整处理程序和管道,甚至允许在运行时进行数据流修改。这些功能加起来,构成了一个非常灵活的工具,可以构建从一次性文件下载数据流到企业级ETL管道的所有流程。使用NiFi构建管道和下载文件通常比编写快速bash脚本更快,而这一方式还添加了功能丰富的处理程序,强烈推荐读者使用它。

1.优点

下面介绍的是Apache NiFi的优点。

2.缺点

以下是Apache NiFi的缺点。

3.安装

Apache NiFi可以与Hortonworks一起安装,被称为Hortonworks数据流;也可以在Kafka的NiFi官网上下载后单独安装。第2章将对NiFi进行介绍。

YARN是Hadoop 2.0的主要组成部分,它允许Hadoop插入处理范式,不局限于原始的MapReduce。YARN有3个主要组件:资源管理器、节点管理器和应用程序管理器。深入介绍YARN超出了本书的主要范围,我们要了解的重点是,如果运行一个Hadoop集群,那么Spark作业可以通过YARN在客户端模式下执行,如下所示:

spark-submit --class package.Class /
             --master yarn /
             --deploy-mode client [options] <app jar> [app options]

1.优点

下面介绍的是Apache YARN的优点。

2.缺点

以下是Apache YARN的缺点。

3.安装

YARN可以作为Hadoop的一部分进行安装,也可以作为Hortonworks HDP、Apache Hadoop的一部分进行安装,或者作为其他供应商的一部分进行安装。无论如何,安装YARN至少应该包括以下组件。

要确保Spark可以使用YARN,需要知道yarn-site.xml的位置,可以在Spark配置中对YARN_CONF_DIR配置参数进行设置。

Lucene最初是一个使用Java编写的索引和搜索库等工具,但现在已经应用于包括Python在内的其他几种语言上。Lucene孵化了许多子项目,包括Mahout、Nutch和Tika。现在这些项目已成为顶级Apache项目,而Solr最近成为Lucene的一个子项目。Lucene具有很多功能,而应用于问答搜索引擎和信息检索系统的功能尤为知名。

1.优点

下面介绍的是Apache Lucene的优点。

2.缺点

Apache Lucene的缺点是数据库通常更适用于关系操作。

3.安装

想了解更多信息并直接与数据库交互,可以在Lucene官网上下载相关资料。

如果要使用Lucene,只需要在项目中包含lucene-core-<version>.jar即可,例如在使用Maven时,代码如下所示:

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>6.1.0</version> 
</dependency>

Kibana是一个分析与可视化平台,还提供图表和流数据汇总。因为它将Elasticsearch作为其数据源(后者又使用Lucene),所以有着非常强的大规模搜索和索引能力。Kibana能以多种方式对数据进行可视化,包括条形图、直方图和地图等。本章末尾简要介绍Kibana,它将在本书中广泛使用。

1.优点

下面介绍Kibana的优点。

2.缺点

以下是Kibana的缺点。

3.安装

Kibana有自己的Web服务器,因此用户可以很容易地在Kibana的官网上下载后单独安装。由于Kibana需要Elasticsearch,因此还需要安装对应版本的Elasticsearch,具体细节请参阅Kibana官网。Kibana的配置在config/kibana.yml中修改。

Elasticsearch是一个基于Lucene(见前文介绍)和Web的搜索引擎,它提供了面向模式自由JSON文档的分布式、多租户全文搜索引擎。它是用Java编写的,但用户可以用任意语言使用其HTTP Web接口,这使它特别适用于处理事务或执行数据密集型指令并通过网页展示结果。

1.优点

下面介绍的是Elasticsearch的优点。

2.缺点

以下是Elasticsearch的缺点。

3.安装

可以在Elastic官网上下载Elasticsearch,要对REST API进行访问,可以导入Maven依赖项:

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch-spark_2.10</artifactId>
    <version>2.2.0-m1</version> 
</dependency>

有一个很好的工具可以帮助你管理Elasticsearch内容,就是在谷歌浏览器应用商店中下载谷歌浏览器插件Sense(译者注:Sense插件已经被谷歌浏览器应用商店下架,建议改用Kibana控制台,如确定需要使用Sense请在GitHub官方网站搜索sense-chrome,然后根据说明安装使用)。

Accumulo是一个基于Google Bigtable设计的No SQL数据库,最初由美国国家安全局开发,随后于2011年发布到Apache社区。Accumulo提供了常用的大数据处理技术,如批量加载和并行读取、用于高效服务器和客户端预计算的迭代器、数据聚合,最重要的是还具有单元级安全性。Accumulo的安全性使其对企业级应用来说非常有用,因为它可以在多租户环境中具有灵活的安全性。Accumulo和Kafka一样由Apache ZooKeeper提供支持,它还使用了Apache Thrift来提供跨语言远程过程调用(RPC)功能。

1.优点

下面介绍的是Accumulo的优点。

2.缺点

以下介绍Accumulo的缺点。

3.安装

Accumulo可以作为Hortonworks HDP的一部分安装,也可以在Apache的Accumulo官网上下载后单独安装。在编写实例时需要根据Accumulo官网上的安装文档进行配置。

第7章将演示如何通过Spark来使用Accumulo,以及类似迭代器和输入格式的高级功能,还将展示如何在Elasticsearch和Accumulo之间处理数据。

本章介绍了数据架构的概念,并说明了如何将数据管理职责划分为有助于在整个生命周期中管理数据的各个功能。具体来说,所有数据处理都需要一定层次的处理,无论是由公司规则规定还是用其他方式强制执行,如果缺乏这些处理,分析及其结果很快就会失效。

本章结合数据架构简单地介绍了各个组件及其各自的优点和缺点,并基于共同经验解释了我们的选择。实际上,在选择组件时总会有多个可选项,在做任何选择之前应仔细考虑组件各自的功能。

第2章将深入探讨如何寻求和获取数据,就如何将数据导入平台以及在通过管道加工和处理数据这方面进行探讨。


相关图书

Spark分布式处理实战
Spark分布式处理实战
Apache Spark大数据分析:基于Azure Databricks云平台
Apache Spark大数据分析:基于Azure Databricks云平台
Spark大数据实时计算:基于Scala开发实战
Spark大数据实时计算:基于Scala开发实战
Spark和Python机器学习实战:预测分析核心方法(第2版)
Spark和Python机器学习实战:预测分析核心方法(第2版)
图解Spark 大数据快速分析实战
图解Spark 大数据快速分析实战
Spark机器学习实战
Spark机器学习实战

相关文章

相关课程