Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。目前正朝着数据科学的OS发展。
下面我们从以下三个方面,为大家彻底解密What is Spark?
1.Spark生态系统
1. 内存列存储(In-Memory Columnar Storage) sparkSQL的表数据在内存中存储不是采用原生态的JVM对象存储方式,而是采用内存列存储;
2. 字节码生成技术(Bytecode Generation) Spark1.1.0在Catalyst模块的expressions增加了codegen模块,使用动态字节码生成技术,对匹配的表达式采用特定的代码动态编译。另外对SQL表达式都作了CG优化, CG优化的实现主要还是依靠Scala2.10的运行时放射机制(runtime reflection);
3. Scala代码优化 SparkSQL在使用Scala编写代码的时候,尽量避免低效的、容易GC的代码;尽管增加了编写代码的难度,但对于用户来说接口统一。
容容错性:对于流式计算来说,容错性至关重要。首先我们要明确一下Spark中RDD的容错机制。每一个RDD都是一个不可变的分布式可重算的数据集,其记录着确定性的操作继承关系(lineage),所以只要输入数据是可容错的,那么任意一个RDD的分区(Partition)出错或不可用,都是可以利用原始输入数据通过转换操作而重新算出的。
对于Spark Streaming来说,其RDD的传承关系如下图所示,图中的每一个椭圆形表示一个RDD,椭圆形中的每个圆形代表一个RDD中的一个Partition,图中的每一列的多个RDD表示一个DStream(图中有三个DStream),而每一行最后一个RDD则表示每一个Batch Size所产生的中间结果RDD。我们可以看到图中的每一个RDD都是通过lineage相连接的,由于Spark Streaming输入数据可以来自于磁盘,例如HDFS(多份拷贝)或是来自于网络的数据流(Spark Streaming会将网络输入数据的每一个数据流拷贝两份到其他的机器)都能保证容错性,所以RDD中任意的Partition出错,都可以并行地在其他机器上将缺失的Partition计算出来。这个容错恢复方式比连续计算模型(如Storm)的效率更高。
Spark之所以在机器学习方面具有得天独厚的优势,有以下几点原因:
(1)机器学习算法一般都有很多个步骤迭代计算的过程,机器学习的计算需要在多次迭代后获得足够小的误差或者足够收敛才会停止,迭代时如果使用Hadoop的MapReduce计算框架,每次计算都要读/写磁盘以及任务的启动等工作,这回导致非常大的I/O和CPU消耗。而Spark基于内存的计算模型天生就擅长迭代计算,多个步骤计算直接在内存中完成,只有在必要时才会操作磁盘和网络,所以说Spark正是机器学习的理想的平台。
(2)从通信的角度讲,如果使用Hadoop的MapReduce计算框架,JobTracker和TaskTracker之间由于是通过heartbeat的方式来进行的通信和传递数据,会导致非常慢的执行速度,而Spark具有出色而高效的Akka和Netty通信系统,通信效率极高。
MLlib(Machine Learnig lib) 是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。Spark的设计初衷就是为了支持一些迭代的Job, 这正好符合很多机器学习算法的特点。在Spark官方首页中展示了Logistic Regression算法在Spark和Hadoop中运行的性能比较,如图下图所示。
GraphX是Spark中用于图(e.g., Web-Graphs and Social Networks)和图并行计算(e.g., PageRank and Collaborative Filtering)的API,可以认为是GraphLab(C++)和Pregel(C++)在Spark(Scala)上的重写及优化,跟其他分布式图计算框架相比,GraphX最大的贡献是,在Spark之上提供一栈式数据解决方案,可以方便且高效地完成图计算的一整套流水作业。GraphX最先是伯克利AMPLAB的一个分布式图计算框架项目,后来整合到Spark中成为一个核心组件。
GraphX的核心抽象是Resilient Distributed Property Graph,一种点和边都带属性的有向多重图。它扩展了Spark RDD的抽象,有Table和Graph两种视图,而只需要一份物理存储。两种视图都有自己独有的操作符,从而获得了灵活操作和执行效率。如同Spark,GraphX的代码非常简洁。GraphX的核心代码只有3千多行,而在此之上实现的Pregel模型,只要短短的20多行。GraphX的代码结构整体下图所示,其中大部分的实现,都是围绕Partition的优化进行的。这在某种程度上说明了点分割的存储和相应的计算优化的确是图计算框架的重点和难点。
GraphX的底层设计有以下几个关键点。
1.对Graph视图的所有操作,最终都会转换成其关联的Table视图的RDD操作来完成。这样对一个图的计算,最终在逻辑上,等价于一系列RDD的转换过程。因此,Graph最终具备了RDD的3个关键特性:Immutable、Distributed和Fault-Tolerant。其中最关键的是Immutable(不变性)。逻辑上,所有图的转换和操作都产生了一个新图;物理上,GraphX会有一定程度的不变顶点和边的复用优化,对用户透明。
2.两种视图底层共用的物理数据,由RDD[Vertex-Partition]和RDD[EdgePartition]这两个RDD组成。点和边实际都不是以表Collection[tuple]的形式存储的,而是由VertexPartition/EdgePartition在内部存储一个带索引结构的分片数据块,以加速不同视图下的遍历速度。不变的索引结构在RDD转换过程中是共用的,降低了计算和存储开销。
3.图的分布式存储采用点分割模式,而且使用partitionBy方法,由用户指定不同的划分策略(PartitionStrategy)。划分策略会将边分配到各个EdgePartition,顶点Master分配到各个VertexPartition,EdgePartition也会缓存本地边关联点的Ghost副本。划分策略的不同会影响到所需要缓存的Ghost副本数量,以及每个EdgePartition分配的边的均衡程度,需要根据图的结构特征选取最佳策略。目前有EdgePartition2d、EdgePartition1d、RandomVertexCut和CanonicalRandomVertexCut这四种策略。在淘宝大部分场景下,EdgePartition2d效果最好。
SparkR是AMPLab发布的一个R开发包,使得R摆脱单机运行的命运,可以作为Spark的job运行在集群上,极大得扩展了R的数据处理能力。
SparkR的几个特性:
l 提供了Spark中弹性分布式数据集(RDD)的API,用户可以在集群上通过R shell交互性的运行Spark job。
l 支持序化闭包功能,可以将用户定义函数中所引用到的变量自动序化发送到集群中其他的机器上。
l SparkR还可以很容易地调用R开发包,只需要在集群上执行操作前用includePackage读取R开发包就可以了,当然集群上要安装R开发包。
2.Spark特性
Apache Spark最值得关注的六大特性。
1.超快速数据处理
当提及大数据的时候,处理速度总是至关重要的。我们总是寻求尽可能快地处理海量数据。Spark可以让Hadoop集群中的应用程序在内存中的执行速度提升100倍,而在磁盘中的速度甚至也能加快10倍之多。
Spark采用的方式是减少对磁盘的读写次数,它把这一中间处理数据存储在内存中。它使用了一个称为弹性分布式数据集(RDD)的概念,这使得它可以在内存上透明地存储数据并只有在需要的时候才传输给磁盘。这将减少大多数数据处理的磁盘读写,而这正是最消耗时间的因素。
(基于Hadoop的Spark性能。)
2.多语言支持
Spark允许你用Java、Scala或是Python快速编写应用程序。这有助于让开发人员用他们各自所熟悉的编程语言来创建并执行应用程序。它自带一个内置指令集,支持80多个高级操作符。我们可以用它在shell中对数据进行交互式的查询。
3.支持复杂查询
除了简单的map和reduce操作,Spark还支持SQL查询,流数据,还有诸如机器学习和开箱即用的图形算法之类的复杂分析。不仅如此,用户还可以在一个单独工作流中将所有这些功能无缝地结合在一起。
4.实时流处理
Spark可以处理实时流数据,而MapReduce主要处理“落地”的数据。Spark使用Spark Streaming来操纵实时数据,但是Hadoop中还提供了其他一些框架,同样可以实现流数据处理。
Spark Streaming功能特点:
简单:建立在Spark轻量级且功能强大的API之上,Spark Streaming可以让你快速开发出流应用程序。
容错:不同于其他的流解决方案(例如:Storm),Spark Streaming在没有额外代码和配置的情况下可以恢复丢失的工作并提供开箱即用地唯一语义。
集成:为批处理和流处理复用相同的代码,甚至把流数据加入到历史数据中去。
(基于Storm与Spark的流数据处理性能对比)
5.集成Hadoop和已有Hadoop的数据功能
Spark可以独立运行。除此之外,它可以在Hadoop 2的YARN集群管理器上运行,并且还能读取任何已有Hadoop数据。这是一个巨大的优势!它可以从任何Hadoop数据源读取数据,如HBase,HDFS等等。如果此应用场景真的适合Spark的话,Spark的这一特性使其适用于现有的纯Hadoop应用程序的迁移。
6.活跃的用户社区
Apache Spark是由来自50多家公司的一大群开发人员建立的。此项目开始于2009年并且到目前为止有超过250名开发人员参与了进来!对于问题跟踪它拥有活跃的邮件列表和项目事务跟踪工具(JIRA)。
3.Spark体系架构
spark体系架构包括如下三个主要组件:
- 数据存储
- API
- 管理框架
数据存储:
Spark用HDFS文件系统存储数据。它可用于存储任何兼容于Hadoop的数据源,包括HDFS,HBase,Cassandra等
API:
利用API,应用开发者可以用标准的API接口创建基于Spark的应用。Spark提供Scala,Java和Python三种程序设计语言的API。
下面是三种语言Spark API的网站链接。
资源管理:
Spark既可以部署在一个单独的服务器也可以部署在像Mesos或YARN这样的分布式计算框架之上。
下图展示了Spark体系架构模型中的各个组件。