Spark核心技术与高级应用(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-20 23:44:07

点击下载

作者:于俊等

出版社:机械工业出版社

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

Spark核心技术与高级应用

Spark核心技术与高级应用试读:

前言

上善若水,水善利万物而不争。

数据一如水,无色无味,非方非圆,以百态存于自然,于自然无违也。绵绵密密,微则无声,巨则汹涌;与人无争却又容纳万物。

生活离不开水,同样离不开数据,我们被数据包围,在数据中生活,在数据中入梦和清醒。

某夜入梦时分,趴桌而眠,偶遇庄周那只彩色翅膀的蝴蝶飞入梦中,在数据上翩翩起舞;清醒时分,蝴蝶化身数据,继续在眼前飞舞,顿悟大数据之哲学。本书从《道德经》和《庄子》各精选10句名言,并结合大数据相关内容,对名言加以讲解,引导大家以老庄的思考方式来认识大数据的内涵,探求老子道之路和庄子智慧之路。

为什么要写这本书

2014年春天,我所在的知识云团队聚焦大数据,调研过程中,深深感觉到国内资料匮乏,可供参考的资料仅是Spark官方文档。团队人员英文水平参差不齐,Spark官方文档门槛比较高,学习起来困难重重。

当时和几个同事一起,对Spark官方文档进行了翻译,参考了机械工业出版社《Spark快速数据处理》的小册子,编了一本《Spark数据处理》内部文档,解决了一部分问题,并将Spark应用推向具体业务。在实际业务中,相比传统的数据处理,尤其是实时处理和迭代计算,MapReduce在Spark面前显得苍白无力。随着Spark的应用越来越多,深深感觉到《Spark数据处理》内部文档的不足,遗憾的是,一直没有时间进行补充和完善,俨然成了一块心病。

2014年9月,在机械工业出版社华章公司福川兄的指导下,开始重点思索:Spark解决哪些问题、优势在哪里、从业人员遇到哪些困难、如何解决这些困难等问题,并得到了吴爱华、吕劲松、代其锋、马海平、向海、陈明磊等几位同事的支持。怀着一颗“附庸风雅”之心,我决定和大家一起写一本具有一定实战价值的Spark方面的书籍。

当前大数据从业者,有数据科学家、算法专家、来自互联网的程序员、来自传统行业的工程师等,无论来自哪里,作为新一代轻量级计算框架,Spark集成Spark SQL、Spark Streaming、MLlib、GraphX、SparkR等子框架,都提供了一种全新的大数据处理方式,让从业者的工作变得越来越便捷,也让机器学习、数据挖掘等算法变得“接地气”。数据科学家和算法专家越来越了解社会,程序员和工程师有了逆袭的机会。

本书写作过程中,Spark版本从1.0一直变化到1.5,秉承大道至简的主导思想,我们尽可能地按照1.5版本进行了统筹,希望能抛砖引玉,以个人的一些想法和见解,为读者拓展出更深入、更全面的思路。

本书只是一个开始,大数据之漫漫雄关,还需要迈步从头越。

本书特色

本书虽是大数据相关书籍,但对传统文化进行了一次缅怀,吸收传统文化的精华,精选了《道德经》和《庄子》各10句名言,实现大数据和文学的有效统一。结合老子的“无为”和庄子的“天人合一”思想,引导读者以辩证法思考方式来认识大数据的内涵,探求老子道之路和庄子智慧之路,在大数据时代传承“老庄哲学”,让中国古代典籍中的瑰宝继续发扬下去。

从技术层面上,Spark作为一个快速、通用的大规模数据处理引擎,凭借其可伸缩、基于内存计算等特点,以及可以直接读写HDFS上数据的优势,实现了批处理时更加高效、延迟更低,已然成为轻量级大数据快速处理的统一平台。Spark集成Spark SQL、Spark Streaming、MLlib、GraphX、SparkR等子框架,并且提供了全新的大数据处理方式,让从业者的工作变得越来越便捷。本书从基础讲起,针对性地给出了实战场景;并围绕DataFrame,兼顾在Spark SQL和Spark ML的应用。

从适合读者阅读和掌握知识的结构安排上讲,分为“

基础篇

”、“实战篇”、“高级篇”、“扩展篇”四个维度进行编写,从基础引出实战,从实战过渡高级,从高级进行扩展,层层推进,便于读者展开讨论,深入理解分析,并提供相应的解决方案。

本书的案例都是实际业务中的抽象,都经过具体的实践。作为本书的延续,接下来会针对Spark机器学习部分进行拓展,期待和读者早点见面。

读者对象(1)对大数据非常感兴趣的读者

伴随着大数据时代的到来,很多工作都变得和大数据息息相关,无论是传统行业、IT行业以及移动互联网行业,都必须要了解大数据的概念,对这部分人员来说,本书的内容能够帮助他们加深对大数据生态环境和发展趋势的理解,通过本书可以了解Spark使用场景和存在价值,充分体验和实践Spark所带来的乐趣,如果希望继续学习Spark相关知识,本书可以作为一个真正的开始。(2)从事大数据开发的人员

Spark是类Hadoop MapReduce的通用并行计算框架,基于MapReduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点,并且克服了MapReduce在实时查询和迭代计算上较大的不足,对这部分开发人员,本书能够拓展开发思路,了解Spark的基本原理、编程思想、应用实现和优缺点,参考实际企业应用经验,减少自己的开发成本,对生产环境中遇到的技术问题和使用过程中的性能优化有很好的指导作用。(3)从事大数据运维的人员

除了大数据相关的开发之外,如何对数据平台进行部署、保障运行环境的稳定、进行性能优化、合理利用资源,也是至关重要的,对于一名合格的大数据运维人员来说,适当了解Spark框架的编程思想、运行环境、应用情况是十分有帮助的,不仅能够很快地排查出各种可能的故障,也能够让运维人员和开发人员进行有效的沟通,为推进企业级的运维管理提供参考依据。(4)数据科学家和算法研究者

基于大数据的实时计算、机器学习、图计算等是互联网行业比较热门的研究方向,这些方向已经有一些探索成果,都是基于Spark实现的,这部分研究人员通过本书的阅读可以加深对Spark原理与应用场景的理解,对大数据实时计算、机器学习、图计算等技术框架研究和现有系统改进也有很好的参考价值,借此降低学习成本,往更高层次发展。

如何阅读本书

本书分为四篇,共计20章内容。

基础篇(第1~10章),详细说明什么是Spark、Spark的重要扩展、Spark的部署和运行、Spark程序开发、Spark编程模型以及Spark作业执行解析。

实战篇(第11~14章),重点讲解Spark SQL与DataFrame、Spark Streaming、Spark MLlib与Spark ML、GraphX、SparkR,以及基于以上内容实现大数据分析、系统资源统计、LR模型、二级邻居关系图获取等方面的实战案例。

高级篇(第15~18章),深入讲解Spark调度管理、存储管理、监控管理、性能调优。

扩展篇(第19~20章),介绍Jobserver和Tachyon在Spark上的使用情况。

其中,第二部分实战篇为本书重点,如果你没有充足的时间完成全书的阅读,可以选择性地进行重点章节的阅读。如果你是一位有着一定经验的资深人员,本书有助于你加深基础概念和实战应用的理解。如果你是一名初学者,请在从基础篇知识开始阅读。

勘误和支持

由于笔者的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果你有更多的宝贵意见,可以通过Spark技术QQ交流群435263033,或者邮箱ustcyujun@163.com联系到我,期待能够得到你们的真挚反馈,在技术之路上互勉共进。

致谢

感谢Spark官方文档,在写作期间提供给我们最全面、最深入、最准确的参考材料。

感谢我亲爱的搭档向海、代其锋、马海平三位大数据专家,在本书写作遭遇困惑的时候,一直互相鼓励,对本书写作坚持不放弃。

感谢知识云团队的范仲毅、杨志远、万文强、张东明、周熠晨、吴增锋、韩启红、吕劲松、张业胜,以及贡献智慧的陈明磊、林弘杰、王文庭、刘君、汪黎、王庆庆等小伙伴,由于你们的参与使本书完成成为可能。

感谢机械工业出版社华章公司的首席策划杨福川和编辑高婧雅,在近一年的时间中始终支持我们的写作,你们的鼓励和帮助引导我们顺利完成全部书稿。

最后,特别感谢我的老婆杨丽静,在宝宝出生期间,因为麻醉意外躺在病房一个月多的时间里,以微笑的生活态度鼓励我,时时刻刻给我信心和力量;还有我可爱的宝宝于潇杨,让我的努力变得有意义。

谨以此书献给我亲爱的家人,知识云团队的小伙伴,以及众多热爱Spark技术的朋友们!于俊基础篇

·第1章 Spark简介

·第2章 Spark部署和运行

·第3章 Spark程序开发

·第4章 编程模型

·第5章 作业执行解析

·第6章 Spark SQL与DataFrame

·第7章 深入了解Spark Streaming

·第8章 Spark MLlib与机器学习

·第9章 GraphX图计算框架与应用

·第10章 SparkR(R on Spark)第1章Spark简介

上善若水,水善利万物而不争。——《道德经》第八章

数据一如水,无色无味,非方非圆,以百态存于自然,于自然无违也。绵绵密密,微则无声,巨则汹涌;与人无争却又容纳万物。

生活离不开水,同样离不开数据,我们被数据包围,在数据中生活。当数据越来越多时,就成了大数据。

想要理解大数据,就需要理解大数据相关的查询、处理、机器学习、图计算和统计分析等,Spark作为新一代轻量级大数据快速处理平台,集成了大数据相关的各种能力,是理解大数据的首选。

现在,让我们以向大师致敬的方式开始学习之旅,向Doug Cutting和Matei Zaharia两位大师致敬!1.1 什么是Spark

说起大数据,很多人会想起Doug Cutting以自己儿子玩具小象命名的开源项目Hadoop。Hadoop解决了大多数批处理工作负载问题,成为了大数据时代企业的首选技术。但随着大数据时代不可逆的演进,人们发现,由于一些限制,Hadoop对一些工作负载并不是最优选择,比如:

·缺少对迭代的支持;

·中间数据需输出到硬盘存储,产生了较高的延迟。

探其究竟,MapReduce设计上的约束比较适合处理离线数据,在实时查询和迭代计算上存在较大的不足,而随着具体业务的发展,业界对实时查询和迭代计算有更多的需求。

2009年,美国加州大学伯克利分校实验室小伙伴们基于AMPLab的集群计算平台,立足内存计算,从多迭代批量处理出发,兼顾数据仓库、流处理、机器学习和图计算等多种计算范式,正式将Spark作为研究项目,并于2010年进行了开源。

什么是Spark?Spark作为Apache顶级的开源项目,是一个快速、通用的大规模数据处理引擎,和Hadoop的MapReduce计算框架类似,但是相对于MapReduce,Spark凭借其可伸缩、基于内存计算等特点,以及可以直接读写Hadoop上任何格式数据的优势,进行批处理时更加高效,并有更低的延迟。相对于“one stack to rule them all”的目标,实际上,Spark已经成为轻量级大数据快速处理的统一平台,各种不同的应用,如实时流处理、机器学习、交互式查询等,都可以通过Spark建立在不同的存储和运行系统上,下面我们来具体认识一下Spark。1.1.1 概述

随着互联网的高速发展,以大数据为核心的计算框架不断出现,从支持离线的MapReduce席卷全球,到支持在线处理的Storm异军突起,支持迭代计算的Spark攻城拔寨,支持高性能数据挖掘的MPI深耕细作。各种框架诞生于不同的实验室或者公司,各有所长,各自解决了某一类问题,而在一些互联网公司中,百家争鸣,各种框架同时被使用,比如作者所在公司的大数据团队,模型训练和数据处理采用MapReduce框架(包括基于Hive构建的数据仓库查询的底层实现),实时性要求较高的线上业务采取Storm,日志处理以及个性化推荐采取Spark,这些框架都部署在统一的数据平台上,共享集群存储资源和计算资源,形成统一的轻量级弹性计算平台。1.1.2 Spark大数据处理框架

相较于国内外较多的大数据处理框架,Spark以其低延时的出色表现,正在成为继Hadoop的MapReduce之后,新的、最具影响的大数据框架之一,图1-1所示为以Spark为核心的整个生态圈,最底层为分布式存储系统HDFS、Amazon S3、Hypertable,或者其他格式的存储系统(如HBase);资源管理采用Mesos、YARN等集群资源管理模式,或者Spark自带的独立运行模式,以及本地运行模式。在Spark大数据处理框架中,Spark为上层多种应用提供服务。例如,Spark SQL提供SQL查询服务,性能比Hive快3~50倍;MLlib提供机器学习服务;GraphX提供图计算服务;Spark Streaming将流式计算分解成一系列短小的批处理计算,并且提供高可靠和吞吐量服务。值得说明的是,无论是Spark SQL、Spark Streaming、GraphX还是MLlib,都可以使用Spark核心API处理问题,它们的方法几乎是通用的,处理的数据也可以共享,不仅减少了学习成本,而且其数据无缝集成大大提高了灵活性。图1-1 以Spark为核心的轻量级大数据处理框架

基于Hadoop的资源管理器YARN实际上是一个弹性计算平台,作为统一的计算资源管理框架,不仅仅服务于MapReduce计算框架,而且已经实现了多种计算框架进行统一管理。这种共享集群资源的模式带来了很多好处。

·资源利用率高。多种框架共享资源的模式有效解决了由于应用程序数量的不均衡性导致的高峰时段任务比较拥挤,空闲时段任务比较空闲的问题;同时均衡了内存和CPU等资源的利用。

·实现了数据共享。随着数据量的增加,数据移动成本越来越高,网络带宽、磁盘空间、磁盘IO都会成为瓶颈,在分散数据的情况下,会造成任务执行的成本提高,获得结果的周期变长,而数据共享模式可以让多种框架共享数据和硬件资源,大幅度减少数据分散带来的成本。

·有效降低运维和管理成本。相比较一种计算框架需要一批维护人员,而运维人员较多又会带来的管理成本的上升;共享模式只需要少数的运维人员和管理人员即可完成多个框架的统一运维管理,便于运维优化和运维管理策略统一执行。

总之,Spark凭借其良好的伸缩性、快速的在线处理速度、具有Hadoop基因等一系列优势,迅速成为大数据处理领域的佼佼者。Apache Spark已经成为整合以下大数据应用的标准平台:

·交互式查询,包括SQL;

·实时流处理;

·复杂的分析,包括机器学习、图计算;

·批处理。1.1.3 Spark的特点

作为新一代轻量级大数据快速处理平台,Spark具有以下特点:

·快速。Spark有先进的DAG执行引擎,支持循环数据流和内存计算;Spark程序在内存中的运行速度是Hadoop MapReduce运行速度的100倍,在磁盘上的运行速度是Hadoop MapReduce运行速度的10倍,如图1-2所示。

·易用。Spark支持使用Java、Scala、Python语言快速编写应用,提供超过80个高级运算符,使得编写并行应用程序变得容易。

·通用。Spark可以与SQL、Streaming以及复杂的分析良好结合。基于Spark,有一系列高级工具,包括Spark SQL、MLlib(机器学习库)、GraphX和Spark Streaming,支持在一个应用中同时使用这些架构,如图1-3所示。图1-2 Hadoop MapReduce和Spark在内存中的运行速度比较图1-3 Spark高级工具架构

·有效集成Hadoop。Spark可以指定Hadoop,YARN的版本来编译出合适的发行版本,Spark也能够很容易地运行在EC2、Mesos上,或以Standalone模式运行,并从HDFS、HBase、Cassandra和其他Hadoop数据源读取数据。1.1.4 Spark应用场景

Spark使用了内存分布式数据集,除了能够提供交互式查询外,还优化了迭代工作负载,在Spark SQL、Spark Streaming、MLlib、GraphX都有自己的子项目。在互联网领域,Spark在快速查询、实时日志采集处理、业务推荐、定制广告、用户图计算等方面都有相应的应用。国内的一些大公司,比如阿里巴巴、腾讯、Intel、网易、科大讯飞、百分点科技等都有实际业务运行在Spark平台上。下面简要说明Spark在各个领域中的用途。

·快速查询系统,基于日志数据的快速查询系统业务构建于Spark之上,利用其快速查询以及内存表等优势,能够承担大部分日志数据的即时查询工作;在性能方面,普遍比Hive快2~10倍,如果使用内存表的功能,性能将会比Hive快百倍。

·实时日志采集处理,通过Spark Streaming实时进行业务日志采集,快速迭代处理,并进行综合分析,能够满足线上系统分析要求。

·业务推荐系统,使用Spark将业务推荐系统的小时和天级别的模型训练转变为分钟级别的模型训练,有效优化相关排名、个性化推荐以及热点点击分析等。

·定制广告系统,在定制广告业务方面需要大数据做应用分析、效果分析、定向优化等,借助Spark快速迭代的优势,实现了在“数据实时采集、算法实时训练、系统实时预测”的全流程实时并行高维算法,支持上亿的请求量处理;模拟广告投放计算效率高、延迟小,同MapReduce相比延迟至少降低一个数量级。

·用户图计算。利用GraphX解决了许多生产问题,包括以下计算场景:基于度分布的中枢节点发现、基于最大连通图的社区发现、基于三角形计数的关系衡量、基于随机游走的用户属性传播等。1.2 Spark的重要扩展

大家知道,在Hadoop中完成即席查询(ad-hoc queries)、批处理(batch processing),流式处理(stream processing),需要构建不同的团队,每个团队需要不同的技术和经验,很难做到共享。而Spark实现了平台融合,一个基础平台解决所有的问题,一个团队拥有相同的技术和经验完成所有的任务。

基于Spark的基础平台扩展了5个主要的Spark库,包括支持结构化数据的Spark SQL、处理实时数据的Spark Streaming、用于机器学习的MLlib、用于图计算的GraphX、用于统计分析的SparkR,各种程序库与Spark核心API高度整合在一起,并在持续不断改进。1.2.1 Spark SQL和DataFrame

Spark SQL是Spark的一个处理结构化数据的模块,提供一个DataFrame编程抽象。它可以看作是一个分布式SQL查询引擎,主要由Catalyst优化、Spark SQL内核、Hive支持三部分组成。

相对于传统的MapReduce API,Spark的RDD API有了数量级的飞跃,从Spark SQL 1.3.0开始,在原有SchemaRDD的基础上提供了与R风格类似的DataFrame API。

DataFrame是以指定列(named columns)组织的分布式数据集合,在Spark SQL中,相当于关系数据库的一个表,或R/Python的一个数据框架,但后台更加优化。

DataFrames支持多种数据源构建,包括:结构化数据文件(Parquet、JSON)加载、Hive表读取、外部数据库读取、现有RDD转化,以及SQLContext运行SQL查询结果创建DataFrame,如图1-4所示。图1-4 DataFrame数据来源

新的DataFrame API一方面大幅度降低了开发者学习门槛,同时支持Scala、Java、Python和R语言,且支持通过Spark Shell、Pyspark Shell和SparkR Shell提交任务。由于来源于SchemaRDD,DataFrame天然适用于分布式大数据场景。

关于Spark SQL更具体的内容和案例会在后面第6章详细介绍。1.2.2 Spark Streaming

Spark Streaming属于核心Spark API的扩展,它支持高吞吐量和容错的实时流数据处理,它可以接受来自Kafka、Flume、Twitter、ZeroMQ或TCP Socket的数据源,使用复杂的算法表达和高级功能来进行处理,如Map、Reduce、Join、Window等,处理的结果数据能够存入文件系统、数据库。还可以直接使用内置的机器学习算法、图形处理算法来处理数据,数据输入/输出示意图如图1-5所示。图1-5 基于Spark Streaming的数据输入/输出示意图

Spark Streaming的数据处理流程如图1-6所示,接收到实时数据后,首先对数据进行分批次处理,然后传给Spark Engine处理,最后生成该批次最后的结果。图1-6 基于Spark Streaming的数据处理流程

Spark Streaming提供一种名为离散流(DStream)的高级抽象连续数据流。DStream直接支持Kafka、Flume的数据源创建,或者通过高级操作其他DStream创建,一个DStream是一个序列化的RDD。

关于Spark Streaming更具体的内容和案例会在第7章详细介绍。1.2.3 Spark MLlib和ML

MLlib是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。MLlib目前支持4种常见的机器学习问题:二元分类、回归、聚类和协同过滤,以及一个底层的梯度下降优化基础算法。

MLlib基于RDD,天生就可以与Spark SQL、GraphX、Spark Streaming无缝集成,MLlib是MLBase的一部分,MLBase通过边界定义,力图将MLBase打造成一个机器学习平台,让机器学习开发的门槛更低,让一些并不了解机器学习的用户也能方便地使用MLBase这个工具来处理自己的数据。

MLlib支持将本地向量和矩阵存储在单个机器中,也包括有一个或更多的RDD支持的分布式矩阵。在目前的实现中,本地向量和矩阵都是为公共接口服务的简单数据模式,MLlib使用了线性代数包Breeze。在监督学习中使用到的样本在MLlib中成为标记点。

Spark MLlib架构由底层基础、算法库和应用程序三部分构成。底层基础包括Spark的运行库、进行线性代数相关技术的矩阵库和向量库。算法库包括Spark MLlib实现的具体机器学习算法,以及为这些算法提供的各类评估方法;主要实现算法包括建立在广义线性回归模型的分类和回归,以及协同过滤、聚类和决策树。在最新的Spark 1.5.0版本中还新增了基于前馈神经网络的分类器算法MultilayerPerceptronClassifier(MLPC),频繁项挖掘算法PrefixSpan、AssociationRules,实现Kolmogorov-Smirnov检验等等算法,随着版本的演进,算法库也会越来越强大。应用程序包括测试数据的生成以及外部数据的加载等功能。

Spark的ML库基于DataFrame提供高性能API,帮助用户创建和优化实用的机器学习流水线(pipeline),包括特征转换独有的Pipelines API。相比较MLlib,变化主要体现在:

1)从机器学习的Library开始转向构建一个机器学习工作流的系统,ML把整个机器学习的过程抽象成Pipeline,一个Pipeline是由多个Stage组成,每个Stage是Transformer或者Estimator。

