Spark软件栈



* Spark Core:

包含Spark的基本功能,包含任务调度,内存管理,容错机制等,内部定义了RDDs(弹性分布式数据集),提供了很多APIs来创建和操作这些RDDs。为其他组件提供底层的服务。

* Spark SQL:
Spark处理结构化数据的库,就像Hive SQL,Mysql一样,企业中用来做报表统计。

* Spark Streaming:
实时数据流处理组件,类似Storm。Spark Streaming提供了API来操作实时流数据。企业中用来从Kafka接收数据做实时统计。

* MLlib:
一个包含通用机器学习功能的包,Machine learning
lib包含分类,聚类,回归等,还包括模型评估和数据导入。MLlib提供的上面这些方法,都支持集群上的横向扩展。

* Graphx:
处理图的库(例如,社交网络图),并进行图的并行计算。像Spark Streaming,Spark SQL一样,它也继承了RDD
API。它提供了各种图的操作,和常用的图算法,例如PangeRank算法。


Spark提供了全方位的软件栈,只要掌握Spark一门编程语言就可以编写不同应用场景的应用程序(批处理,流计算,图计算等)。Spark主要用来代替Hadoop的MapReduce部分。

Hadoop MapReduce缺点:

* 表达能力有限
* 磁盘IO开销大,任务之间的衔接涉及IO开销
* 延迟高,Map任务要全部结束,reduce任务才能开始。
Spark借鉴Hadoop MapReduce优点的同时,解决了MapReuce所面临的问题,有如下优点:

* Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供多种数据集操作类型,编程模型比Hadoop
MapReduce更灵活。
* Spark提供了内存计算,可将中间结果放到内存中,对于迭代运算效率更高
* Spark基于DAG的任务调度执行机制,要优于Hadoop MapReduce的迭代执行机制。
Spark运行架构及流程



基本概念:

* Application:用户编写的Spark应用程序。
*
Driver:Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭。
* Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task。
* RDD:弹性分布式数据集,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。
* DAG:有向无环图,反映RDD之间的依赖关系。
* Task:运行在Executor上的工作单元。
* Job:一个Job包含多个RDD及作用于相应RDD上的各种操作。
*
Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage,或者也被称为TaskSet,代表一组关联的,相互之间没有Shuffle依赖关系的任务组成的任务集。
* Cluter Manager:指的是在集群上获取资源的外部服务。目前有三种类型
1) Standalon : spark原生的资源管理,由Master负责资源的分配
2) Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架
3) Hadoop Yarn: 主要是指Yarn中的ResourceManager
一个Application由一个Driver和若干个Job构成,一个Job由多个Stage构成,一个Stage由多个没有Shuffle关系的Task组成。


当执行一个Application时,Driver会向集群管理器申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行Task,运行结束后,执行结果会返回给Driver,或者写到HDFS或者其它数据库中。

与Hadoop MapReduce计算框架相比,Spark所采用的Executor有两个优点:

* 利用多线程来执行具体的任务减少任务的启动开销;
* Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,有效减少IO开销;
Spark运行基本流程:



* 为应用构建起基本的运行环境,即由Driver创建一个SparkContext进行资源的申请、任务的分配和监控
* 资源管理器为Executor分配资源,并启动Executor进程
*
SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAGScheduler解析成Stage,然后把一个个TaskSet提交给底层调度器TaskScheduler处理。
Executor向SparkContext申请Task,TaskScheduler将Task发放给Executor运行并提供应用程序代码。
* Task在Executor上运行把执行结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源。
Spark运行架构特点:

*
每个Application都有自己专属的Executor进程,并且该进程在Application运行期间一直驻留。Executor进程以多线程的方式运行Task。
* Spark运行过程与资源管理器无关,只要能够获取Executor进程并保存通信即可。
* Task采用数据本地性和推测执行等优化机制。
RDD


一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群的不同节点上进行并行计算。

RDD提供了一种高端受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改
,只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作(如map,join和group by)而创建得到新的RDD。

RDD执行过程:

* RDD读入外部数据源进行创建
* RDD经过一系列的转换(Transformation)操作,没一次都会产生不同的RDD供下一个转换操作使用
* 最后一个RDD经过“动作”操作进行转换并输出到外部数据源
优点:惰性调用、管道化、避免同步等待,不需要保存中间结果。这和Java8中Stream的概念极其类似。

RDD特性

* 高效的容错性,根据DAG图恢复分区,数据复制或者记录日志
RDD血缘关系、重新计算丢失分区、无需回滚系统、重算过程在不同节点之间并行、只记录粗粒度的操作
* 中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销
* 存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化
窄依赖和宽依赖

* 窄依赖:表现为一个父RDD的分区对应于一个子RDD的分区或者多个父RDD的分区对应于一个子RDD的分区。
* 宽依赖:表现为存在一个父RDD的一个分区对应一个子RDD的多个分区。

Stage的划分

Spark通过分析各个RDD的依赖关系生成了DAG,在通过分析各个RDD中的分区之间的依赖关系来决定如何划分Stage。具体划分方法如下:

* 在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到Stage中;
* 将窄依赖尽量划分在同一个Stage中,可以实现流水线计算

此文主要参考厦门大学Spark基础教程

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信