spark简介
spark是一个快速、通用的大数据分析计算引擎,Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架。
spark相对于mapReduce的优势
中间结果输出
基于MapReduce的计算引擎会将中间结果输出到磁盘上,进行存储和容错。当一些查询翻译成MapReduce任务时,往往会产生多个Stage,文件系统HDFS来存储每一个Stage的输出结果。
Spark将执行模型抽象为DAG(有向无环图),可以将多Stage的任务串联或者并行执行,无需将Stage中间结果输出到HDFS中,从而不再需要读写HDFS,减少了磁盘IO
数据格式和内存布局
MapReduce Schema On Read处理方式会引起较大的处理开销。Spark抽象出分布式内存存储结构弹性分布式数据集RDD进行数据存储。RDD能支持粗粒度写操作,且对于读操作可以精确到每条记录。
Spark可以控制数据在不同节点上的分区,用户可以自定义分区策略。
执行策略
MapReduce在数据Shuffle之前花费了大量的时间来排序,Spark则可减轻上述问题带来的开销。由于并不是所有的任务都需要排序,Spark支持基于Hash的分布式聚合,调度中采用DAG,每一轮次输出结果在内存缓存
任务调度的开销
MapReduce系统是为了运行长达数小时的批量作业而设计的。而Spark采用了事件驱动的类库AKKA来启动任务,通过线程池复用线程来避免进程或线程启动和切换开销。
Spark 是用 Scala 语言实现的。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为,spark可用来构建大型的、低延迟的数据分析应用程序。
spark构成
spark生态圈包括Spark的任务调度、内存管理、容错机制等功能
- Spark Core:Spark的基础核心功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。且定义了RDD。其他功能都是在该基础上进行扩展的
- Spark SQL:Spark用来操作结构化数据的组件,支持通过SQL查询数据或者Hive SQL来查询数据,并且支持多种数据源
- Spark Streaming:Spark用于实时流处理的组件,Spark Streaming支持Kafka、Flume、ZeroMQ、HDFS等多种数据输入源,使用诸如map()、join()、window()等高级函数进行处理,并支持将处理后的最终结果存储到文件系统、数据库等
- Spark MLib:Spark提供的用于机器学习的算法库,如分类、聚类、回归及协同过滤等算法,还包括模型评估及数据导入等。
- Spark GraphX:Spark提供的分布式图处理框架,能来创建一个顶点和边都包含任意属性的有向图,提供与图计算和图挖掘相关的接口,包括常用图计算的算法。
Spark 将内存数据抽象为弹性分布式数据集(resilient distributed dataset,RDD),可以理解为RDD是Spark分布式计算的数据结构,表示一个不可变、可分区、可并行操作、有容错机制的数据集合。RDD提供了transformations和actions两种类型的操作。transformations操作是得到一个新的RDD,如map、filter、groupByKey、flatMap、join、union等;actions操作是得到一个值或者一个计算结果,如reduce、collect、count、take、first、saveAsTestFile等。所有的transformations操作都是采用惰性策略,只有在actions类操作被提交时才会触发执行计算,而只将transformations类操作提交时是不会触发计算的。
而Spark Streaming则提供了一个叫做DStream(Discretized Stream)的高级抽象,DStream表示一个持续不断输入的数据流,一个DStream实际上是由一个RDD序列组成的,可由基于Kafka、HDFS、Flume、Socket等输入流创建。
Spark采用Master-Slave架构模式。Master对应集群中含有Master进程的节点,是Spark集群的主控节点;Slave是集群中含有Worker进程的节点,在集群模式下Worker是集群中任何可以运行Spark应用程序的节点,类似Yarn中的NodeManager节点,在基于Yarn的Spark集群模式Worker指的就是NodeManager节点,在单机模式下Worker负责管理本地节点资源,接收Master的命令进行状态汇报。
Spark整体架构中还包含了Driver、Executor、Client几个角色。Driver是应用程序逻辑执行起点,负责作业的解析、生成作业stage,并将作业调度到Executor上执行;Executor是Spark应用程序运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将执行状态存储在内存或者磁盘上,在Yarn模式下,进程名为CoarseGrainedExecutorBackend;Client则是客户端进程,负责提交作业到Master
基本组件
- ClusterManger 在Standalone模式中为Master节点,控制整个集群,监控Worker。在YARN模式中为资源管理器
- Worker 从节点,负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制
- Driver 运行Application的main方法并创建SparkContext
- Executor 执行器,在worker node上执行任务的组件,用于启动线程池运行任务。每个Application拥有独立的一组Executors
- Sparkontext 整个应用的上下文,控制应用的生命周期
- RDD Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph
- DAG Scheduler 根据作业构建基于Stage的DAG,并提交Stage给TaskScheduler
- TaskScheduler 将任务分发给Executor执行
- SparkEnv 线程级别的上下文,存储运行时的重要组件的引用,如:
- MapOutPutTracker 负责Shuffle元信息的存储
- BroadcastManager 负责广播变量的控制与元信息的存储
- BlockManger 负责存储管理、创建和查找块
- MetricsSystem 监控运行时性能指标信息
- SparkConf 负责存储配置信息
整体流程
Client提交应用,Master找到一个Worker启动Driver,Driver向Master或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAG Scheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler,由TaskScheduler提交任务给Executor执行。
spark运行模式
Spark有五种运行模式
- 本地单机模式:所有spark进程都运行在同一个JVM中。在该模式下可以通过local[n]来指定Master变量以设置并行级别,n表示线程数
- 独立部署模式:使用Spark内置的任务调度框架,通过Spark://${masterIP}:${port}来指定连接Spark集群
- 基于Yarn的集群模式:Spark运行在Yarn资源管理器上,基于Hadoop,由Yarn负责资源管理,Spark负责任务调度与计算
- 基于Mesos的集群模式:运行在Mesos资源管理器上
- 基于Amazon EC2的集群模式:在Amazon EC2云端上部署Spark环境