2)ML框架下所有的数据源都是基于DataFrame,所有模型也尽量都基于Spark的数据类型表示,ML的API操作也从RDD向DataFrame全面转变。

关于MLlib和ML库更具体的内容和案例会在第8章详细介绍。1.2.4 GraphX

从社交网络到语言建模,图数据规模和重要性的不断增长,推动了数不清的新型并行图系统(例如,Giraph和GraphLab)的发展。通过限制可以表达的计算类型和引入新的技术来分割和分发图,这些系统可以以高于普通的数据并行系统几个数量级的速度执行复杂的图算法,如图1-7所示。图1-7 基于GraphX的并行图计算与其他方式的比较

GraphX是用于图和并行图计算的新Spark API。从上层来看,GraphX通过引入弹性分布式属性图(resilient distributed property graph)扩展了Spark RDD。这种图是一种伪图,图中的每个边和节点都有对应的属性。

为了支持图计算,GraphX给出了一系列基础的操作(例如,subgraph、joinVertices、和MapReduceTriplets)以及基于Pregel API的优化变体。除此之外,GraphX还包含了一个不断扩展的图算法和构建器集合,以便简化图分析的任务。

关于GraphX更具体的内容和案例会在第9章中详细介绍。1.2.5 SparkR

SparkR是AMPLab发布的一个R开发包,为Apache Spark提供了轻量的前端。SparkR提供了Spark中弹性分布式数据集(RDD)的API,用户可以在集群上通过R shell交互性地运行Job。例如,我们可以在HDFS上读取或写入文件,也可以使用lapply函数进行方法调用,定义对应每一个RDD元素的运算。

