8. Spark运行逻辑
如图1-5所示,在Spark应用中,整个执行流程在逻辑上会形成有向无环图(DAG)。
Action算子触发之后,将所有累积的算子形成一个有向无环图,然后由调度器调度该图上的任务进行运算。Spark的调度方式与MapReduce有所不同。Spark根据RDD之间不同的依赖关系切分形成不同的阶段(Stage),一个阶段包含一系列函数执行流水线。图中的A、B、C、D、E、F分别代表不同的RDD,RDD内的方框代表分区。数据从HDFS输入Spark,形成RDD A和RDD C,RDD C上执行map操作,转换为RDD D,RDD B和RDD E执行join操作,转换为F,而在B和E连接转化为F的过程中又会执行Shuffle,最后RDD F通过函数saveAsSequenceFile输出并保存到HDFS中。

9. Spark分布式架构与单机多核架构的异同
我们通常所说的分布式系统主要指的是分布式软件系统,它是在通信网络互连的多处理机的架构上执行任务的软件系统,包括分布式操作系统、分布式程序设计语言、分布式文件系统和分布式数据库系统等。Spark是分布式软件系统中的分布式计算框架,基于Spark可以编写分布式计算程序和软件。为了整体宏观把握和理解分布式系统,可以将一个集群视为一台计算机。分布式计算框架的最终目的是方便用户编程,最后达到像原来编写单机程序一样编写分布式程序。但是分布式编程与编写单机程序还是存在不同点的。由于分布式架构和单机的架构有所不同,存在内存和磁盘的共享问题,这也是我们在书写和优化程序的过程中需要注意的地方。分布式架构与单机架构的对比如图1-6所示
1)在单机多核环境下,多CPU共享内存和磁盘。当系统所需的计算和存储资源不够,需要扩展CPU和存储时,单机多核系统显得力不从心。
2)大规模分布式并行处理系统是由许多松耦合的处理单元组成的,要注意的是,这里指的是处理单元而非处理器。每个单元内的CPU都有自己私有的资源,如总线、内存、硬盘等。这种结构最大的特点在于不共享资源。在不共享资源(Share Nothing)的分布式架构下,节点可以实现无限扩展,即计算能力和存储的扩展性可以成倍增长。
在分布式运算下,数据尽量本地运算,减少网络I/O开销。由于大规模分布式系统要在不同处理单元之间传送信息,在网络传输少时,系统可以充分发挥资源的优势,达到高效率。也就是说,如果操作相互之间没有什么关系,处理单元之间需要进行的通信比较少,则采用分布式系统更好。因此,分布式系统在决策支持(DSS)和数据挖掘(Data Mining)方面具有优势。
Spark正是基于大规模分布式并行架构开发,因此能够按需进行计算能力与存储能力的
扩展,在应对大数据挑战时显得游刃有余,同时保证容错性,让用户放心地进行大数据分析。
10. Spark的重要扩展:
大家知道,在Hadoop中完成即席查询(ad-hoc queries)、批处理(batch processing),流式处理(stream processing),需要构建不同的团队,每个团队需要不同的技术和经验,很难做到共享。而Spark实现了平台融合,一个基础平台解决所有的问题,一个团队拥有相同的技术和经验完成所有的任务。基于Spark的基础平台扩展了5个主要的Spark库,包括支持结构化数据的Spark SQL、处理实时数据的Spark Streaming、用于机器学习的MLlib、用于图计算的GraphX、用于统计分析的SparkR,各种程序库与Spark核心API高度整合在一起,并在持续不断改进。
1. Spark SQL和DataFrame Spark SQL
Spark的一个处理结构化数据的模块,提供一个DataFrame编程抽象。它可以看作是一个分布式SQL查询引擎,主要由Catalyst优化、Spark SQL内核、Hive支持三部分组成。相对于传统的MapReduce API,Spark的RDD API有了数量级的飞跃,从Spark SQL 1.3.0开始,在原有SchemaRDD的基础上提供了与R风格类似的DataFrame API。DataFrame是以指定列(named columns)组织的分布式数据集合,在Spark SQL中,相当于关系数据库的一个表,或R/Python的一个数据框架,但后台更加优化。DataFrames支持多种数据源构建,包括:结构化数据文件Parquet、JSON)加载、Hive表读取、外部数据库读取、现有RDD转化,以及SQLContext运行SQL查询结果创建DataFrame,如DataFrame数据来源 新的DataFrame API一方面大幅度降低了开发者学习门槛,同时支持Scala、Java、Python和R语言,且支持通过Spark Shell、Pyspark Shell和SparkR Shell提交任务。由于来源于SchemaRDD,DataFrame天然适用于分布式大数据场景。
SQL处理原理:

