一、Spark 是什么及其特点
Spark是基于内存计算的大数据并行计算框架,可用于构架大型的、低延迟的数据分析应用程序。
Spark具有如下几个主要特点:
运行速度快:使用DAG执行引擎以支持循环数据流与内存计算。
容易使用:支持使用Scala、Java、Python和R语言进行编程,可以通过Spark Shell进行交互式编程
通用性:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件
可融合性或叫运行模式多样性: Spark 可以非常方便地与其他的开源产品进行融合。
作为它的资源管理和调度器,并且可以处理所有Hadoop 支持的数据,
包括 HDFS 、 HBase 和 Cassandra 等。
这对于已经部署Hadoop 集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理能力。
二、Spark与Hadoop的对比
Hadoop 存在的缺点:
表达能力有限,只提供了Map与Reduce难以表达过于复杂的计算模型。
磁盘开销过大:计算过程会将中间过程写入磁盘,下个过程再从磁盘中取出。
高延迟:任务之间的衔接涉及IO开销;下个任务的执行依赖于上个任务的结果,这样就造成了其无法完成过于复杂、多阶段的计算任务。
相比于Hadoop MapReduce,Spark主要具有如下优点:
Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操
作类型,编程模型比Hadoop MapReduce更灵活
Spark提供了内存计算,可将中间结果放到内存中,对于迭代运算效率更高
Spark基于DAG的任务调度执行机制,要优于Hadoop MapReduce的迭代执行机制
Hadoop与Spark的执行流程对比如下图:
三、Spark 使用场景
在实际应用中,大数据处理主要包括以下三个类型:
复杂的批量数据处理:时间跨度通常在数十分钟到数小时之间;
基于历史数据的交互式查询:时间跨度通常在数十秒到数分钟之间;
基于实时数据流的数据处理:时间跨度通常在数百毫秒到数秒之间。
当同时存在以上三种场景时,就需要同时部署三种不同的软件
比如: MapReduce / Impala / Storm
这样做难免会带来一些问题:
不同场景之间输入输出数据无法做到无缝共享,通常需要进行数据格式的转换
不同的软件需要不同的开发和维护团队,带来了较高的使用成本
比较难以对同一个集群中的各个系统进行统一的资源协调和分配
Spark所提供的生态系统足以应对上述三种场景,即同时支持批处理、交互式查询和流数据处理
Spark生态系统组件的应用场景
四、Spark 生态系统
Spark的生态系统主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX 等组件;
BDAS(Berkeley Data Analytics Stack):伯克利数据分析软件栈
五、Spark 运行架构
Spark 基本概念:
RDD:是Resillient Distributed Dataset(弹性分布式数据集)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。
DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系。
Application:用户编写的Spark应用程序。
Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task。
Task:运行在Executor上的工作单元 。
Job:一个Job包含多个RDD及作用于相应RDD上的各种操作。
Stage:是Job的基本调度单位,一个Job会分为多组Task,
每组Task被称为Stage,
或者也被称为TaskSet,代表了一组关联的、
相互之间没有Shuffle依赖关系的任务组成的任务集。
Spark 运行架构的设计:
1、Cluster Manager : 集群资源管理器,可以是自带的Mesos 也可以是Yarn
2、Worker Node : 运行作业任务的工作节点
3、Driver :每个应用的任务控制节点
4、Executor :每个工作节点负责具体任务的执行过程
与Hadoop MapReduce计算框架相比,Spark所采用的Executor有两个优点:
一是利用多线程来执行具体的任务,减少任务的启动开销
二是Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,有效减少IO开销。
一个Application由一个Driver和若干个Job构成,一个Job由多个Stage构成,一个Stage由多个没有Shuffle关系的Task组成。
当执行一个Application时,Driver会向集群管理器申请资源,
启动Executor,并向Executor发送应用程序代码和文件,
然后在Executor上执行Task,运行结束后,执行结果会返回给Driver,或者写到HDFS或者其他数据库中。
过程解说:
(1)首先为应用构建起基本的运行环境,即由Driver创建一个SparkContext,进行资源的申请、任务的分配和监控。
(2)资源管理器为Executor分配资源,并启动Executor进程。
(3)SparkContext根据RDD的依赖关系构建DAG图,
DAG图提交给DAGScheduler解析成Stage,
然后把一个个TaskSet提交给底层调度器TaskScheduler处理;
Executor向SparkContext申请Task,Task Scheduler将Task发放给 Executor运行,并提供应用程序代码。
(4)Task在Executor上运行,把执行结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源
总体而言,Spark运行架构具有以下特点:
(1)每个Application都有自己专属的Executor进程,并且该进程在Application运行期间一直驻留。Executor进程以多线程的方式运行Task。
(2)Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可。
(3)Task采用了数据本地性和推测执行等优化机制。
数据本地性指的是在计算过程中会优先选择本节点中的数据进行计算。
推测执行指的是在计算过程中,当Task任务在当前节点没有资源执行时,
Task会进行推测是将数据移动到另一个节目效率高还是等当前节点资源释放的效率高,如果等当前节点释放再执行效率高则不进行数据转移。
---------------------
作者:在屋顶唱歌-