Spark具有快速(fast)、可扩展(scalable)、交互(interactive)的特点,R具有统计(statistics)、绘图(plots)的优势,R和Spark的有效结合,解决了R语言中无法级联扩展的难题,也极大地丰富了Spark在机器学习方面能够使用的Lib库。

除了常见的RDD函数式算子Reduce、reduceByKey、groupByKey和Collect之外,SparkR也支持利用lapplyWithPartition对每个RDD的分区进行操作。SparkR也支持常见的闭包(closure)功能:用户定义的函数中所引用到的变量会自动被发送到集群中的其他的机器上。

SparkR的工作原理如图1-8所示,首先加载R方法包和rJava包,然后通过SparkR初始化SparkContext。图1-8 SparkR工作原理

关于SparkR处理数据挖掘更具体的内容和案例会在第10章详细介绍。1.3 本章小结

大数据以及相关的概念、技术是业界和学界最近关注的热点,Spark在其中扮演了非常重要的角色。本书首先对Spark大数据框架进行了简单的介绍,展示了蓬勃发展的Spark大数据相关的特点和用途,揭开了Spark整个生态环境的神秘面纱。并在此基础上,向读者介绍了基于Spark的重要扩展,包括Spark SQL和DataFrame、Spark Streaming、MLlib和ML、GraphX、SparkR,使读者对Spark能做什么有个初步的了解。第2章Spark部署和运行

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。——《道德经》第六十四章