2. Spark Streaming Spark Streaming
属于核心Spark API的扩展,它支持高吞吐量和容错的实时流数据处理,它可以接受来自Kafka、Flume、Twitter、ZeroMQ或TCP Socket的数据源,使用复杂的算法表达和高级功能来进行处理,如Map、Reduce、Join、Window等,处理的结果数据能够存入文件系统、数据库。还可以直接使用内置的机器学习算法、图形处理算法来处理数据。
Spark Streaming的数据处理流程如图所示,接收到实时数据后,首先对数据进行分批次处理,然后传给Spark Engine处理,最后生成该批次最后的结果。Spark Streaming提供一种名为离散流(DStream)的高级抽象连续数据流。DStream直接支持Kafka、Flume的数据源创建,或者通过高级操作其他DStream创建,一个DStream是一个序列化的RDD。
Spark Streaming 图示:

3. Spark MLlib
ML MLlib是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。MLlib目前支持4种常见的机器学习问题:二元分类、回归、聚类和协同过滤,以及一个底层的梯度下降优化基础算法。MLlib基于RDD,天生就可以与Spark SQL、GraphX、Spark Streaming无缝集成,MLlib是MLBase的一部分,MLBase通过边界定义,力图将MLBase打造成一个机器学习平台,让机器学习开发的门槛更低,让一些并不了解机器学习的用户也能方便地使用MLBase这个工具来处理自己的数据。MLlib支持将本地向量和矩阵存储在单个机器中,也包括有一个或更多的RDD支持的分布式矩阵。在目前的实现中,本地向量和矩阵都是为公共接口服务的简单数据模式,MLlib使用了线性代数包Breeze。在监督学习中使用到的样本在MLlib中成为标记点。Spark MLlib架构由底层基础、算法库和应用程序三部分构成。底层基础包括Spark的运行库、进行线性代数相关技术的矩阵库和向量库。算法库包括Spark MLlib实现的具体机器学习算法,以及为这些算法提供的各类评估方法;主要实现算法包括建立在广义线性回归模型的分类和回归,以及协同过滤、聚类和决策树。在最新的Spark 1.5.0版本中还新增了基于前馈神经网络的分类器算法MultilayerPerceptronClassifier(MLPC),频繁项挖掘算法PrefixSpan、AssociationRules,实现Kolmogorov-Smirnov检验等等算法,随着版本的演进,算法库也会越来越强大。应用程序包括测试数据的生成以及外部数据的加载等功能。Spark的ML库基于DataFrame提供高性能API,帮助用户创建和优化实用的机器学习流水线(pipeline),包括特征转换独有的Pipelines API。相比较MLlib,变化主要体现在:
1)从机器学习的Library开始转向构建一个机器学习工作流的系统,ML把整个机器学习的过程抽象成Pipeline,一个Pipeline是由多个Stage组成,每个Stage是Transformer或者Estimator。
2)ML框架下所有的数据源都是基于DataFrame,所有模型也尽量都基于Spark的数据类型表示,ML的API操作也从RDD向DataFrame全面转变。
4. GraphX
从社交网络到语言建模,图数据规模和重要性的不断增长,推动了数不清的新型并行图系统(例如,Giraph和GraphLab)的发展。通过限制可以表达的计算类型和引入新的技术来分割和分发图,这些系统可以以高于普通的数据并行系统几个数量级的速度执行复杂的图算法,如图基于GraphX的并行图计算与其他方式的比较 GraphX是用于图和并行图计算的新Spark API。从上层来看,GraphX通过引入弹性分布式属性图(resilient distributed property graph)扩展了Spark RDD。这种图是一种伪图,图中的每个边和节点都有对应的属性。为了支持图计算,GraphX给出了一系列基础的操作(例如,subgraph、joinVertices、和MapReduceTriplets)以及基于Pregel API的优化变体。除此之外,GraphX还包含了一个不断扩展的图算法和构建器集合,以便简化图分析的任务。
图计算处理示例

