Spark大数据编程实用教程
上QQ阅读APP看书,第一时间看更新

1.2 初识Spark

1.2.1 Spark是什么

1.Spark定义

图1-5 Spark Logo图

Spark官网给出的英文定义如下:Apache Spark™ is a unified analytics engine for large-scale data processing。翻译成中文为:Apache Spark™是一个统一的大规模数据处理分析引擎。Spark的logo如图1-5所示。

Apache Spark右上标TM表示商标符号,即Apache Spark是一个商标;

Spark的官方网站:http://spark.apache.org/,提供Spark各个版本的下载、Spark新闻发布以及各种文档,是Spark学习的第一网站;

特别说明:本书基于Spark 2.3.0,后续如不做特殊说明,默认都是采用Spark 2.3.0版本。

2.认识Spark

结合官方定义,可以从以下几个方面来认识Spark:

●Spark是一个Linux下的软件框架,用户调用Spark提供的jar包编写Spark程序,一个Spark程序可以分布到多个节点上运行;

●Spark可以将Spark程序中的大数据处理任务分解到多个节点上,每个节点负责一部分任务并行处理,共同完成总任务;

●Spark不仅支持常规的大数据分析任务,它还支持流数据、图数据,或者是SQL操作的大数据任务,因此,它是一个统一的大数据分析引擎。

Spark的编程有专门的方法,要按照此方法来做任务分解,这样写出来的Spark程序才可执行并行处理任务。随便写一个Spark程序,或者说按照传统的方法写一个串行程序,Spark框架是不会、也不可能做任务分解和并行处理的;

Spark程序在集群上运行,必须要有专门的集群管理器,集群管理器用于集群资源的监控、管理和调度等功能,常用的集群管理器包括Yarn、MMesos和Kubernetes,Spark自带的资源管理器是Standalone,通常把Spark Standalone也称为Spark集群;

注意Spark、Spark程序和Spark集群的含义:Spark指Spark框架自身,Spark程序指基于Spark框架和规则所编写的程序,Spark集群指Spark自带的集群管理器Standalone,即Spark Standalone;

Spark利用集群对各种各样的大数据进行分析,属于大数据开发过程中的大数据处理环节。

1.2.2 Spark的技术特点

1.Spark具备更高性能

Spark性能对比的对象是Hadoop MapReduce。MapReduce的输出只能存储在文件系统上,新一轮MapReduce的输入只能从文件系统上读入,这样I/O和网络的开销都很大;而在Spark中,Reduce 的结果可以保存在内存中(或者内存+文件系统中),这样,下一轮迭代的输入可以直接从内存获得,可以大大节省系统开销。根据Spark官网的统计结果,在某些特定的算法领域,Spark的性能是Hadoop MapReduce的100倍以上。

2.Spark支持多种语言

Spark支持多种语言,包括Java、Scala、Python、R和SQL,其中Spark自身就是用Scala开发的,因此Scala是Spark的原生开发语言,Spark对其支持最好。

3.Spark更通用

如前所述,Spark不仅支持常规的大数据分析任务,还提供了SQL操作、流数据处理、图数据处理,同时还提供了丰富的机器学习算法库MLlib来支持各种类型的大数据分析处理。

4.Spark可以在多个平台上运行

如前所述,尽管Spark程序的运行依赖于特定的集群管理器(不能直接在操作系统上运行),但是它可以在Hadoop、Apache Mesos、Kubernetes或是Cloud(如EC2)等多种集群管理器下运行。

5.Spark使得分布式处理程序的开发更容易

如果采用常规的方法开发分布式处理程序,需要有分布式开发的经验,一般的开发过程如下:首先,需要设计分布式的处理架构;其次,自定义消息和网络交互协议,实现进程间的交互;接下来,利用网络编程接口Socket或者更上层的网络通信机制如RPC等方式实现进程间的网络通信;然后,编程实现架构中各种角色的逻辑;功能实现后,还要考虑系统的扩展、容错等机制。总之从上层的业务逻辑,到底层的通信、同步和容错等,所有的问题都需要开发者考虑。如果要想将扩展性做得很好,支撑很大的规模,同时又兼顾稳定性的话,开发难度会很大。

在Spark上开发程序,就像写单机版程序一样简单(当然,具体方法还是不一样的),开发者看不到集群上的具体节点,任务的分解和并行,节点间的通信和交互、容错等都由Spark来完成,开发者可以将注意力集中在上层的业务逻辑,因此可以大幅降低开发者的负担,简化开发过程。

MapReduce要解决的问题之一就是降低大数据开发难度,通过编程模型向用户屏蔽分布式开发的细节,使得用户能够专注于上层的处理逻辑。Spark吸取了MapReduce的这个优点。因此,Spark能使没有分布式系统的开发经验的人员,也能够开发出支撑大规模数据处理的分布式程序;

Spark 向开发者屏蔽了底层细节,从这个角度来说,Spark编程并不是特别高深的技术。但是,如果要通过 Spark 将集群的性能利用到极致,则又需要透过Spark深入到底层,这就需要很深的技术功力了。