Spark最佳实践(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-24 13:50:37

点击下载

作者:陈欢

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Spark最佳实践

Spark最佳实践试读:

前言

近些年,大数据的概念非常火,且许多行业已经开始从大数据中获益,比如广告业。越来越多的企业也正在尝试使用大数据的平台和方法来解决一些现实问题,不过,在这个过程中难免会遇到困难。因此,本书旨在提供一个非常具有可操作性的指引,帮助读者亲身体验大数据的魅力。

Spark是最近几年开始流行的一种通用分布式大数据计算平台,无论是性能、功能还是易用性,都在众多大数据技术中名列前茅,可以很好地解决大数据领域的许多常见问题。本书循序渐进地介绍Spark的基本概念、核心思想、部署、开发,并提供多个典型场景的解决方案,试图让即便是零基础的Spark读者也可以从中受益,并让对Spark已有所知的读者可以更深入地了解其运行机制及精髓。没有大数据平台的支持,普通海量数据的计算分析极端低效

笔者2008年毕业后即进入腾讯公司工作至今,刚进公司时感觉真是“一夜暴富”,因为名下的服务器有上百台,日常工作除了后台应用程序的开发,还要担负一些运营工作。然而,维护上百台机器上产生的日志文件就是一个非常令人头痛的问题。虽然每台机器都有TB级的硬盘空间,但还是经常爆满,我们经常半夜被电话吵醒起来删文件。此外,产品人员经常提出一些数据统计分析的需求,然而数据分布在上百台机器上,统计效率非常低下。

面对这样大量数据的统计,最常用的一种处理模式是,选择一个字段对数据进行散列化,然后按散列值的不同分别存储在单独的MySQL数据库表中,而这些MySQL节点分布在上百台机器上。需要统计的时候,我们再写个脚本分别去各个MySQL节点上取数据,或者简单处理一下,然后再汇总到一台机器上做处理。

这种方法简单易行,但问题很多。最大的问题是计算过程复杂,开发统计脚本的时间以天计,因为原本一个SQL就可以搞定的事情,现在需要分多步进行,且中间还需要将大量数据在多个节点上进行传输。比如这个简单的案例,它需要对数据按IP进行分布统计,计算过程至少需要3步:

(1) 去各个MySQL节点上执行SQL,按IP汇总统计;

(2) 数据汇总到一个节点上,导入MySQL;

(3) 在汇总的MySQL节点上进行统计。

而如果数据没有拆分存储,一个SQL就可以搞定。这只是一个最简单的例子,如果统计更复杂一些,这样的“计算-汇总-计算”的过程可能需要进行多次。

这种方法带来的第二个问题是散列分布不均匀导致的计算瓶颈和资源浪费。为了方便查数据,散列的规则设计不能太复杂,一般是取某个整数的十进制数值的前3位或末3位。这样的好处是日常定位数据位置很方便,缺点是数据分布不均匀,总有一些节点会承载非常多的数据,而另外一些节点又承载非常少的数据。承载数据多的机器会成为整体计算的瓶颈,而承载数据少的机器总是空闲,从而造成资源的浪费。

所以整体看来,这种方法的效率非常低下,计算本身耗时虽然不多,但开发过程相当费时,如果逻辑更复杂,甚至需要一周时间。Hadoop和Hive的组合,可以解决大数据计算的许多常见问题

后来我们引入“Hadoop + Hive”的解决方案,问题改善了很多。数据全部存储在Hadoop上,在各节点上均匀分布。在Hive上创建表并导入数据,设置好分区,这样虽然数据的存储还是分布式的,但从数据统计角度来看像是一个数据库,而不是之前的上千个数据库表。这样,开发者只需要关注自己的业务逻辑,而不需要关注底层数据的存储、分区等信息,开发效率大大提升。虽然Hive的计算效率不是很高,运行时间可能是“脚本 + MySQL”方式的数倍,但一般也只需要几十分钟,而节省的开发成本是以“天”计的,整体效率大大提升。

然而,随着数据量的继续快速上升,以及大家对数据的关注度的提高,Hive平台上的计算量越来越大,人们对于计算的需求也在变化。具体来讲,一是统计规则越来越复杂,原来几行SQL代码可以搞定的统计越来越少,新的统计需求动辄需要上百行SQL代码才能完成,而且量越来越多;二是越来越多的计算是SQL完成不了的,需要借助机器学习算法或图计算来进行。

这些新需求带来的挑战逐渐让“Hadoop + Hive”方式有些吃不消,一些问题逐渐暴露出来:一是性能不够高,一是简单的MR计算模式支持的应用场景非常有限。Spark出现之后,性能、功能、易用性都有质的提升

Hadoop的这些问题暴露之后,业界也有一些针对性的优化方案。但Spark走得更远,在参考MR的基础上重新实现了一套通用计算框架,性能提升10~100倍,尤其是在机器学习等复杂迭代计算的场景下,性能提升最明显。另外,使用场景除了SQL之外,Spark还支持类似Storm的实时流式计算和图计算,机器学习库也更丰富,为开发带来了极度的便利。因此,越来越多的技术人员开始使用Spark来替代Hadoop的MR计算,用Spark SQL来替代Hive,但存储依然使用Hadoop HDFS。

本书会详细介绍Spark,值得注意的是,Spark在设计伊始就充分考虑到了用户体验问题。Spark使用Scala语言开发,支持函数式编程,让代码非常简洁。比如,Hadoop MR编程中的示例程序WordCount,在Hadoop下用Java实现时代码有上百行,而且还需要经过编写代码文件、编译、上传执行等过程,而Spark集成的Scala语言支持交互式编程,进入交互式模式后直接输入代码即可开始执行,并且代码只有区区几行:

text_file = spark.textFile("hdfs://...")text_file.flatMap(lambda line: line.split()) .map(lambda word: (word, 1)) .reduceByKey(lambda a, b: a+b)

交互式编程配合函数式编程,使得Spark编程非常容易上手。笔者曾经考虑要不要让Spark支持bash这类脚本语言,但最终觉得Scala足矣。本书附录提供了Scala语法的简单参考,相信有一定编程基础的读者会非常容易上手。

经常有人会问:为何Spark会比Hadoop快那么多呢?我也曾反复思考过,在此抛砖引玉了。Spark和Hadoop都是非常优秀的开源项目,代码实现及架构已经非常优秀了,差别应该不在实现层面。大多数人认为Spark比Hadoop快是因为大量使用内存,正因此,Spark一开始被称作内存计算,但我认为还有一个更重要的原因,那就是核心数据结构。Spark使用RDD(弹性分布式数据集,读者可以将其想象成一个分布式的大数组)作为核心数据结构(相比之下Hadoop没有核心数据结构,只有Map/Reduce计算模式),在此基础上提供了许多计算函数,类似Hadoop下的Map/Reduce函数,但数量更多,还可以无限扩充。这样的好处是Spark的任务粒度更小,原先在Hadoop下一个Map或Reduce实现的功能,在Spark下可能会被拆分成多个Job。如果把Hadoop中的任务比作罐子里面的石头,那么Spark的Job就是罐子里面的碎石子,因此相同罐子可以装得更多。Spark这样细粒度的任务调度,再配合上内存的充分利用,最终让性能提升了一个台阶。

还有一个有意思的现象:大数据领域的技术很多是基于Java开发的,Hadoop、Hive、HBase都是,Spark使用的Scala最后也是转化成JVM字节码运行。Hadoop虽然被诟病性能低,但也没有基于C++的开源版本出现,究其原因,除了大家经常提到的这些开源系统的创始人喜欢Java,以及Java对于跨平台的强有力支持,我猜测可能还有如下几个原因。一是因为Java在大型系统开发方面的便利性,有非常多的库可以使用。这样一来,在系统最初的探索阶段可以节省大量人力,而Spark使用的Scala语言因为支持函数式编程,代码量进一步精简了好几倍,比如Spark中的SQL优化执行引擎只用2000行左右的代码就实现了,而且表现接近于手写代码,完全受益于语言在开发上的便利性。二是因为大数据计算场景下,系统的瓶颈经常不在于计算,而是网络传输和磁盘读写,此时CPU反而不是瓶颈,所以无论Hadoop和Spark都在这方面做了大量优化,语言性能方面的弱势不那么明显了。比如Hadoop和Spark中最重要的shuffle机制,就是为解决网络传输而设计的,而且不断优化,每次优化都可以在整体上提升性能。三是在Hadoop和Spark这类通用计算平台上都遵循一个理念,就是“宁可移动计算,不要移动数据”,这正是Java语言强大的序列化功能发威的时候。当然C++也可以实现,性能可能会更优,但开发成本可能不是一般小公司能承受得了的,也只有谷歌这样技术、财力雄厚的公司才有可能实现。事实上,Hadoop的理论基础也来自谷歌的论文。大数据平台众多,我们要怎么选呢

大数据热门之后出现了非常多的大数据技术,有Hadoop、Hive、HBase、Flume、Kafka、Lucene、Spark、Storm等,还有很多NoSQL技术可以归入大数据,比如MongoDB、CouchDB、Cassandra等。有人列举过大数据技术族谱,其中至少上百种技术。面对如此多的技术,我们往往会产生疑惑:到底该如何选择?这里有一个建议:在充分理解自身需求的基础上,挑选最合适的。

比如要实现这样一个任务:有10亿条用户画像数据,里面记录了用户的性别、年龄、地域等信息,输入一个用户包,只包含用户账号,数量平均百万级,最多1000万,希望查询这些用户的性别、年龄、地域等属性的分布信息。

面对这样的问题,如果我们贸然找一个开源系统部署上,刚开始的学习成本高不说,即便可以用,最后也不一定能证明这个方案到底是好还是不好。因为从来没有最好的方案,只有当前最合适的方案,不但要跟其他方案比,还要跟问题本身的需求比。比如,一开始就有一些有经验的前辈建议使用Solr或ElasticSearch,这两个系统固然非常强大,但大家都知道是为搜索引擎这样的场景设计的,而不是为这个问题场景设计的,中间难免有些匹配度的问题,不一定最合适。而且,如果不分析一下面对的问题场景,那么在研究Solr或ElasticSearch时也没有针对性,只能“全面开花”,结果必然费时费力,可能还没有好的结果。要知道,单Solr的文档就有几百页,全部看完至少需要一周时间。

因此我们先来分析一下当前的问题。如果所有数据都在数据库中,那么这个计算可以用SQL实现(以统计“性别”属性为例,其他与此类似):

select 性别, count(1)from 用户号码包表(1000W) join 画像表(10亿)group by 性别

显然计算的瓶颈在于join操作,join之后需要处理的数据量从10亿下降到1000 万,这可以大大降低后续的聚合统计的成本。而对于join操作来说,如果两边的数据都已经排好序,那么join的算法复杂度只是O(n),非常低。由于10亿条画像数据更新频率很低,我们可以提前做好排序预处理,因此最理想的计算过程可以分为这么几步:

(1) 对输入的用户号码包进行排序;

(2) 排序后的号码包与已经有序的画像数据进行join,筛选出号码包的属性;

(3) 对筛选后的少量数据进行聚合统计。

有了对问题的理解,我们再简单对比一下各种方案的优劣(使用相同的机器,集群数量为10台),参见下表。方案实现过程总用时缺点Hive集(1) 画像数据和号码包都存> 1小时机器资源占用多,维护成群(10储为一张表;本高台)(2) 对两张表进行join操作,筛选出号码包的属性;(3) 对每个属性进行统计Spark 同Hive10分钟SQL(10台)Spark 思路同上,但可以让画像8分钟MR(1数据提前排好序,并且两0台)张表使用相同的分区策略,这样可以提升join的效率Bash (1) 对号码包进行排序;12分钟单点(单机单(2) 号码包文件与有序的画核)像文件进行join,筛选出号码包的属性;(3) 对筛选出的结果按维度分别统计Bash(思路同上,但把大文件拆3分钟单机多成小文件,并发执行磁盘替代CPU核)成为瓶颈,如果有多个物理磁盘,性能可以进一步提升至1分钟从零开思路同上,但所有的操作< 0.5分钟开发成本太高发一个都在内存中,可能需要多对开发人员要求高专有分台机器布式系统(3~10台)Solr(3(1) 设置集群为多shard结1分钟没有筛选,每个维度的查台机构,画像数据提前导入;询都搜索了所有10亿画像器)(2) 新的画像数据作为新的数据字段导入;Facet特性必须指定一个(3) 使用join操作和Facet特UniqueKey,导致号码包性对各个维度分别统计导入时需要多处理一个UniqueKey字段

通过分析不难发现,有很多技术可以解决这个问题,连最不起眼的bash都可以,而且单机的性能就接近甚至超过10台Spark集群的性能。如果单独开发一个专有系统,性能更是会得到指数级提升。

然而,通过这些对比依然不足以确定我们的最终方案,因为对于需求本身还有很多疑问,比如系统的访问频率、扩容要求、需求变更,甚至还有团队的研发能力等。如果回答了这些问题,那么最终的决策只是水到渠成的事情。本书内容

全书共分8章,外加一篇附录。前4章介绍Spark本身,包括部署、工作机制、内核等。全书的重点在第5章~第8章,每章不但深入浅出地介绍Spark的一个功能模块,而且包含一个实战项目,项目利用国内互联网的真实数据为案例,搭建一个产品和平台输出。这些例子每个都可以是一个独立的大项目。这在BAT等公司中,动辄都是有几十上百人的项目团队,而笔者基于Spark快速搭建了一个原型,为创业者提供了很好的入门示例。此外,书中还详细介绍了各种可能遇到的实战问题,比如大数据环境下的配置设置、程序的调优等。随书带一键安装脚本,以便为初学者提供很多帮助。● 第1章概述大数据的发展状况,以及Spark的起源、特点、优

势、未来等。● 第2章介绍Spark部署和编程。作者首先带领读者在本地单机

下体验Spark的基本操作,然后部署一个包括ZooKeeper、

Hadoop、Spark的可实际应用的高可用集群。并且,这一章还介

绍了笔者合作开发的一个自动化部署工具,最后介绍了Spark编

程的基础知识,以及如何打包提交至集群上运行。● 第3章介绍Spark底层的工作机制,包括调度管理、内存管理、

容错机制、监控管理以及Spark程序配置管理,这对理解Spark程

序的运行非常有帮助。● 第4章深入Spark内核,并结合源码,介绍了核心结构

RDD、RDD对象的Transformation和Action操作是如何实现的、

SparkContext对象及初始化过程、DAG调度的工作流程。了解这

些内容可以帮助读者编写出高质量的Spark程序代码。● 第5章介绍Spark SQL,可以代替Hive,用于搭建一个企业

级的数据仓库。案例基于淘宝的电商数据建立电商数据仓库,并

以日常运营工作为例,通过电商数据库分析电商运营中的各类问

题。● 第6章介绍Spark实时流式计算,类似于Storm,但吞吐量方

面更有优势。案例是基于一个站点的Web日志建立一个类似百度

统计的实时统计系统,是各种实时系统典型的参考例子。● 第7章介绍Spark的图计算。案例基于新浪微博2000 万的关

系链数据,讲解了如果利用图计算来实现社交关系链的挖掘,比

如闺蜜的发现、粉丝团伙的发现等。● 第8章介绍Spark的机器学习库。案例基于某个搜索引擎的点

击日志,建立了一个搜索广告点击率预估系统。广告点击率预估

是各家互联网系统的核心系统,公开的实战项目不多。● 附录为Scala语言参考,方便第一次接触Scala语言的读者快

速上手,体验Spark编程。致谢

本书由陈欢和林世飞一起合作编著,大家年龄相仿,志同道合,牺牲了很多陪家人的时间才完成本书的撰写,非常感谢家人的支持。还要特别感谢腾讯企业云的“攻城之地”活动提供免费服务器,感谢李冠灿为服务器使用提供很多便利,感谢李学凯、余衍炳等人审阅了部分章节,提供了许多宝贵意见。感谢王流斌在如何使用KDD2012数据集方面提供了不少建议。感谢腾讯公司提供的学习和成长环境,以及各位领导对于我们撰写本书的鼓励和支持。感谢UCloud的CEO季昕华提供宝贵建议,并撰写“推荐序”。成稿期间,图灵出版公司的王军花编辑和毛倩倩编辑给予了极其详细的改进意见,在此表示由衷的感谢。

由于作者水平有限,书中难免有错误和不当之处,欢迎专家和读者给予批评指正,来函请发至sparkbestpractices@qq.com。2016年2月第1章Spark与大数据数据只是工具,最终还是要用于创造价值,大数据只是一种新的实践。1.1大数据的发展及现状

大数据是一个很热门的话题,但它是从什么时候开始兴起的呢?“大数据”(big data)这个词最早在UNIX用户协会的会议上被使用,来自SGI公司的科学家在其文章“大数据与下一代基础架构”(“Big Data and the Next Wave of InfraStress”,参见http://static.usenix.org/event/usenix99/invited_talks/mashey.pdf)中用它描述数据的快速增长。那么,怎样才叫“大数据”呢?META集团(已被Gartner收购)的一份报告提出大数据的特征“3V”,即大量(volume)、多样(variety)、快速(velocity)。如今,大家更普遍地使用“4V”来描述大数据的特征,即增加了第四个V——价值(value)。

从数据量上来看,人们通常认为当一个计算单元容纳不下要处理的数据,就是在面对大数据了。其实早在电脑被发明之前,我们做的人口统计、气象预报等工作就属于大数据范畴了。下面,让我们看看大数据时代所面临的问题。1.1.1 大数据时代所面临的问题

我们拿搜索引擎举例。搜索引擎需要把网上的多数网页抓取下来进行分析,并建立索引,这样在我们搜索一个词的时候,它才能在毫秒级别返回结果。我们假设每个网页平均的大小为20 KB,大概有价值的中文网页有200亿个页面,不过考虑到压缩情况,大概总共有400 TB的大小。那么,一台计算机以30 MB/s~35 MB/s的速度从硬盘读写,大概需要4个多月,这还不包括在这些数据上做复杂的分析工作。因此,我们通常需要一个计算机集群来完成相关的工作。

有人可能会说,我们的计算机处理能力在以指数级增长,这样机器能够处理更多的数据。是的,这也是事实,但是这些计算机生产数据的能力也在以指数级增长。而且,每人拥有的设备数在增加,如今除了个人电脑,越来越多的人拥有智能手机、平板电脑、智能家居、穿戴设备等。有数据表明,90%的数据是过去两年左右时间内产生的。

我们面对的最直接的问题是如何存储和计算大数据。接下来仍以搜索引擎作例子。假设每台机器存储400 GB的数据,那么我们需要1000台机器来存储这些数据。下面来分析下1000台服务器的故障率。

X表示一台服务器是否正常工作,X = 0表示正常工作,X = 1表示不正常工作。服务器一个月内发生故障的概率是ε,P(X = 0) = 1 - ε,1000那么1000台电脑都正常工作的概率是(1 - ε)。假设故障率ε = 0.001,所有1000台服务器1个月内正常工作的概率只有0.37,不到一半。

所以,随着数据的增加、机器的增加,处理数据的技术也变得越来越复杂了。为了解决这些问题,各种大数据解决方案诞生了。如今,程序员在100台机器上编程和在1000台上面编程没有太多区别,不需要考虑容错性、并发等问题。

随着云计算技术的发展,不仅大数据处理的复杂度降低了,成本也大大降低,云计算服务商的IaaS(Infrastructure as a Service,基础设施即服务)支持按天付费,而且可以动态按需扩容。在云计算服务商的帮助下,如今一个小创业公司都能够快速开发和部署大数据应用。云计算服务商的国外领导者是Amazon AWS,国内主要是阿里云、腾讯云和UCloud。

另外一个困扰我们的问题是:数据这么多,我们要存储哪些数据,以及存储多长时间的数据。通常我们认为,从一个字节可以获取多少价值,存储它又要花费多少费用,如果两者的比值大于1,就值得存储更多数据。大数据还有一个特点,就是存储单条数据的价值可能不大,拥有更多数据时,就有价值了。举一个简单的例子。如果我们只有一个用户的访问日志,显然没有太大价值,但是如果拥有全站的用户访问日志,我们就有可能对数据进行分析,从而发现潜在规律和趋势等。

解决了大数据存储和计算的问题之后,如何对数据进行分析呢?这是一个复杂的技术。Spark的很多库就是为了解决不同场景下的分析任务而存在的,比如MLlib库就是为解决各种机器学习问题开发的库,这些问题包括分类问题、回归问题、聚类等。GraphX就是为了分析社交网络等应用开发的库。

大数据时代面临的另外一个问题就是大数据交易,数据本身已成为一种可以交易的商品。2015年9月5日国务院印发了《促进大数据发展行动纲要》,纲要提出要建设公共数据资源开放的统一开放平台,“2020年底前,逐步实现信用、交通、医疗、卫生、就业、社保、地理、文化、教育、科技、资源、农业、环境、安监、金融、质量、统计、气象、海洋、企业登记监管等民生保障服务相关领域的政府数据集向社会开放”,以及“到2020年,培育10家国际领先的大数据核心龙头企业,500家大数据应用、服务和产品制造企业”。1.1.2 谷歌的大数据解决方案

谷歌的搜索引擎是搜索引擎界的领导者,很重要的原因之一就是谷歌在大数据技术方面领先。2003年开始,谷歌先后发表了GFS、MapReduce、BigTable等几篇论文,其中2004年,谷歌的Jeff等发表了论文“MapReduce: Simplified Data Processing on Large Clusters”,提出了大数据分析的范式MapReduce。虽然MapReduce范式在函数式编程中为人所熟知,但是该论文提供了在集群环境中该范式的可扩展性实现,使得程序员可以利用机器集群处理更多数据,而不需要考虑容灾和并发等问题。谷歌的三大论文引发了人们在大数据领域的大量研究,直接导致了Hadoop的出现——MapReduce范式的开源实现。如今Hadoop,包括MapReduce与分布式文件系统(HDFS),已经成为数据处理的事实标准。大量的工业界应用,例如腾讯、百度、阿里巴巴、华为、迪斯尼、沃尔玛、AT&T都已经有自己的Hadoop集群。

MapReduce能做的事情很多,包括实现各种机器学习算法(参见http://machinelearning.wustl.edu/mlpapers/paper_files/NIPS2006_725.pdf)。

但MapReduce不是唯一的大数据分析范式,有一些场景是不适合使用MapReduce的,比如处理网状的数据结构时,这要求能够处理顶点和边的增加和减少操作,并在所有节点进行运算等。

典型的场景就是在搜索引擎中链接地图计算和社交网络分析。谷歌也建设了基于图的计算系统Pregel,允许连通的节点之间互相交换信息。Pregel基本运算是节点之间的超级步骤(superstep),每个顶点都有一个用户自定义的计算函数和值,所有的边都可以并行计算,顶点可以通过边来发送消息并与其他顶点交互数据,可以聚合所有节点的信息,计算最大最小值等。Spark上也能够很方便地支持图计算应用。事实上,最初AMPLabs团队仅用数百行代码就开发出了整个Pregel,如今图计算库GraphX已经是Spark主要的库之一。

当然,并不是说谷歌出现前就不存在大数据。我们使用的很多方法和技术都是过去已有的,比如分布式系统广泛应用的Paxos算法,是莱斯利·兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递的一致性算法。1.1.3 Hadoop生态系统

Hadoop是谷歌大数据解决方案的开源实现,使用Java语言开发,其核心主要是两部分:分布式文件系统(HDFS)和MapReduce。为了处理更多的应用场景,在此基础上,经过业界巨头雅虎等,以及开源界其他力量的努力,人们建设了很多其他的重要系统,这里我们简单介绍下。

Hive是在HDFS和MapReduce上提供一个类似于SQL风格的抽象层,非常容易上手。

用户可以用数据库、表的概念来管理数据,使用SQL来访问、计算,不需要写MapReduce程序。SQL语法非常类似于关系型数据库,支持常见的Select、Join、Group by、Insert等操作。

HBase是基于Hadoop的非关系型数据库,具备分布式、可扩展的特点,支持在几十亿行、数百万列的一张大表上进行实时、随机地读写访问。典型场景有各种数据仓库,比如淘宝用户历史订单查询等。

ZooKeeper是提供分布式应用程序协调服务的系统,是谷歌的Chubby一个开源的实现,是Hadoop和HBase的重要组件。比如,Spark为了保证高可用,同时运行多台Master节点,但只有一台是活跃的,其他都处于热备状态,通过ZooKeeper可以协调选择出当前活跃的节点,当这个活跃节点异常时,再从剩下的热备节点中重新选择一台活跃节点。

Hadoop是一个批处理系统,不擅长实时计算,如果需要实时或准实时的分析,可以使用Storm(Twitter)、S4(雅虎)、Akka等系统。另外,Hadoop也不擅长复杂数据结构计算,比如前面提到的图计算,可以利用的开源系统有GraphLab和Spark的GraghX库。

从Hadoop 2.0开始,Hadoop YARN将资源调度从MapReduce范式中分离出来。YARN已经成为通用的资源管理系统,可为上层应用提供统一的资源管理和调度,Spark支持部署在YARN管理的集群上。

在工业界大规模应用Hadoop生态的系统,还要面临部署、排错、升级等问题。为解决这些问题,降低Hadoop应用门槛,我们可以使用Hadoop商用解决方案的提供商的产品,目前比较成熟的提供商有Cloudera、Hortonworks和MapR。

Cloudera由Doug Cutting和Jeff Hammerbacher共同创建,为合作伙伴提供Hadoop的商用解决方案,主要包括支持、咨询服务、培训。Cloudera产品主要为CDH、Cloudera Manager、Cloudera Support。CDH是Cloudera的Hadoop发行版,完全开源,比Apache Hadoop在兼容性、安全性、稳定性上有增强。Cloudera Manager是集群的软件分发及管理监控平台,可以在几个小时内部署好一个Hadoop集群,并对集群的节点及服务进行实时监控。Hortonworks是雅虎与硅谷风投公司Benchmark Capital合资组建的公司,公司成立之初吸纳了大约30名专门研究Hadoop的雅虎工程师,这些工程师均在2005年开始协助雅虎开发Hadoop,贡献了Hadoop 80%的代码。Hortonworks的主打产品是Hortonworks Data Platform(HDP)。

目前CDH和HDP在国内普及率不高,国内巨头使用的都是在Apache Hadoop开源版本上自己修改的定制版本,每家公司的集群规模也都有几千台。国内的公司也开始给开源社区同步部分修改,根据不完全统计,华为有4个Hadoop committer,小米有3个HBase committer,腾讯有一个Storm的committer,阿里巴巴有一个Spark的committer等。相信往开源社区贡献代码是未来的一种趋势。1.2Spark应时而生

Hadoop MapReduce可以解决很多通用计算的问题,但在某些场景下效率不高,Spark就是在这个场景下诞生的。1.2.1 Spark的起源

机器学习算法通常需要对同一个数据集合进行多次迭代计算,而MapReduce中每次迭代都会涉及HDFS的读写,以及缺乏一个常驻的MapReduce作业,因此每次迭代需要初始化新的MapReduce任务。这时,MapReduce就显得效率不高了。同时,基于MapReduce之上的Hive、Pig等技术也存在类似问题。

Spark作为一个研究项目,诞生于加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)。AMP实验室的研究人员发现在机器学习迭代算法场景下,Hadoop MapReduce表现得效率低下。为了迭代算法和交互式查询两种典型的场景,Matei Zaharia和合作伙伴开发了Spark系统的最初版本。2009年Spark论文发布,Spark项目正式诞生,在某些任务表现上,Spark相对于Hadoop MapReduce有10~20倍的性能提升。2010年3月Spark开源,且在开源社区下发展迅速。2014年5月,Spark 1.0正式发布,如今已经是Apache基金会的顶级项目了。1.2.2 Spark的特点

Spark刚出现时,常常被大家概括为内存计算,这不是没有缘由的。在典型应用中,Spark读取HDFS中的文件,加载到内存,在内存中使用弹性分布式数据集(Resillient Distributed Dataset,RDD)来组织数据。RDD可以重用,支持重复的访问,在机器学习的各个迭代中它都会驻留内存,这样能显著地提升性能。即使是必须使用磁盘进行复杂计算的场景,Spark也常常比Hadoop MapReduce更高效。

Spark频频在效率上表现出色,其官方博客显示,Spark在最近的排序大赛(https://databricks.com/blog/2014/11/05/spark-officially-sets-a-new-record-in-large-scale-sorting.html)中创造了新纪录,参见表1-1。表1-1 Spark的新纪录Hadoop MRSparkSpark数据规102.5 TB100 TB1000 TB模耗时72 min23 min234 min节点数2100206190核数50 400(物理6592(虚拟的)6080(虚拟的)的)磁盘吞3150 GB/s(估618 GB/s570 GB/s吐量计)环境专用数据中心,虚拟(EC2)10 虚拟(EC2)10 10 Gbit/sGbit/s网络Gbit/s网络排序效1.42 TB/min4.27 TB/min4.27 TB/min率节点排0.67 GB/min20.7 GB/min22.5 GB/min序效率

最新的结果可以关注(http://sortbenchmark.org/),最近提交的截止时间是2015-9-1。

Spark一直寻求保持Spark引擎小而紧凑。Spark 0.3版本只有3900行代码,其中1300行为Scala解释器,600行为示例代码,300行为测试代码。即使在今天,Spark核心代码也只有约50 000行,因此更容易为许多开发人员所理解和供我们改变和提高。

Spark是一个通用计算框架,包含了特定场景下的计算库:Streaming、SQL、MLlib、GraphX等。除了支持常见的MapReduce范式,它还能够支持图计算、流式计算等复杂计算场景,在很大程度上弥补了Hadoop的不足。

此外,Spark的接口丰富,提供了Python、Java、Scala等接口,文档清晰,为初学者提供了便利的上手条件。

在容错方面,Spark也有自己的特色。容错机制又称“血统”(Lineage)容错,即记录创建RDD的一系列变换序列,每个RDD都包含了它是如何由其他RDD变换过来的,而且包括如何重建某一块数据的信息。由于Spark只允许进行粗粒度的RDD转换,所以其容错机制相对高效。Spark也支持检查点(checkpoint)的容错机制。容错的机制和原理将在后面详细阐述。

Spark自带调度器,同时能够运行在Hadoop YARN集群、Apache Mesos上,可以很方便地和现有的集群进行融合。

Spark的输入支持本地存储、Hadoop的HDFS,以及其他支持Hadoop接口的系统:S3、Hive、HBase等。Spark还有一个优点,就是当RDD的大小超出集群的所有内存时,可以优雅地进行降级支持,存储在磁盘。

从成本的角度出发,由于Spark能适应多种应用场景,这样一个公司或者组织可能就不需要部署多套大数据处理系统,可大大减低学习、维护、部署、支持等成本。1.2.3 Spark的未来发展

Spark在过去的5年里发展迅速,社区活跃程度一点儿不亚于Hadoop社区。我们从Matei Zaharia在Spark五周年的总结中可以看到,Spark的contributor呈指数级增长,参见图1-1。图1-1 Spark的贡献者在过去5年内的增长情况

Spark峰会(http://spark-summit.org)是Spark社区分享Spark各种应用的重要交流会。在Spark Summit 2015上,来自Databricks、UC Berkeley AMPLab、百度、阿里巴巴、雅虎、英特尔、亚马逊、Red Hat、微软等的数十个机构共分享了近100个精彩纷呈的报告。

目前,Databricks、英特尔、雅虎、加州大学伯克利分校是Spark主要的贡献者。

Spark 1.4中还发布了SparkR,引入了更友好的R语法支持,进一步扩展了Spark数据分析的应用场景。

工业界应用上,从Spark官方提供的用户列表可以看到,国内的BAT都在用Spark,完整的列表可以参考https://cwiki.apache.org/confluence/display/SPARK/Powered+By+Spark。Spark Summit 2015中,Databricks的CTO Matei Zaharia在Keynotes里指出Spark最大的集群来自腾讯,一共有8000个节点,单个Job最大分别是阿里巴巴和Databricks的1 PB。

如今,Cloudera、Hortonworks和MapR在内的大数据发行版也添加了Spark,Spark已经得到广泛认可,成为一种优秀的大数据处理技术平台。

传统道家思想把事物分为道、法、术、器4个层次。如果说Spark是大数据的一件利器,那么本书最多就算是指导使用Spark的“术”,然后解决大数据的问题,需要的更多是“道”“法”的探索。第2章Spark基础本章带领大家体验一下Spark。首先,在虚拟机环境下体验所有基本操作,然后部署一个可供实际使用的高可用集群,之后会探讨如何编写Spark程序并提交至集群上运行。2.1Spark本地单机模式体验

Spark提供了本地单机部署的体验模式,与真实集群相比,它们的最大差异只是计算资源较少,但用来学习或体验足够了。这里的演示都在Linux系统下,这也是考虑到Spark真实的部署环境绝大部分都在Linux下,而且Linux下强大的shell功能让我们操作起来更方便。2.1.1 安装虚拟机

已经有Linux环境的读者,可以跳过本节,没有的话,可以参考本节在Windows桌面环境下安装一个Linux虚拟机。

虽然各大云平台都有免费的云服务器可以试用,但还是有诸多不便。比如,国内的腾讯云、阿里云、UCloud,试用期一般不到一个月。虽然国外的亚马逊提供一年的试用期,但需要填写信用卡支付信息,一不小心就可能因为流量或其他资源使用超标导致自动扣费,而且网络稳定性也是个问题。所以相比之下,本地虚拟机最方便,没有网络时也可以使用。

1. Linux发行版Ubuntu

安装虚拟机之前,首先选择一个Linux发行版。其实任何Linux发行版都可以,这里我们推荐使用比较流行的Ubuntu,其下载地址为http://www.ubuntu.com/download/。我们可以根据个人习惯选择纯shell操作的Ubuntu Server版本,或者带图形界面的桌面版。

2. 虚拟机工具VirtualBox

常见的虚拟机有VMWare Workstation、VMWare Player和VirtualBox,VMWare Workstation功能最强大但收费,我们可以选择免费的VMWare Player或者VirtualBox,这里以VirtualBox为例来演示安装。VMWare Player的操作也基本类似。

VirtualBox的下载地址为https://www.virtualbox.org/wiki/Downloads,截至2015年10月底时的最新版本是5.0.8,我们下载最新的VirtualBox 5.0.8 for Windows hosts,它已经支持到Windows 10了。其安装过程基本上是一直点击“下一步”,安装成功后的界面如图2-1所示。图2-1 成功安装VirtualBox后的界面● 创建虚拟机点击主界面左上角的“新建”按钮,在打开的界面中选择

Linux类型、Ubuntu (64-bit)版本,并取个名字,比如Spark

Ubuntu,如图2-2所示。

图2-2 新建虚拟电脑然后一路点击“下一步”按钮,大部分使用默认配置就好,

而磁盘空间这里可以稍微设置大一点,因为实际占用的本地磁盘

是动态分配的,所以不会占用更多的磁盘空间,如图2-3所示。

图2-3 文件位置和大小创建好后,就可以看到Spark Ubuntu虚拟机了,如图2-4所

示。

图2-4 创建好的Spark Ubuntu虚拟机默认情况下,虚拟机可以访问外网,但宿主机(即当前的个

人电脑)却无法访问虚拟机。为了后面操作方便,我们配置一下,

让宿主机也能访问虚拟机。选中Spark Ubuntu虚拟机,点击“设置”→“网络”,启用“网卡2”,连接方式选择“仅主机(Host-Only)适配器”,点击“确定”按钮保存即可,如图2-5所示。这样未来的虚拟机会有两

块网卡,一块用于通过宿主机连接外网,另一块用于与宿主机通

信。

图2-5 设置宿主机可以访问虚拟机需要说明的是,这一步也可以在安装完操作系统之后进行。● 给虚拟机安装操作系统Ubuntu这时的虚拟机只是一台空机器,上面没有操作系统,我们需

要为它安装操作系统Ubuntu Server LTS。点击“启动”按钮,启动之前会提示我们选择一个启动盘,

这里选择使用前面下载的镜像文件ubuntu-14.04.3-server-

amd64.iso,如图2-6所示。

图2-6 选择启动盘然后启动虚拟机,可以看到虚拟机已经运行起来了,如图

2-7所示,而且会看到Ubuntu的安装界面,如图2-8所示。

图2-7 启动虚拟机

图2-8 Ubuntu的安装界面这是虚拟机的界面窗口,点击鼠标后,个人电脑的鼠标、键

盘将完全被虚拟机占有,如果不熟悉Linux,会感觉鼠标、键盘

完全失灵,难免不安,不过没关系,退出的方式在窗口右下角有

提示:按“右Ctrl”键即可退出。在安装过程中,绝大部分配置使用默认值就好。当然,我们

也可以选择自己偏好的语言。格式化磁盘时,需要手动选择Yes。

唯一需要我们输入的地方是创建一个root之外的账号,并设置密

码,如图2-9和图2-10所示。

图2-9 添加账号

图2-10 设置密码在选择安装哪些服务时,我们选上OpenSSH server,此时

会自动启动SSH服务,方便从本机访问虚拟机,如图2-11所示。

当然,也可以事后安装服务。

图2-11 选择OpenSSH server安装过程大概持续半小时,这视机器配置而略有不同。安装完成后会自动重启,输入刚才创建的账号和密码之后,

就可以登录进去了,如图2-12所示。

图2-12 登录成功界面在Ubuntu系统下,我们可以通过apt-get命令安装各种程序,

比如安装上传和下载文件的工具:sudo apt-get install rpm alien lrzsz

3. 网络配置

通过ifconfig命令可以看到自己的地址,eth1的IP即我们可以从宿主机访问的IP,如图2-13所示。图2-13 eth1的IP

如果是安装完操作系统后才添加的网卡2,默认不会启动,可以执行下面的命令来启动网卡,并自动获取IP:

sudo ifconfig eth1 upsudo dhclient

如果在安装Ubuntu时没有选择OpenSSH server,可以手动安装:

sudo apt-get install openssh-server

这里的IP是通过DHCP服务自动分配的。为了避免虚拟机下次重启之后变更IP,我们可以配置虚拟机使用固定IP。编辑网络配置文件:

sudo vi /etc/network/interfaces

添加如下内容:

auto eth1iface eth1 inet staticaddress 192.168.56.101netmask 255.255.255.0gateway 192.168.56.100

其中网关地址192.168.56.100来自VirtualBox全局设定中的网络配置,如图2-14所示。图2-14 VirtualBox全局设定中的网络配置

重启网络服务后生效:

sudo /etc/init.d/networking restart

4. SSH客户端

直接在虚拟机平台的shell下操作不太方便,而且也不方便与宿主机的文件传输,所以要借助远程SSH连接工具。最好用的是SecureCRT,其功能强大,不过是商业版,但提供了30天免费试用版,足够我们体验Spark了。

当然,也有开源免费的可供选择,此时可以用Bitvise SSH Client,其官方网址为https://www.bitvise.com/,下载后安装并启动,按照图2-15输入IP和端口。图2-15 Bitvise SSH Client

第一次登录后,会提示接受并保存主机密钥(host key),如图2-16所示。图2-16 提示接受并保存主机密钥

按照提示输入密码,如图2-17所示。图2-17 输入密码

点击OK按钮即可登录到虚拟机,如图2-18所示。图2-18 登录到虚拟机上

至此,虚拟机配置完毕!2.1.2 安装JDK

Spark的运行依赖JVM。Spark使用Scala语言开发,而Scala是一种像Java一样运行在JVM上的语言,完美地融合了面向对象编程与函数式编程。关于Scala语言的相关内容,可以参考本书后面的附录。

Spark 1.4.1要求的最低JDK版本是JDK 6,Hadoop从2015年4月发布的2.7.0开始,已经抛弃了JDK 6,只支持JDK 7+,所以我们建议选择JDK 7,尽可能同时支持Hadoop和Spark。取JDK 7最新的稳定版即可,优先64位版本。

JDK的官方下载地址为http://www.oracle.com/technetwork/java/javase/downloads/index.html,默认会提供最新版本的JDK下载,目前是JDK 8。早期版本的链接在底部,搜索关键词older可以定位到,如图2-19所示。图2-19 早期版本

进入链接,发现有许多版本可供下载,这里我们选择Java SE 7,如图2-20所示。图2-20 选择Java SE 7

进入该链接,会看到JDK 7的最新版本下载地址,其按平台又分很多种,这里选择Linux 64位的版本,如图2-21所示。图2-21 选择版本

有RPM包或tar.gz包对应不同的安装方法,RPM包安装之后,会替代之前安装的RPM包,作为系统默认的JDK,tar.gz包的灵活性则大很多,但稍复杂一些,这里只是体验,我们选择RPM包来安装。

安装RPM包的具体方法如下。

(1) 下载jdk-7u80-linux-x64.rpm到本地。

(2) 上传至虚拟机(使用SecureCRT时,可以用rz -bye命令,而Bitvise SSH Client提供了图形化的方式)。

(3) 在虚拟机上执行sudo alien -i -c -v jdk-7u80-linux-x64.rpm命令,其中alien相当于Ubuntu下的rpm,如果是其他Linux,安装命令可能是rpm -ivh jdk-7u80-linux-x64.rpm。默认情况下,JDK会安装到目录/usr/java/jdk1.7.0_65下。

(4) 设置环境变量JAVA_HOME。为了使下次登录还能生效,可以将命令追加至~/.profile末尾:export JAVA_HOME=/usr/java/jdk1.7.0_65。

tar.gz包的安装方法为:直接将文件复制至指定目标目录(比如/usr/java)下,解压缩即可,然后像上面的过程一样设置环境变量JAVA_HOME。

这两种安装方式的差异仅仅是目录的不同,安装后都需要配置环境变量JAVA_HOME。

执行$JAVA_HOME/bin/java-version,若能看到如下信息,则说明安装成功:

java version "1.7.0_65"Java(TM) SE Runtime Environment (build 1.7.0_65-b17)

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载