Spark研究综述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leveretz/article/details/53302998

Spark UC Berkeley AMPLab2009年发起的,然后被Apache软件基金会接管的类Hadoop MapReduce通用性并行计算框架,是当前大数据领域最活跃的开源项目之一。Spark是基于MapReduce计算框架实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark更适用于数据挖掘与机器学习等需要迭代的算法。逻辑回归算法在HadoopSpark上的运行时间对比图,可以看出Spark的效率有很大的提升。SparkScala语言实现的,Scala是一种基于JVM的函数式编程语言,提供了类似DryadLINQ的编程接口。而且Spark还提供修改的Scala语言解释器,能方便地用于交互式编程,用户可以定义变量、函数、类以及RDD

Spark称为快数据,比Hadoop的传统处理方式MapReduce有着很大的差别,效率至少提高100倍以上。Spark分为四大模块:Spark SQL-RDD(数据执行的基本单元),MLlib(机器学习)、Graphx(图计算),Spark Streaming(实时处理)。这四个部分的数据处理单元都是RDD。所以整个框架形成了大数据处理各种应用场景编程的一致性。同时,Spark是基于内存的编程模型,它可以把中间的迭代过程不放在磁盘中,直接数据不落地在内存中执行,极大地提高了它的执行速度。下面来介绍它的各个模块。

Spark SQL允许在SQLHiveQL 中的相关查询表达式在Spark中的执行。这个组件的核心是一个新型的RDDJavaSchemaRDDJavaSchemaRDD是由Row对象和Schema描述行中每一列的数据类型。JavaSchemaRDD类似一个关系型数据库中的表。一个JavaSchemaRDD可以通过已存在的RDDParquet文件,一个JSON数据集或者存储在Apache Hive 通过HiveQL运行的数据来创建。

MLlib是一些常用机器学习算法和工具中非常突出的,分类,回归,聚类,协同过滤,降维,以及相关的优化原语。许多标准的机器学习方法可以归结为一个凸优化问题,例如一项任务,去找到一个凸面函数f的最小值,这个凸面函数依赖于可变的Vectorw向量,这个向量在一个Node 中叫做Weights权值,我们可以把这个在客观函数里写成最优化问题。MLlib 包括的评价指标有:精确度,回收,F值,ROC,精密回收曲线,曲线下面积(AUC)AUC常用来比较模型,而精确度,回收,F值,ROC用来确定阀值。

GraphX是新的Spark用于图表和图形,并行计算的的API。在一个高层次上, GraphX 延伸了Spark RDD 通过引入Resilient Distributed Property Graph (弹性分布式属性图):一个有向多重图与附加到每个顶点和边的属性。为了支持图形计算,GraphX公开了一组基本的运算符(subgraph joinVerticesmapReduceTriplets) 以及一个最优的转变的Pregel API。此外, GraphX包含一个对图形Algorithms (算法)and builders(构建器) 不断增长的包集合,用以简化图形分析任务。从社交网络到语言建模,图形数据的增长规模和重要性,带动众多新图形并行系统(例如,Giraph and GraphLab)的发展。通过限制可以被表示计算的类型和引入新技术来划分和分配图形,这些系统能够有效地执行复杂的图形算法命令并远快于大多数普通的数据并行系统。

如果要用一句话来概括Spark Streaming的处理思路的话,那就是“将连续的数据持久化,离散化,然后进行批量处理”。SparkStreamingSpark核心的扩展API,允许使高通量、容错实时数据流的流处理。数据可以从许多来源摄取如KafkaFlumeTwitterZeroMQ或普通TCP套接字和使用复杂的算法表达式处理的高级函数如:map, reduce, join window 的数据。最后处理过的数据可以放到文件系统,数据库和可视化仪表板上。事实上,你可以引用内置的Spark的机器学习算法,数据流图处理算法。

Spark应用程序在集群上是一个独立运行的过程,在你的主程序中有SparkContext对象协调(驱动程序)。SparkContext可以连接多种类型的Cluster managersSpark’s ownstandalonecluster manager or Mesos/YARN),跨应用程序分配资源。一旦连接,Spark获得集群中节点的Executors(执行权),应用程序进行计算和存储数据是一个过程。接下来,它将发送你的程序代码(JARPython文件传递给SparkContext)到executors。最后,SparkContext发送tasksexecutors执行。

