日期 |
版本 |
修订 |
审批 |
修订说明 |
2016.10.11 |
1.0 |
章鑫8 |
|
初始版本 |
|
|
|
|
|
1 简介
Spark是UC Berkeley AMP lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark拥有Hadoop MapReduce所具有的有点,但不同于MapReduce的是job中间输出结果是可以保存在内存中的,从而不再需要读写hdfs,很大程度上提高了计算速度,因此Spark能够更好的适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集。在Spark官网上介绍,它具有运行速度快、易用性好、通用性好、通用性强和随处运行等特点。
2 架构原理
Spark只是一个计算框架,它本身并不包括对数据的存储,这一点与实时分布式系统
Storm是一样的。Spark是一个可以基于hadoop的hdfs,也可以基于hbase之上的处理框架,图1是spark的框架(最新的应该还有GraphX模块):
图1 Spark框架图
2.1 适用场景
目前的大数据处理场景一般有一下几种类型:
1、复杂的批量处理(batch data processing),偏重点在于海量数据的处理能力,至于速度,不太关注,通常时间可能是在数十分钟到数小时等
2、基于历史数据的交互式查询(interactive query),通常的时间在数十秒到数十分钟之间
3、基于实时数据流的数据处理(Streaming dataprocessing),通常在数百毫秒到数秒之间
目前对上述三种场景需求,都有比较成熟的处理框架,第一种可以用hadoop的mapreduce来进行批量海量数据处理,而impala可以进行交互式查询,对于实时流式数据处理,有比较成熟的storm分布式处理框架。但三者都是比较独立,各自维护一套成本比较高,而Spark的出现,正好统一解决了上述三种需求。
简单总结,Spark有一下几种使用场景:
1、 Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小
2、 由于RDD的特性,Spark不适用于那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合
3、 数据量不是特别大,但又有统计分析的需要,又有实时需求
4、 总的来说Spark的适用面比较广泛且比较通用
2.2 使用特点
1、 运行速度快
Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算。官方提供的数据表明,
如果数据由磁盘读取,速度是HadoopMapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍,如图2所示。
图2 hadoop与spark速度对比
2、 易用性好
Spark不仅支持Scala编写应用程序,而且支持java和Python等语言进行编写,特别是
Scala是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。
3、 通用性强
Spark生态圈即BDAS(伯克利数据分析栈)包含了SparkCore、Spark SQL、SparkStreaming、MLLib和GraphX等组件,其中Spark Core提供内存计算框架、SparkSteaming用来处理实时处理应用、Spark SQL用来即时查询、MLLib或MLbase用于机器学习以及GraphX的图处理,它们都是由AMP实验室提供,能够无缝的集成并提供一站式解决平台,Spark生态圈如图3所示。
图3 Spark生态圈
4、 随处运行
Spark具有很强的适应性,能够读取HDFS、Cassandra、Hbase、S3和Techyon为持久层
读写原生数据,能够以Mesos、YARN和自身携带的Standalone作为资源管理器调度job,来完成Spark应用程序的计算,具体如图4所示。
图4 Spark运行环境
2.3 Spark与Hadoop的差异
Spark是在借鉴了MapReduce之上发展而来的,继承了其分布式并行计算的优点并改进了MapReduce明显的缺陷,具体如下:
首先,Spark把中间数据放到内存中,迭代运算效率高。MapReduce中计算结果需要落地,保存到磁盘上,这样势必会影响整体速度,而Spark支持DAG图的分布式并行计算的编程框架,减少了迭代过程中数据的落地,提高了处理效率。
其次,Spark容错性高。Spark引进了弹性分布式数据集RDD (ResilientDistributed Dataset)的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即充许基于数据衍生过程)对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错,而CheckPoint有两种方式:CheckPoint Data,和Logging The Updates,用户可以控制采用哪种方式来实现容错。
最后,Spark更加通用。不像Hadoop只提供了Map和Reduce两种操作,Spark提供的数据集操作类型有很多种,大致分为:Transformations和Actions两大类。Transformations包括Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort和PartionBy等多种操作类型,同时还提供Count, Actions包括Collect、Reduce、Lookup和Save等操作。
另外各个处理节点之间的通信模型不再像Hadoop只有Shuffle一种模式,用户可以命名、物化,控制中间结果的存储、分区等。
2.4 技术术语
1、 运行模式
运行环境 |
模式 |
描述 |
Local |
本地模式 |
常用于本地开发测试,本地还分为local单线程和local-cluster多线程; |
Standalone |
集群模式 |
典型的Mater/slave模式,不过也能看出Master是有单点故障的;Spark支持 ZooKeeper来实现HA |
On yarn |
集群模式 |
运行在yarn资源管理器框架之上,由yarn负责资源管理,Spark负责任务调度和计算 |
On mesos |
集群模式 |
运行在mesos资源管理器框架之上,由mesos负责资源管理,Spark负责任务调度和计算 |
On cloud |
集群模式 |
比如AWS的EC2,使用这个模式能很方便的访问Amazon的S3; Spark支持多种分布式存储系统:HDFS和S3 |
2、 常用术语
术语 |
描述 |
Application |
Spark的应用程序,包含一个Driver program和若干Executor |
SparkContext |
Spark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor |
Driver Program |
运行Application的main()函数并且创建SparkContext |
Executor |
是为Application运行在Worker node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上。 每个Application都会申请各自的Executor来处理任务 |
Cluster Manager |
在集群上获取资源的外部服务 (例如:Standalone、Mesos、Yarn) |
Worker Node |
集群中任何可以运行Application代码的节点,运行一个或多个Executor进程 |
Task |
运行在Executor上的工作单元 |
Job |
SparkContext提交的具体Action操作,常和Action对应 |
Stage |
每个Job会被拆分很多组task,每组任务被称为Stage,也称TaskSet |
RDD |
是Resilient distributed datasets的简称,中文为弹性分布式数据集;是Spark最核心的模块和类 |
DAGScheduler |
根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler |
TaskScheduler |
将Taskset提交给Worker node集群运行并返回结果 |
Transformations |
是Spark API的一种类型,Transformation返回值还是一个RDD, 所有的Transformation采用的都是懒策略,如果只是将Transformation提交是不会执行计算的 |
Action |
是Spark API的一种类型,Action返回值不是一个RDD,而是一个scala集合;计算只有在Action被提交的时候计算才被触发。 |
2.5 模块介绍
2.5.1 Spark Core
前面介绍了Spark Core的基本情况,以下总结一下Spark内核架构:
Ø 提供了有向无环图(DAG)的分布式并行计算框架,并提供Cache机制来支持多次迭代计算或者数据共享,大大减少迭代计算之间读取数据局的开销,这对于需要进行多次迭代的数据挖掘和分析性能有很大提升
Ø 在Spark中引入了RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”对它们进行重建,保证了数据的高容错性
Ø 移动计算而非移动数据,RDD Partition可以就近读取分布式文件系统中的数据块到各个节点内存中进行计算
Ø 使用多线程池模型来减少task启动开稍
Ø 采用容错的、高可伸缩性的akka作为通讯框架
2.5.2 Spark Streaming
Spark Streaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kafka、Flume、Twitter、Zero和TCP 套接字)进行类似Map、Reduce和Join等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。
Spark Streaming构架:
计算流程:Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark Core,也就是把Spark Streaming的输入数据按照batch size(如1秒)分成一段一段的数据(DiscretizedStream),每一段数据都转换成Spark中的RDD(Resilient Distributed Dataset),然后将Spark Streaming中对DStream的Transformation操作变为针对Spark中对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加或者存储到外部设备。下图显示了Spark Streaming的整个流程。
图5 Spark Streaming构架
容错性:对于流式计算来说,容错性至关重要。首先我们要明确一下Spark中RDD的容错机制。每一个RDD都是一个不可变的分布式可重算的数据集,其记录着确定性的操作继承关系(lineage),所以只要输入数据是可容错的,那么任意一个RDD的分区(Partition)出错或不可用,都是可以利用原始输入数据通过转换操作而重新算出的。