合抱的粗木,是从细如针毫时长起来的;九层的高台,是一筐土一筐土筑起来的;千里的行程,是一步又一步迈出来的。那么,Spark高手之路,是从Spark部署和运行开始的,只要坚持,就一定会有收获!

对于大部分想学习Spark的人而言,如何构建稳定的Spark集群是学习的重点之一,为了解决构建Spark集群的困难,本章内容从简入手,循序渐进,主要包括:部署准备工作、本地模式部署、独立模式部署、YARN模式部署,以及基于各种模式的应用程序运行。

很多优秀的集成部署工具值得推荐,如cloudera manager,但是本章重点讲解手动部署,借以加深对部署的理解。部署完毕,可以直接体验一下运行的快感,在自我陶醉的同时,细细品味过程中的细节。2.1 部署准备

部署准备工作包括下载Spark、编译Spark和集群部署,接下来会一一阐述。2.1.1 下载Spark

无论如何部署Spark,首先必须下载合适的版本。Spark提供源码压缩包和编译好的二进制文件压缩包。本书的内容主要以Spark 1.5.0版本为基础,熟悉SBT和Maven编译的读者,建议尝试自己编译适合的版本。

Spark下载路径:http://spark.apache.org/downloads.html。

Spark下载步骤如下:

1)选择Spark发行版本,截止到本书编写时最新版本为1.5.0;

