Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1111839
  • 博文数量: 143
  • 博客积分: 969
  • 博客等级: 准尉
  • 技术积分: 1765
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-30 12:09
文章分类

全部博文(143)

文章存档

2023年(4)

2021年(2)

2020年(4)

2019年(4)

2018年(33)

2017年(6)

2016年(13)

2014年(7)

2013年(23)

2012年(33)

2011年(14)

我的朋友

分类: 大数据

2018-07-24 19:58:02

Spark是什么

Spark是基于内存计算的大数据并行计算框架。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。Spark于2009年诞生于加州大学伯克利分校AMPLab

Sparkhadoop

更准确地说,Spark是一个计算框架,而Hadoop中包含计算框架MapReduce和分布式文件系统HDFSHadoop更广泛地说还包括在其生态系统上的其他系统,如HbaseHive等。

SparkMapReduce的替代方案,而且兼容HDFSHive等分布式存储层,可融入Hadoop的生态系统,以弥补缺失MapReduce的不足。

Spark相比Hadoop MapReduce,有如下优势:

1)中间结果输出

基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于任

务管理的考虑,当一些查询MapReduce任务时,往往会产生多个Stage,而这些串联的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果。

Spark将执行模型抽象为通用的有向无环图执行计划(DAG),这可以将多Stage的任务

串联或者并行执行,而无须将Stage中间结果输出到HDFS中。类似的引擎包括Dryad

Tez

2)数据格式和内存布局

由于MapReduce Schema on Read处理方式会引起较大的处理开销。Spark抽象出分布式内存存储结构弹性分布式数据集RDD,进行数据的存储。RDD能支持粗粒度写操作,但对于读取操作,RDD可以精确到每条记录,这使得RDD可以用来作为分布式索引。

Spark的特性是能够控制数据在不同节点上的分区,用户可以自定义分区策略,如Hash分区等。SharkSpark SQLSpark的基础之上实现了列存储和列存储压缩。

3)执行策略

MapReduce在数据Shuffle之前花费了大量的时间来排序,Spark则可减轻上述问题带来

的开销。因为Spark任务在Shuffle中不是所有情景都需要排序,所以支持基于Hash的分布式聚合,调度中采用更为通用的任务执行计划图(DAG),每一轮次的输出结果在内存缓存。

4)任务调度的开销

传统的MapReduce系统,如Hadoop,是为了运行长达数小时的批量作业而设计的,在

某些极端情况下,提交一个任务的延迟非常高。

Spark采用了事件驱动的类库AKKA来启动任务,通过线程池复用线程来避免进程或线程

启动和切换开销。

Spark架构

Spark架构采用了分布式计算中的Master-Slave模型。

Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。
     Master作为整个集群的控制器,负责整个集群的正常运行;

Worker相当于是计算节点,接收主节点命令与进行状态汇报;

Executor负责任务的执行;

Client作为用户的客户端负责提交应用,

Driver负责控制一个应用的执行,如图1-4所示。


         图1-4 Spark架构图
     Spark集群部署后,需要在主节点和从节点分别启动Master进程和Worker进程,对整个集群进行控制。在一个Spark应用的执行过程中,DriverWorker是两个重要角色。

Driver程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发,而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段,Driver会将TaskTask所依赖的filejar序列化后传递给对应的Worker机器,同时Executor对相应数据分区的任务进行处理。


Spark的架构中的基本组件


·ClusterManager:在Standalone模式中即为Master(主节点),控制整个集群,监控

Worker。在YARN模式中为ResourceManager资源管理器。

·Worker:从节点,负责控制计算节点,启动ExecutorDriver。在YARN模式中为NodeManager,负责计算节点的控制。

·Driver:运行Applicationmain()函数并创建SparkContext

·Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每

Application拥有独立的一组Executors

·SparkContext:整个应用的上下文,控制应用的生命周期。

·RDDSpark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph

·DAG Scheduler:根据作业(Job)构建基于StageDAG,并提交StageTaskScheduler

·TaskScheduler:将任务(Task)分发给Executor执行。

·SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。SparkEnv内创建并包含如下一些重要组件的引用。

·MapOutPutTracker:负责Shuffle元信息的存储。

·BroadcastManager:负责广播变量的控制与元信息的存储。

·BlockManager:负责存储管理、创建和查找块。

·MetricsSystem:监控运行时性能指标信息。

·SparkConf:负责存储配置信息。


Spark的整体流程


Client提交应用,Master找到一个Worker启动DriverDriverMaster或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGSchedulerRDD Graph转化为Stage的有向无环图提交给TaskScheduler,由TaskScheduler提交任务给Executor执行。在任务执行的过程中,其他组件协同工作,确保整个应用顺利执行。

Spark运行逻辑

如图1-5所示,在Spark应用中,整个执行流程在逻辑上会形成有向无环图(DAG)。

Action算子触发之后,将所有累积的算子形成一个有向无环图,然后由调度器调度该图上的任务进行运算。Spark的调度方式与MapReduce有所不同。Spark根据RDD之间不同的依赖关系切分形成不同的阶段(Stage),一个阶段包含一系列函数执行流水线。图中的A、B、C、D、E、F分别代表不同的RDD,RDD内的方框代表分区。数据从HDFS输入Spark,形成RDD A和RDD C,RDD C上执行map操作,转换为RDD D,RDD B和RDD E执行join操作,转换为F,而在B和E连接转化为F的过程中又会执行Shuffle,最后RDD F通过函数saveAsSequenceFile输出并保存到HDFS中。

Spark 数据存储

Spark数据存储的核心是弹性分布式数据集(RDD)。RDD可以被抽象地理解为一个大的数组(Array),但是这个数组是分布在集群上的。逻辑上RDD的每个分区叫一个

Partition

Spark的执行过程中,RDD经历一个个的Transfomation算子之后,最后通过Action算子进行触发操作。逻辑上每经历一次变换,就会将RDD转换为一个新的RDDRDD之间通过Lineage产生依赖关系,这个关系在容错中有很重要的作用。变换的输入和输出都是RDD

RDD会被划分成很多的分区分布到集群的多个节点中。分区是个逻辑概念,变换前后的新旧分区在物理上可能是同一块内存存储。这是很重要的优化,以防止函数式数据不变性(immutable)导致的内存需求无限扩张。有些RDD是计算的中间结果,其分区并不一定有相应的内存或磁盘数据与之对应,如果要迭代使用数据,可以调cache()函数缓存数据。

图为RDD的数据存储模型。


图中的RDD_1含有5个分区(p1p2p3p4p5),分别存储在4个节点(Node1node2Node3Node4)中。RDD_2含有3个分区(p1p2p3),分布在3个节点(Node1Node2Node3)中。

在物理上,RDD对象实质上是一个元数据结构,存储着BlockNode等的映射关系,以及其他的元数据信息。一个RDD就是一组分区,在物理数据存储上,RDD的每个分区对应的就是一个Block,Block可以存储在内存,当内存不够时可以存储到磁盘上。每个Block中存储着RDD所有数据项的一个子集,暴露给用户的可以是一个Block的迭代

器(例如,用户可以通过mapPartitions获得分区迭代器进行操作),也可以就是一个数据项(例如,通过map函数对每个数据项并行计算)。

如果是从HDFS等外部存储作为输入数据源,数据按照HDFS中的数据分布策略进行数据分区,HDFS中的一个Block对应Spark的一个分区。同时Spark支持重分区,数据通过Spark默认的或者用户自定义的分区器决定数据块分布在哪些节点。例如,支持Hash分区(按照数据项的Key值取Hash值,Hash值相同的元素放入同一个分区之内)和Range分区(将属于同一数据范围的数据放入同一分区)等分区策略。


阅读(1347) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~