RDD(Resilient Distributed Datasets)弹性分布式数据集是分布式内存的一个抽象概念,RDD设计了一种高度受限的共享内存模型,通过在其他弹性分布式数据集执行确定转换操作而创建,这些限制使得容错实现的开销代价降低。Spark的设计思想是在任务和数据的容错方式基础上,设计出一种全新的容错方式模型,能够减少网络流量及磁盘输入输出开销。RDD是一种只读数据块,可以通过从存储系统上读取数据或者进行其他RDD操作。RDD数据的只读特性表示如果对一个RDD数据块进行了操作,那么结果将会是一个新的RDD,这种情况放在代码情景下,假设变换前后都是使用同一个变量表示这一RDDRDD里面的数据意义并不是真实的数据,而是一些元数据信息。

RDD具有以下五个方面的特性:1)分区列表(数据块列表)2)计算每个分片的函数;3)对父RDD的依赖列表;4)KeyValue RDDPartitioner5)每个数据分片的预定义地址列表。RDD的生成有两种方式:1)从文件系统输入(例如HDFS)创建;2)从父RDD转换得到新RDDRDD提供了四种算子:输入算子、变换算子、缓存算子和行动算子,其中MapReduceMap算子和Reduce算子也被封装入RDD的变换算子,可以说Spark RDD在继承MapReduce优秀基因的同时提供了更为丰富的接口和操作。广播变量(Broadcast)Spark的一种共享变量。这类变量解决了并行时个相互隔离的节点之间需访问的公共变量的存储问题。需注意的是广播变量是只读的,变量被广播后即不能再被修改。

Spark提供多种计算方式,使其他成为高效的数据流水线,提供了复杂查询,流式计算、机器学习、图计算等功能。Spark支持scalapythonjava评议,提供了shell,方便与用户交互。Spark可以运行在Hadoop数据源上,如HDFSHiveHBase等,这样的一种特征,可以让Spark开发者及用户轻易地从原系统迁移到Spark系统上来。

Spark计算模型采用Lambda Architecture架构处理批量及实时流数据,Lambda Architecture 架构分为三层:包括BatchLayer批处理层、Serving Layer服务层以及Speed Layer速度层。其中批处理层设计基于Hadoop计算模型,在Spark平台上开发的图计算框架GraphX和机器学习库Mllib可作为批量数据分析。服务层可以接收外部ad-hoc查询请求,利用Shark等索引服务对批量处理层的结果进行索引,完成准实时的SQL查询任务。速度层采用Spark Streaming分布式的流处理平台实时处理数据成查询处理。

JavaHdfsLR是逻辑回归分类算法的Spark实现,采用渐进梯度下降模型。使用SGD加上诸如牛顿-拉普森的近似法来预测似然函数。输入数据集及输出结果都是Hadoop分布式文件系统中的文件。

使用SVMModel内部类表示训练过程中返回模型对象以及SVMWithSGD。支持向量机的工作流:

1)创建Spark上下文。2)加载已标记的输入训练数据,SVM中用到的标记必须是{01}3)使用由{label,features}对及其他输入参数组成的RDD输入来训练模型。4)使用输入数据来创建一个类型为SVMWithSGD的对象。5)调用GenerallizedLinearModel重写后的run()方法,它会使用预配置的参数在输入RDDLabeledPoint上运行算法,并对所有输入特征的初始权重进行处理。6)获得一个SVM模型对象。7)终止Spark上下文。

Spark适用于那些在多个并行操作之间重用数据的应用,MapReduce在这方面效率并不高,因为MapReduceDAG引擎是基于非循环数据流的,即一个应用被分成一些不同的作业,每个作业从磁盘中读数据,然后再写到磁盘。Spark不太适合那些异步更新共享状态的应用,例如并行Web爬行器。

迭代式算法,许多机器学习算法都用一个函数对相同的数据进行重复的计算,从而得到最优解。MapReduce计算框架把每次迭代看成是一个MapReduce 作业,而每个作业都要从磁盘重新加载数据,这就导致了效率不高,而Spark可以把中间数据缓存到内存中加快计算效率。

交互式数据分析,用户经常会用SQL对大数据集合做临时查询(Ad-Hoc Query)。Hive把每次查询都当作一个独立的MapReduce作业,并且从磁盘加载数据,有很大的延迟,而Spark可以把数据加载到内存中,然后重复的查询。

流应用:需要实时处理的应用,这类应用往往需要低延迟,高效率。

猜你喜欢

转载自blog.csdn.net/leveretz/article/details/53302998