5. SparkR SparkR
AMPLab发布的一个R开发包,为Apache Spark提供了轻量的前端。SparkR提供了Spark中弹性分布式数据集(RDD)的API,用户可以在集群上通过R shell交互性地运行Job。例如,我们可以在HDFS上读取或写入文件,也可以使用lapply函数进行方法调用,定义对应每一个RDD元素的运算。
6. Tachyon
Tachyon是一个分布式内存文件系统,可以理解为内存中的HDFS。为了提供更高的性能,将数据存储剥离Java Heap。用户可以基于Tachyon实现RDD或者文件的跨应用共享,并提供高容错机制,保证数据的可靠性。
7. Mesos
Mesos是一个资源管理框架,提供类似于YARN的功能。用户可以在其中插件式地运行Spark、MapReduce、Tez等计算框架的任务。Mesos会对资源和任务进行隔离,并实现高效的资源任务调度。
8. BlinkDB
BlinkDB是一个用于在海量数据上进行交互式SQL的近似查询引擎。它允许用户通过在查询准确性和查询响应时间之间做出权衡,完成近似查询。其数据的精度被控制在允许的误差范围内。为了达到这个目标,BlinkDB的核心思想是:通过一个自适应优化框架,随着时间的推移,从原始数据建立并维护一组多维样本;通过一个动态样本选择策略,选择一个适
当大小的示例,然后基于查询的准确性和响应时间满足用户查询需求。
11. Spark应用场景
Spark使用了内存分布式数据集,除了能够提供交互式查询外,还优化了迭代工作负载,在Spark SQL、Spark Streaming、MLlib、GraphX都有自己的子项目。在互联网领域,Spark在快速查询、实时日志采集处理、业务推荐、定制广告、用户图计算等方面都有相应的应用。国内的一些大公司,比如阿里巴巴、腾讯、Intel、网易、科大讯飞、百分点科技等都有实际业务运行在Spark平台上。下面简要说明Spark在各个领域中的用途。
1. 快速查询系统 基于日志数据的快速查询系统业务构建于Spark之上,利用其快速查询以及内存表等优势,能够承担大部分日志数据的即时查询工作;在性能方面,普遍比Hive快2~10倍,如果使用内存表的功能,性能将会比Hive快百倍。
2. 实时日志采集处理 通过Spark Streaming实时进行业务日志采集,快速迭代处理,并进行综合分析,能够满足线上系统分析要求。
3. 业务推荐系统 使用Spark将业务推荐系统的小时和天级别的模型训练转变为分钟级别的模型训练,有效优化相关排名、个性化推荐以及热点点击分析等。
4. 定制广告系统 在定制广告业务方面需要大数据做应用分析、效果分析、定向优化等,借助Spark快速迭代的优势,实现了在“数据实时采集、算法实时训练、系统实时预测”的全流程实时并行高维算法,支持上亿的请求量处理;模拟广告投放计算效率高、延迟小,同MapReduce相比延迟至少降低一个数量级。
5. 用户图计算 利用GraphX解决了许多生产问题,包括以下计算场景:基于度分布的中枢节点发现、基于最大连通图的社区发现、基于三角形计数的关系衡量、基于随机游走的用户属性传播等。
tui
推
jian
荐
hao
好
wen
文


点击阅读原文,交个朋友,一起进步吧!
不是大数据同行也没关系,帮忙转发给更多朋友!谢谢。