2)选择发行包类型,可以选择Source Code[can build several Hadoop versions]、Pre-built for Hadoop 2.6and later、Pre-built for Hadoop 2.4and later、Pre-built for Hadoop 2.3、Pre-built for Hadoop 1.X;

3)选择下载方式,包括Direct Download、Select Apache Mirror;

4)点击选定的版本Download Spark。

图2-1所示为Spark 1.5.0版本的选择与下载过程。图2-1 Spark选择与下载步骤图2.1.2 编译Spark版本

Spark源码编译主要包括:使用SBT编译和使用Maven编译两种方式,编译的前置条件是配置Java环境变量。

1.配置Java环境变量

如果没有配置Java环境,需要先配置Java环境变量,从Oracle官网下载Java版本。

配置步骤如下:

第一步,安装Java程序,主要包括三种方式:

1)下载安装包进行安装;

2)通过软件源执行安装命令进行安装;

3)直接复制相同操作系统的安装文件目录(集群部署时一般采取这种模式)。

三种安装方式网上都有详细的参考资料。

第二步,配置Java环境,使用vim命令在/etc/profile文件中增加变量,以Ubuntu 12.04操作系统为例,命令如下:sudo vim /etc/profileexport JAVA_HOME=$YOUR_JAVA_HOME#$YOUR_JAVA_HOME为实际安装路径export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/binexport CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

