spark原理:概念与架构、工做机制

1、HadoopSparkStorm三大框架比较java

Hadoop:离线海量数据批处理,基于磁盘的python

Spark:基于内存。算法

Spark特色:运行速度快,使用DAG执行引擎以支持循环数据流与内存计算,shell

二、容易使用:多种语言编程,经过spark shell进行交互式编程编程

三、通用性:提供了完整而强大的技术栈,包括sQL查询、流式计算、机器学习和图算法组件多线程

四、运行模式多样:可运行在独立集群模式中,能够运行与hadoop中,也能够运行在AmazonEC2等云环境中,并能够访问HDFS、HBase、Hive等多种数据源架构

Scala:多范式编程语言并发

函数式编程(lisp语言,Haskell语言)app

运行于java平台(jvm,虚拟机),兼容java程序框架

scala特性:具有强大的并发性,支持函数式编程,支持分布式系统,

语法简洁,能提供优雅的API

scala兼容java,运行速度快,能融合到hadoop生态圈中。

scala是spark的主要编程语言,提供REPL(交互式解释器),提升程序开发效率

SparkHadoop的对比

hadoop的缺点:一、表达能力有限,只能用map和reduce来表示

二、磁盘开销大

三、延迟高,因为要写磁盘,所以延迟高

四、任务之间的衔接涉及IO开销

Spark相对于hadoop MapReduce的优势:

一、不局限于MapReduce,提供多种数据集操做类型,编程模型比Hadoop MapReduce更灵活

二、spark提供内存计算,可将中间结果放到内存中,对于迭代运算效率更高

三、基于DAG的任务调度机制,效率更高

 

2、Spark生态系统

spark生态系统主要包含了Spark CoreSparkSQLSparkStreamingMLLibGraphX等组件。

一、海量数据批量处理 MapReduce

二、基于历史数据的交互式查询 Cloudera Impala

三、实时数据流的处理

spark能够部署在资源管理器Yarn之上,提供一站式大数据解决方案

spark能够同时支持海量数据批量处理、历史数据分析、实时数据处理

spark生态系统已经成为伯克利数据分析软件栈(BDAS)

 

 

Spark生态系统组件的应用场景

3、Spark运行架构

1、基本概念:RDDDAGExecutorApplicationTaskJobStage

RDD:弹性分布式数据集的简称,是分布式内存的一个抽象概念 ,提供了一个高度共享的内存模型。

和MapReduce相比有两个优势

一、利用多线程来执行具体任务,减小任务的启动开销。

二、同时利用内存和磁盘做为共同的存储设备,有限的减小IO开销。

 

2Spark运行基本原理

一、构建基本的运行环境,由dirver建立一个SparkContext,分配并监控资源使用状况

二、资源管理器为其分配资源,启动Excutor进程

三、SparkContext根据RDD 的依赖关系构建DAG图,GAG图提交给DAGScheduler解析成stage,而后提交给底层的taskscheduler处理。

executor向SparkContext申请task,taskscheduler 将task发放给Executor运行并提供应用程序代码

四、Task在Executor运行把结果反馈给TaskScheduler,一层层反馈上去。最后释放资源

运行架构特色:多线程运行、运行过程与资源管理器无关、Task采用了数据本地性和推测执行来优化。

3RDD概念

设计背景,迭代式算法,若采用MapReduce则会重用中间结果;MapReduce不断在磁盘中读写数据,会带来很大开销。

RDD的典型执行过程

1)读入外部数据源进行建立,分区

2)RDD通过一系列的转化操做,每一次都会产生不一样的RDD供给下一个转化擦操做使用

3)最后一个RDD通过一个动做操做进行计算并输出到外部数据源

优势:惰性调用、调用、管道化、避免同步等待,不须要保存中间结果     

高效的缘由:

1)容错性:现有方式是用日志记录的方式。而RDD具备天生的容错,任何一个RDD出错,均可以去找父亲节点,代价低。RDD的每次转换都会生成一个新的RDD,因此RDD之间就会造成相似于流水线同样的先后依赖关系。在部分分区数据丢失时,Spark能够经过这个依赖关系从新计算丢失的分区数据,而不是对RDD的全部分区进行从新计算。

2)中间结果保存到内存,避免了没必要要的内存开销

3)存放的数据能够是java对象,避免了对象的序列化和反序列化。

 

RDD的依赖关系:窄依赖和宽依赖

窄依赖:(narrow dependency)是指每一个父RDD的一个Partition最多被子RDD的一个Partition所使用,例如map、filter、union等操做都会产生窄依赖;(独生子女)即rdd中的每一个partition仅仅对应父rdd中的一个partition。rdd里面的partition只去向子rdd里的某一个partition!这叫窄依赖,若是父rdd里面的某个partition会去子rdd里面的多个partition,那它就必定是宽依赖!

宽依赖(shuffle dependency):是指一个父RDD的Partition会被多个子RDD的Partition所使用,例如groupByKey、reduceByKey、sortByKey等操做都会产生宽依赖;(超生)每个父rdd的partition数据都有可能传输一部分数据到子rdd的每个partition中,即子rdd的多个partition依赖于父rdd。宽依赖划分红一个stage!!!

做用:完成Stage的划分

spark划分stage的总体思路是:从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入该stage中。所以在上图中RDD C,RDD D,RDD E,RDDF被构建在一个stage中,RDD A被构建在一个单独的Stage中,而RDD B和RDD G又被构建在同一个stage中。

Stage的划分:

ShuffleMapStage和ResultStage:

简单来讲,DAG的最后一个阶段会为每一个结果的partition生成一个ResultTask,即每一个Stage里面的Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的!而其他全部阶段都会生成ShuffleMapTask;之因此称之为ShuffleMapTask是由于它须要将本身的计算结果经过shuffle到下一个stage中;也就是说上图中的stage1和stage2至关于mapreduce中的Mapper,而ResultTask所表明的stage3就至关于mapreduce中的reducer。

4、Spark SQL

Spark的另一个组件。先说一下shark(Hive on Spark),为了实现与Hive兼容,在HiveQL方面重用了HIveQL的解析、逻辑执行计划翻译等逻辑,把HiveQL操做翻译成Spark上的RDD操做。至关于在最后将逻辑计划转换为物理计划时将原来转换成MapReduce替换成了转换成Spark

 

与spark相比,sparkSQL再也不是依赖于Hive,而是造成了一套本身的SQL,只依赖了Hive解析、Hive元数据。从hql被解析成语法抽象树以后,剩下的东西所有是本身的东西,再也不依赖Hive原来的组件,增长了SchemaRDD,运行在SchemaRDD中封装更多的数据,数据分析功能更强大。同时支持更多语言,除R语言外,还支持Scala、Java、python语言。

 

5、Spark安装和部署

1Standalone 二、Spark on mesos 三、spark on yarn

企业中的应用部署

6、spark编程

编写应用程序

一、加载文件到RDD中

二、设置环境变量

三、建立SparkContext

四、转换操做

五、Action计算操做1

六、建立sbt文件

七、使用sbt对其进行打包

八、把jar包提交到spark中运行。

相关文章
相关标签/搜索