1 Spark设计目的
设计的目的就是能快速处理多种场景下的大数据问题,能高效挖掘大数据中的价值,从而为业务发展提供决策支持。
2 Spark特点
Spark特点:
1.轻量级快速处理
Spark通过减少磁盘IO来达到性能的提升,它们将中间处理数据全部放到了内存中。
Spark使用了RDD(Resilient Distributed Datasets)数据抽象,这允许它可以在内存中存储数据,只在需要时才持久化到磁盘。
这种做法大大的减少了数据处理过程中磁盘的读写,大幅度的降低了运行时间。
2.易于使用
Spark支持多语言(Java、Scala、Python及R)
自带80多个高等级操作符
允许在shell中进行交互式查询
它多种使用模式的特点让应用更灵活。
3.支持复杂查询
除了简单的map及reduce操作之外,Spark还支持filter、foreach、reduceByKey、aggregate以及SQL查询、流式查询等复杂查询。
4.实时的流处理
对比MapReduce只能处理离线数据,Spark还能支持实时流计算(Spark Streaming)
5.与已存Hadoop数据整合
Spark不仅可以独立的运行(使用standalone模式),还可以运行在当下的YARN管理集群中。
6.活跃和不断壮大的社区
3 Spark的体系结构
不同于Hadoop的MapReduce和HDFS
Spark主要包括Spark Core和在Spark Core基础之上建立的应用框架:Spark SQL、Spark Streaming、MLlib和GraphX
Core库中主要包括上下文(Spark Context)、抽象数据集(RDD)、调度器(Scheduler)、洗牌(shuffle)和序列化器(Serializer)等。Spark系统中的计算、IO、调度和shuffle等系统基本功能都在其中。
在Core库之上就根据业务需求分为用于交互式查询的SQL、实时流处理Streaming、机器学习Mllib和图计算GraphX四大框架,除此外还有一些其他实验性项目如Tachyon、BlinkDB和Tungsten等。这些项目共同组成Spark体系结构,当然Hadoop中的存储系统HDFS迄今仍是不可被替代,一直被各分布式系统所使用,它也是Spark主要应用的持久化存储系统。在1.3节和第四章可以更全面的学习到这四大应用框架的内容。
4与现有分布式框架(Hadoop)对比
4.1 批处理框架
4.2 流处理框架
storm是一个分布式的、容错的实时计算系统,它由Twitter公司开源,专门用于数据实时处理的平台。它与Spark streaming功能相似,都是将流数据分成一个个小块的批(batch)数据进行数据处理,但也有很多不同,下面主要从处理延迟和容错两个方面进行分析,参考Storm和Spark streaming对比和应用场景
1.处理模型,延迟
虽然这两个框架都提供可扩展性和容错性,它们根本的区别在于他们的处理模型。Storm处理的是每次传入的一个事件,而Spark Streaming是处理某个时间段窗口内的事件流。因此,Storm处理一个事件可以达到秒内的延迟,而Spark Streaming则有秒级延迟。
2.容错、数据保证
在容错数据保证方面,Spark Streaming提供了更好的支持容错状态计算。在Storm中,每个单独的记录当它通过系统时必须被跟踪,所以Storm能够至少保证每个记录将被处理一次,但是在从错误中恢复过来时候允许出现重复记录。这意味着可变状态可能被错误的更新两次。另一方面,Spark Streaming只需要在批级别进行跟踪处理,因此即便一个节点发生故障,也可以有效地保证每个批处理过程的数据将完全被处理一次。实际上Storm的Trident library库也提供了完全一次处理,但它依赖于事务更新状态,这比较慢,通常必须由用户实现。
对于目前版本的Spark Streaming而言,最小选取的批数据量(Batch Size)可以在0.5-2秒钟之间(Storm目前最小的延迟是100ms左右),故Spark Streaming能够满足除对实时性要求非常高(如高频实时交易)之外的流式准实时(“准实时”表示数据延迟在秒级)计算场景。
简而言之,如果需要毫秒级的延迟,Storm是一个不错的选择,而且没有数据丢失。如果需要有状态的计算,计算的时延是秒级,Spark Streaming则更好。Spark Streaming编程逻辑也可能更容易,因为它类似于批处理模型MapReduce,此外Spark因为融合了多种业务模型,如果面对融合不同业务场景,考虑到人工维护成本和数据转换成本,Spark平台能更符合需求。
5 Spark生态系统
Spark设计目的是全栈式解决批处理、结构化数据查询、流计算、图计算和机器学习业务场景,此外其通用性还体现在对存储层(HDFS、cassandra)和资源管理层(MESOS、YARN)的支持。
存储层
HDFS:Hadoop Distributed File System
cassandra:最初由Facebook开发的分布式NoSQL数据库,于2008年开源。
资源管理层
MESOS:AMPLab最初开发的一个集群管理器,提供了有效的、跨分布式应用或框架的资源隔离和共享。
YARN:是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统。
备注:图1-6所示的生态系统被AMPLab称为伯克利数据分析栈(BDAS:Berkeley Data Analytics Stack,),下面对BDAS中的主要项目进行介绍。
6 BDAS项目介绍
蓝色部分,是Hadoop生态系统组件,黄色部分是Spark生态组件
1.Spark
作为Spark生态系统的核心,Spark主要提供基于内存计算的功能,不仅包含Hadoop的计算模型的MapReduce,还包含很多其他的如reduceByKey、groupByKey、foreach、join和filter等API。
Spark将数据抽象为弹性分布式数据集,有效扩充了Spark编程模型,能让Spark成为多面手,能让交互式查询、流处理、机器学习和图计算的应用无缝交叉融合,极大的扩张了Spark的应用业务场景,同时Spark使用函数式编程语言Scala,让编程更简洁高效。
2.Shark SQL
前提:Shark SQL是为了将Hive应用移植到Spark平台下而出现的数据仓库。
Shark在HQL(一般将Hive上对SQL支持的语言称为HQL)方面重用了Hive的HQL解析、逻辑计划翻译、执行计划优化等逻辑,可以认为仅将底层物理执行计划从Hadoop的MR作业转移到Spark作业,此外还赖Hive Metastore和Hive SerDe。这样做会导致执行计划过于依赖Hive,不方便添加新的优化策略,因此为了减少对Hive本身框架的依赖,引入Spark SQL解决上述问题。
Spark SQL仅依赖HQL Parser、Hive metastore和Hive SerDe,即说明在解析SQL生成抽象语法树(Abstract Syntax Tree,AST)后的部分都是由Spark SQL自身的Calalyst负责,利用scala模式匹配等函数式语言的特性,让Catalyst开发的执行计划优化策略比Hive更简洁。
除了HQL以外,Spark SQL还内建了一个精简的SQL parser,以及一套Scala特定领域语言(Domain Specific Language, DSL)。也就是说,如果只是使用Spark SQL内建的SQL方言或Scala DSL对原生RDD对象进行关系查询,用户在开发Spark应用时完全不需要依赖Hive的任何东西,因而日后的发展趋势重点在Spark SQL,对Shark的支持会逐渐淡化。
Spark SQL从Spark1.3开始支持提供一个抽象的编程结构DataFrames,能充当分布式SQL查询引擎。DataFrame本质就是一张关系型数据库中的表,但是底层有很多方面的优化,它能从多种数据源中转化而来,例如结构型数据文件(如Avro, Parquet, ORC, JSON和JDBC)、Hive表、外部数据库或已经存在的RDD。
3.Spark Streaming
Spark Streaming是基于Spark的上层应用框架,使用内建API,能像写批处理文件一样编写流处理任务,易于使用,它还提供良好的容错特性,能在节点宕机情况下同时恢复丢失的工作和操作状态。
在处理时间方面,Spark Streaming是基于时间片准实时处理,能达到秒级延迟,吞吐量比Storm大,此外还能和Spark SQL与Spark MLlib联合使用,构建强大的流状态运行即席(ad-hoc)查询和实时推荐系统。
备注:准实时:表示数据延迟在秒级
4.GraphX
GraphX是另一个基于Spark的上层的分布式图计算框架,提供了类似Google图算法引擎Pregel的功能,主要处理社交网络等节点和边模型的问题。因为Spark能很好的支持迭代计算,故处理效率优势明显。GraphX的最新版(Spark 1.4.1)支持PageRank、SVD++和三角形计数等算法。目前国内的淘宝技术部在graphX方面的应用成果很多,可以参考http://rdc.taobao.org了解更多信息。
5.MLlib
MLlib是Spark生态系统在机器学习领域的重要应用,它充分发挥Spark迭代计算的优势,能比传统MapReduce模型算法快100倍以上。
MLlib 1.3实现了逻辑回归、线性SVM、随机森林、K-means、奇异值分解等多种分布式机器学习算法,充分利用RDD的迭代优势,能对大规模数据应用机器学习模型,并能与Spark Streaming、Spark SQL进行协作开发应用,让机器学习算法在基于大数据的预测、推荐和模式识别等方面应用更广泛。
备注:弹性分布式数据集(RDD,resilient distributed datasets)
6.Tachyon
Tachyon是基于内存的分布式文件系统。过去Spark的计算功能和内存管理都在JVM中,导致JVM负载较高,同时各任务共享数据也不方便,当JVM崩溃后很多缓冲数据也会丢失,为了解决上述问题,从而衍生出Tachyon技术。
其主要设计目的是分离Spark的计算功能和内存管理功能,让内存管理脱离JVM,专门设计Tachyon来在JVM外管理内存数据。
这样做解决了Spark在数据共享、缓存数据丢失情况下效率较低的问题,还能减少JVM因为数据量过多导致经常的GC垃圾收集,有效提升了Spark的计算效率。从另一个角度看,Tachyon在Spark计算框架和基于磁盘HDFS之间可看成内存与硬盘之间的缓存,能有效提升数据读取速度。
7.Mesos
Mesos是一个集群管理器,与YARN功能类似,提供跨分布式应用或框架的资源隔离与共享,上面运行Hadoop(一种类似Spark的分布式系统基础架构)、Hypertable(一种类似Google公司Bigtable的数据库)、Spark,。Mesos使用分布式应用程序协调服务Zookeeper实现容错,同时利用基于Linux的容器隔离任务,支持不同的资源分配计划。
8.YARN
YARN(Yet Another Resource Negotiator)最初是为Hadoop生态设计的资源管理器,能在上面运行Hadoop、Hive、Pig(Pig是一种基于Hadoop平台的高级过程语言)、Spark等应用框架。在Spark使用方面,YARN与Mesos很大的不同是Mesos是AMPlab开发的资源管理器,对Spark支持力度很大,但国内主流使用仍是YARN,主要是YARN对Hadoop生态的适用性更好。
9.BlinkDB
BlinkDB 是一个用于在海量数据上运行交互式SQL近似查询的大规模并行查询引擎。它允许用户在查询结果精度和时间上作出权衡,其数据的精度被控制在允许的误差范围内。BlinkDB达到这样目标的两个核心思想分别是提供一个自适应优化框架,从原始数据随着时间的推移建立并维护一组多维样本,另一个是使用一个动态样本选择策略,选择一个适当大小的示例,基于查询的准确性和响应时间来实现需求。
7 Spark的数据存储
Spark本身是基于内存计算的架构,数据的存储也主要分为内存和磁盘两个路径,Spark本身则根据存储位置、是否可序列化和副本数目这几个要素将数据存储分为多种存储级别。此外还可选择使用Tachyon来管理内存数据。
为了适应迭代计算,Spark将经常被重用的数据缓存到内存中以提升数据读取速度,当内存容量有限的时候则将数据存入磁盘中或根据最近最少使用页面置换算法(Least Recently Used,LRU)算法将内存中使用频率较低的文件空间收回,从而让新的数据进来。
Tachyon的出现主要是为了解决三个问题而设计。
1 多应用数据共享问题,
2 JVM缓存数据丢失问题,
3 GC开销问题。
它将过去的Spark中计算和内存管理两个部分分离,专门使用Tachyon在JVM堆外管理Spark计算所需要的数据,极大的减轻了Spark管理上的负担和JVM内存负担。这种设计思路能很好的解决以上三个问题并提升程序运行的稳定性和速度,
参考资料
1 Spark入门教程(1)——spark是什么及发展趋势概述
2 如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系?
20171101