如果想立即生效,可以通过运行source/etc/profile,否则只能在下次用户重新登录加载环境变量时生效。

第三步,测试Java环境:

打开终端,输入java-version。如若有显示Java的版本信息,则表示安装成功。注意 关于JDK的环境变量配置,一般包括四种方式:

1)在用户环境变量文件/etc/profile文件中添加变量,需要具有root权限才能进行配置,对Linux下所有用户长期有效。

2)在用户目录下的.profile文件中增加变量,对当前用户长期生效。

3)直接运行export命令定义变量,只对当前shell临时有效。在shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shell或其子shell下是有效的,若shell关闭,变量则失效,再打开新shell时就没有这个变量,若需要使用,则还需要重新定义。

4)在系统环境变量/etc/environment中进行配置。

2.使用SBT编译

Spark使用SBT(simple build tool,简单编译工具)进行编译,编译源码时需要花费一些时间,如果没有安装sbt,Spark构建脚本将会为你下载正确的SBT版本。下载好Spark源码之后,在源码目录(默认spark-1.5.0)执行打包命令:./sbt/sbt package

如果底层存储采用HDFS,而其版本又和Spark默认的版本不一致,则需要修改Spark根目录所在的project/SparkBuild.scala文件中的HADOOP_VERSION,然后重新编译。执行重新编译命令:./sbt/sbt clean compile

从源码构建Spark将花费一些时间,当编译过程停顿很长时间没有反应之后,停止,然后重新执行./sbt/sbt package打包命令。

其中,Spark的SBT文件工程结构中包含以下文件:

·project——工程定义文件;

·project/build/.scala——主要的工程定义文件;

·project/build.properties——工程,SBT以及Scala版本定义;

·src/main——应用代码目录,不同的子目录名称表示不同的编程语言(例如,src/main/scala、src/main/java);

·src/main/resources——你想添加到Jar包里的静态文件(如日志配置文件);

·lib_managed——工程所依赖的Jar文件存放路径,在SBT更新时添加到该目录;

·target——最终生成的文件存放的目录(例如,生成的thrift代码、class文件、Jar文件)。

3.使用Maven编译

Maven是一个采用纯Java编写的开源项目管理工具。Maven采用POM(Project Object Model,项目对象模型)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编译、构建、测试、发布、报告等。目前Apache下绝大多数项目都已经采用Maven进行管理,Maven本身还支持多种插件,可以更加方便灵活地控制项目。

使用Maven编译流程如下:

1)Maven下载:http://maven.apache.org/;

2)Maven配置:export M2_HOME=$your_path;export PATH=$M2_HOME/bin:$PATH;

3)Maven编译Spark。

在任意目录下以命令行的形式设置Maven参数。其中,-Xmx为Java虚拟机堆内存最大允许值,-XX:MaxPermSize为最大允许的非堆内存大小,-XX:ReservedCodeCacheSize为缓存大小。

在Spark源码目录(默认spark-1.5.0)下,编译参数hadoop.version可根据具体版本修改,编译Nexus依赖可以通过pom.xml文件修改,编译Spark运行环境命令如下:export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M-XX:ReservedCodeCacheSize=512m"mvn -Pyarn -Phadoop-2.3 -Dhadoop.version=2.3.0 -DskipTests clean package2.1.3 集群部署概述

在进行Spark编程之前,我们要进行Spark集群部署,目前与Spark相关的集群环境,也就是集群管理器(cluster manager),主要包括:Spark自带的Standalone资源管理器、Mesos集群管理器和Hadoop YARN资源管理器。

