Apache Spark
Apache Spark
一、概述
Spark是⼀个快如闪电的统⼀分析引擎(计算框架)⽤于⼤规模数据集的处理。Spark在做数据的批处理
计算,计算性能⼤约是Hadoop MapReduce的10~100倍,因为Spark使⽤⽐较先进的基于 DAG 任务调
度,可以将⼀个任务拆分成若⼲个阶段,然后将这些阶段分批次交给 集群计算节点 处理。
1、MapReduce VS Spark
MapReduce作为第⼀代⼤数据处理框架,在设计初期只是为了满⾜基于海量数据级的海量数据计算的迫
切需求。⾃2006年剥离⾃Nutch(Java搜索引擎)⼯程,主要解决的是早期⼈们对⼤数据的初级认知所
⾯临的问题。
整个MapReduce的计算实现的是基于磁盘的IO计算,随着⼤数据技术的不断普及,⼈们开始重新定义⼤
数据的处理⽅式,不仅仅满⾜于能在合理的时间范围内完成对⼤数据的计算,还对计算的实效性提出了
更苛刻的要求,因为⼈们开始探索使⽤Map Reduce计算框架完成⼀些复杂的⾼阶算法,往往这些算法通
常不能通过1次性的Map Reduce迭代计算完成。由于Map Reduce计算模型总是把结果存储到磁盘中,每次迭代都需要将数据磁盘加载到内存,这就为后续的迭代带来了更多延⻓。
2009年Spark在加州伯克利AMP实验室诞⽣,2010⾸次开源后该项⽬就受到很多开发⼈员的喜爱,2013年 6⽉份开始在Apache孵化,2014年2⽉份正式成为Apache的顶级项⽬。Spark发展如此之快是因为Spark在计算层⽅⾯明显优于Hadoop的Map Reduce这磁盘迭代计算,因为Spark可以使⽤内存对数据做计算,⽽且计算的中间结果也可以缓存在内存中,这就为后续的迭代计算节省了时间,⼤幅度的提升了针对于海量数据的计算效率。
Spark也给出了在使⽤MapReduce和Spark做线性回归计算(算法实现需要n次迭代)上,Spark的速率⼏乎是MapReduce计算10~100倍这种计算速度。
不仅如此Spark在设计理念中也提出了 One stack ruled them all 战略,并且提供了基于Spark批处理⾄上的计算服务分⽀例如:实现基于Spark的交互查询、近实时流处理、机器学习、Grahx 图形关系存储等。
从图中不难看出Apache Spark处于计算层,Spark项⽬在战略上启到了承上启下的作⽤,并没有废弃原有以hadoop为主体的⼤数据解决⽅案。因为Spark向下可以计算来⾃于HDFS、HBase、Cassandra和亚马逊S3⽂件服务器的数据,也就意味着使⽤Spark作为计算层,⽤户原有的存储层架构⽆需改动。
2、计算流程
因为Spark计算是在MapReduce计算之后诞⽣,吸取了MapReduce设计经验,极⼤地规避了MapReduce计算过程中的诟病,先来回顾⼀下MapReduce计算的流程。
总结⼀下⼏点缺点:
1)MapReduce虽然基于⽮量编程思想,但是计算状态过于简单,只是简单的将任务分为Map state和Reduce State,没有考虑到迭代计算场景。
2)在Map任务计算的中间结果存储到本地磁盘,IO调⽤过多,数据读写效率差。
3)MapReduce是先提交任务,然后在计算过程中申请资源。并且计算⽅式过于笨重。每个并⾏度都是由⼀个JVM进程来实现计算。
通过简单的罗列不难发现MapReduce计算的诟病和问题,因此Spark在计算层⾯上借鉴了MapReduce计算设计的经验,提出了DGASchedule和TaskSchedual概念,打破了在MapReduce任务中⼀个job只⽤MapState和Reduce State的两个阶段,并不适合⼀些迭代计算次数⽐较多的场景。因此Spark 提出了⼀个⽐较先进的设计理念,任务状态拆分,Spark在任务计算初期⾸先通过DGASchedule计算任务的State,将每个阶段的Sate封装成⼀个TaskSet,然后由TaskSchedual将TaskSet提交集群进⾏计算。可以尝试将Spark计算的流程使⽤⼀下的流程图描述如下:
相⽐较于MapReduce计算,Spark计算有以下优点:
1)智能DAG任务拆分,将⼀个复杂计算拆分成若⼲个State,满⾜迭代计算场景
2)Spark提供了计算的缓冲和容错策略,将计算结果存储在内存或者磁盘,加速每个state的运⾏,提升运⾏效率
3)Spark在计算初期,就已经申请好计算资源。任务并⾏度是通过在Executor进程中启动线程实现,相⽐较于MapReduce计算更加轻快。
提示 ⽬前Spark提供了Cluster Manager的实现由Yarn、Standalone、Messso、kubernates等实现。其中企业常⽤的有Yarn和Standalone⽅式的管理。