1、Spark基本特性¶
1.高效性。Spark是基于内存的计算框架,数据处理过程中是将中间数据集放到内存中,运行速度提高100倍。
2.通用性。Spark提供了统一的解决方案。Spark Core提供内存计算框架、SparkStreaming的实时处理应用、Spark SQL的即时查询、MLlib的机器学习和GraphX的图处理,能够无缝的集成并提供一站式解决平台。
3.兼容性。Spark具有很强的适应性,能够读取HDFS、Cassandra、HBase、S3为持久层读写原生数据,能够以Mesos、YARN和自身携带的Standalone作为资源管理器调度job,来完成Spark应用程序的计算。
4.易用性。Spark支持Java、Python和Scala的API和丰富的内置库,实现快速构建程序的工作。而且Spark支持交互式的Python和Scala的shell,这样使应用和验证更加灵活。
2、RDD介绍¶
在实际项目工作中,ETL工作通过会分为多个阶段,不同计算阶段之间会重复使用中间数据结果。MapReduce框架将Map后的中间结果的写入磁盘,大量磁盘I/O导致数据处理速度变慢,而RDD的出现弥补了这个缺点。Spark建立在统一的抽象RDD上,使得各个组件之间紧密集成,高效完成数据处理任务。
2.1 RDD概念¶
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。 RDD提供了一种抽象的数据架构,根据业务逻辑将现有RDD通过转换操作变成新的RDD,这一系列不同的RDD相互依赖实现的管道化,惰性机制的存在避免了多次转换过程中的数据同步等待,且中间数据无须保存,直接通过管道从上一个操作到下一个操作,减少了数据复制和磁盘I/O。
2.2 RDD的创建方式¶
(1)读取外部文件
由外部存储系统的数据集创建(如HDFS等文件系统支持的数据集)。
(2)并行化方式创建RDD
通过Scala集合或数组以并行化的方式创建RDD。
(3)RDD转换
对现有的RDD进行转换操作可创建新的RDD。
2.3 RDD的操作方式¶
(1)Transformation(转换)操作
Transformation是加载一个多个RDD,从当前的RDD转换生成新的目标RDD。而且转换动作是惰性的,它不会立刻触发任何数据处理的操作,具有延迟加载的特点。主要是用于标记读取位置、要做的动作,指定RDD之间的相互依赖关系。常见转换算子有map、filter、groupBy、join等。
(2)Action(动作)操作
Action是指对目标RDD执行某个动作,触发RDD的计算并对计算结果进行操作,结果会返回给用户或者保存在外部存储器中。常见行动算子有count、collect等。
2.4 RDD的执行过程¶
RDD的执行过程主要包括三部分,分别是RDD的创建、转换和计算。执行过程如图所示。
RDD详细执行流程如下:
(1)RDD创建。从外部存储系统的数据集输入数据创建RDD。
(2)RDD转换。根据业务逻辑,将现有RDD通过一系列转换操作生成新的RDD。整个过程没有计算发生,但RDD标记了读取的位置和要做的操作,Spark也只是记录了RDD间的生成轨迹和依赖关系。
(3)RDD计算。最后一个RDD由行动操作触发计算时,Spark会根据RDD之间的依赖关系生成有向无环图DAG,DAG描述了RDD之间的血缘关系。在一系列的计算结束后,计算结果会输出到外部数据源上。
3、Spark运行机制¶
Spark作业中最高层的两个实体是Driver和Executor。Driver的作用是运行应用程序中的Main函数,创建SparkContext,其中运行着DAG Scheduler、Task Scheduler和SchedulerBackend等组件。而Executor专属于应用,在Application运行期间执行应用任务。具体运行过程如图所示:
1.提交Spark作业,根据提交的参数设置,Driver会托管应用程序Application,创建SparkContext。
2.SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源。
3.资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上。
4.SparkContext调用runJob,并将调用传递给DAG Scheduler。DAG Scheduler将这个Job分解成多个stage,stage划分完之后又将每个stage划分为多个task,其中DAG Scheduler会基于数据所在位置为每个task赋予位置来执行,保证任务调度过程中数据本地化。
5.DAG Scheduler将这个任务集合传递给Task Scheduler,然后Task Scheduler会基于Task位置构建由Task到Executor的映射,将Task按照制定的调度策略分发到Executor中执行,直至任务集合全部完成。
6.整个调度过程中,Scheduler backend负责提供可用资源,分别对接不同的资源管理系统。
4、Yarn上运行Spark¶
我们知道,Spark本身的独立模式中,因为是单独部署到一个集群中,不依赖其他资源管理系统,集群资源调度依赖Master节点,只能进行简单的固定资源分配策略,资源不够的时候可能就要排队等待。而在Yarn这个组件支持动态资源调度,可以很好的spark程序资源运用不灵活的问题。当然啦,Yarn上不止可以运行Spark,还能运行其他计算框架,如MapReduce、Hive等。
(1)运行模式
集群模式:Spark程序启动时,Yarn会在集群的某个节点上为它启动一个Master进程,然后Driver会运行在Master进程内部并由这个Master进程启动Driver程序,客户端提高作业后,不需要等待Spark进程结束。
客户端模式:Spark程序启动时,Yarn会在集群的某个节点上为它启动一个Master进程,但是Driver会运行在本地而不在这个Master进程内部运行,仅仅是利用Master来申请资源,直到程序运行结束。
(2)两者区别
1.Spark在Yarn集群模式下,Driver进程在集群上的某个节点上运行,基本不占用本地资源。而客户端模式下,Driver运行在本地,会对本地资源造成一些压力。
2.集群模式适用于生产环境的运行方式,易于保留日志文件以备检查。客户端模式适合需要交互式计算的运行方式,任何调试输出都是立即可见的。
5、总结¶
本篇主要介绍了Spark的基本概念、RDD的特性、Spark的运行机制以及Spark在Yarn上的运用,后续会持续更新。