表2-1总结了集群部署和运行过程中,可能会使用到的集群相关基础概念,可以对集群部署和运行有个更深刻的理解。表2-1 集群相关基础概念2.2 Spark部署

Spark部署主要包括Local模式部署、Standalone模式部署、YARN模式部署、Mesos模式部署(参考官方文档)。

其中,集群部署模式如下:

·独立部署模式:Spark自带的一种简单集群管理器,使用该集群管理器可以轻松地建立一个集群;

·Apache Mesos:一个通用的集群管理器,该集群管理器也可以运行MapReduce和服务应用(实际业务没有采取该种架构,本书没有对该模式进行专门讲解,如需要了解,请参考官方文档);

·Hadoop YARN:Hadoop 2中的资源管理器,是当前主要使用的资源管理器。

除此之外,Spark的EC2启动脚本使得在Amazon EC2上启动一个独立模式集群变得容易。2.2.1 Local模式部署

Local(本地)模式下部署Spark应用程序比较简单,可以用于检测Spark是否编译安装成功,需要配置Java环境变量和设置主节点。

主节点设置步骤如下:

1)进入Spark主程序的conf目录,执行:cd spark-1.5.0/conf。

2)以spark-env.sh.template文件为模板创建spark-env.sh文件。

3)修改spark-env.sh配置文件:vi spark-env.shexport SPARK_MASTER_IP=$YOUR_MASTER_IPexport JAVA_HOME=$YOUR_JAVA_HOME

4)版本验证,在安装完毕Spark并配置环境变量之后,在任意目录下运行spark-shell命令即可进入Spark命令行模式,此时出现的大段文字中会提示当前的Spark版本,例如:Welcome to Spark version 1.5.0Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_45)2.2.2 Standalone模式部署

部署Standalone模式Spark集群步骤如下:

1)修改spark-env.sh配置文件(参考本地部署模式)。vim spark-env.shexport SPARK_MASTER_IP=$YOUR_MASTER_IPexport JAVA_HOME=$YOUR_JAVA_HOME

2)在Spark目录下创建一个名为conf/slaves的文件。该文件需要包含所有将要启动Spark Workers的机器的hostname(主机名),每行一个。vim slaves# A Spark Worker will be started on each of the machines listed below.slave01slave02slave03slave04……

3)发送配置文件spark-env.sh和Slaves到所有Worker节点,以slave02为例:scp -r $SPARK_HOME/conf/spark-env.sh slave02:/$SPARK_HOME/conf/scp -r $SPARK_HOME/slavesslave02:/$SPARK_HOME/conf/

4)配置Master无密钥登录Slaves节点。

①在Master节点和所有Slaves节点上安装openssh-server(以Ubuntu 12.04为例):sudo apt-get install openssh-server

②建立SSH KEY:ssh-keygen -t rsa -P ""

③在Master节点上启用SSH KEY(authorized_keys权限644):cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keyssudo /etc/init.d/ssh reload

④验证SSH的配置:ssh localhost

⑤将Master节点的authorized_keys发送到所有的Slaves节点,并登录验证。

部署完毕,可以通过手动启动和脚本启动集群的Master和Worker。下面详细介绍一下Spark Standalone模式集群的启动以及启动参数的功能。

1.手动启动集群

通过执行下面的命令启动Master节点:./sbin/start-master.sh

启动之后,命令行会打印出一个spark://HOST:PORT,你可以通过该信息将Worker与Master连接,或以“master”参数的形式传递给SparkContext对象。你也可以在Master的WebUI中找到这个URL,默认访问地址是http://localhost:8080。

支持启动一个或更多的Worker,然后通过下面的指令与Master连接:./bin/spark-class org.apache.spark.deploy.worker.Worker park:// IP:PORT

一旦启动了一个Worker节点,在Master的WebUI中(默认http://localhost:8080),你会看到新增Worker节点,以及CPU数目、内存大小(减去1GB留给系统)在列表中呈现。

2.脚本启动集群

检查Spark目录下的conf/slaves文件是否创建,是否包含了所有工作节点机器的hostname,一旦建立了这个文件,就可以通过下面的shell脚本在Master节点上启动或终止你的集群。

·sbin/start-master.sh:在脚本运行的机器上启动一个Master实例。

·sbin/start-slaves.sh:在conf/slaves文件中指定的机器上启动一个Slaves实例。

·sbin/start-all.sh:以上面所述的方式启动一个Master和一定数量的Slaves。

·sbin/stop-master.sh:停止当前通过bin/start-master.sh脚本启动的Master实例。

·sbin/stop-slaves.sh:停止在conf/salves文件中指定的机器上所有的Slaves实例。

·sbin/stop-all.sh:停止当前启动的Master实例和指定的Slaves实例。

执行cd/spark-1.5.0/sbin命令进入sbin文件夹,执行./start-all.sh可以启动所有服务器上的Spark相关进程。

执行jps命令可以查看当前服务器正在运行的进程。如果是主节点,可以看到Master进程;如果是子节点,可以看到Worker进程。这样就表示Spark在服务器上全部配置完毕。

可以通过设置spark-env.sh中的环境变量进一步配置集群,并复制到所有的Worker机器上以使设置生效,表2-2为可配置的spark-env.sh中的环境变量。表2-2 可配置的spark-env.sh中的环境变量2.2.3 YARN模式部署

下面来具体讲解如何基于YARN配置Spark程序。(1)准备工作

配置Spark之前,需要做一些准备工作。

首先,检查hosts文件,即使用root账户登录服务器之后,在任意目录下执行vim/etc/hosts命令,查看需要部署Spark的“服务器IP机器名”是否已存在,没有请添加。

其次,添加配置文件,同样是在任意目录下执行vim/etc/profile,打开环境变量配置文件,将SPARK_HOME配置到环境变量中,具体如下所示。export SPARK_HOME=/home/hadoop/spark-1.5.0export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbinexport HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoopexport YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

然后,在任意目录下执行source/etc/profile命令让环境变量生效。(2)Spark本身的配置

接下来就是针对Spark本身的配置。

首先,进入Spark中的conf文件夹,即在Spark所在目录执行cd/spark-1.5.0/conf命令。打开spark-env.sh文件,即vim spark-env.sh,添加:export JAVA_HOME=$YOUR_JAVA_HOMEexport SPARK_MASTER_IP=$YOUR_MASTER_IP

通过这一项配置,可以确定执行Spark程序时的主节点。

接下来,打开Slaves文件,将子节点的IP地址或名称添加到该文件中,完成Spark的IP和机器名对应的配置。vim slaves# A Spark Worker will be started on each of the machines listed below.slave01slave02slave03slave04……

最后,需要将spark-1.5.0文件夹、环境变量配置文件和hosts文件批量发送到配置的各个子节点的服务器上,再批量执行source/etc/profile命令即可。

按照先启动Hadoop,再启动Spark的顺序进行启动。2.3 运行Spark应用程序

运行Spark应用程序主要包括Local模式运行、Standalone模式运行、YARN模式运行、Mesos模式运行(参考官方文档)。2.3.1 Local模式运行Spark应用程序

Local模式运行Spark应用程序是最简单的方式,以计算圆周率的程序为例,进入安装主目录,如spark-1.5.0,执行命令:# 提交Spark任务的入口./bin/spark-submit \#主程序设置本地,local[*],其中*是指设置线程数--master local[10] \#选择主类名称--class org.apache.spark.examples.SparkPi \#examples Jar包/home/hadoop/spark-1.5.0/lib/spark-examples-1.5.0-hadoop2.3.0.jar

执行结果如下:*** INFO spark.SparkContext: Starting job: reduce at SparkPi.scala:35……*** INFO spark.SparkContext: Job finished: reduce at SparkPi.scala:35, took 0.751093979 sPi is roughly 3.14826 # 计算出Pi值,表明运行成功。2.3.2 Standalone模式运行Spark应用程序

Spark独立模式下应用程序的运行以及资源调度、监控和日志等内容会在接下来做简单的介绍。

1.spark-shell运行应用程序

在Spark集群上运行应用程序,需要将Master的Spark://IP:PORT传递给SparkContext构造函数。

在集群上运行交互式的Spark命令spark-shell,该命令将会用spark-env.sh中的SPARK_MASTER_IP和SPARK_MASTER_PORT自动设置Master。./bin/spark-shell --master spark:// IP:PORT

另外,还可以通过传递一个--cores来控制spark-shell在集群上使用的核心的数目。

2.spark-submit启动应用程序

spark-submit脚本提供了一种向集群提交Spark应用程序的最直接的方法,对于一个独立部署模式的集群,Spark目前支持Client部署模式,即在提交应用的客户端进程中部署Driver。

如果应用程序通过spark-submit启动,那么应用程序的Jar包将会自动地分配给所有的Worker节点;对于任何其他运行应用程序时需要依赖的Jar包,可以通过-jar声明,Jar包名之间用逗号隔开。

以SparkPi为例,提交应用程序命令如下:./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark:// $YOUR_MASTER_IP:7077 \ --executor-memory 2G \ --total-executor-cores 2 \$YOUR_SPARK_HOME/lib/spark-examples-1.5.0-hadoop2.3.0.jar

其中,spark-submit为提交Spark任务的脚本,--class org.apache.spark.examples.SparkPi为Spark项目包中指定运行的类的全路径。--master spark://$YOUR_MASTER_IP:7077为主节点的路径和端口号。$YOUR_SPARK_HOME/lib/spark-examples-1.5.0-hadoop2.3.0.jar是Spark项目程序包的路径。

直接运行即可验证Spark在Standalone模式下的计算圆周率的程序。如果启动上述应用程序成功,则执行结果如下:*** INFO client.AppClient$ClientActor: Connecting to master spark:// $YOUR_MASTER_IP:7077...*** INFO spark.SparkContext: Starting job: reduce at SparkPi.scala:35……*** INFO spark.SparkContext: Job finished: reduce at SparkPi.scala:35, took 15.530349566 sPi is roughly 3.14058

当出现Pi is roughly 3.14058,表明计算成功。

3.资源调度

独立部署模式支持FIFO作业调度策略。不过,为了允许多并发执行,你可以控制每一个应用可获得的资源最大值。默认情况下,如果集群中一次只运行一个应用程序,它就会获得所有CPU核。你可以在SparkConf中设置spark.cores.max来配置获得最多内核的数量,示例如下所示:val conf = new SparkConf() .setMaster(...) .setAppName(...)

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载