目录
本文仅用于学习交流使用,感谢大家的阅读!
一、Spark是什么?
Spark是用于大规模数据处理的统一分析引擎。最初是由加州大学柏克莱分校AMPLab所开发。它提供了Scala,Java,Python和R中的高级API,以及优化的引擎,该引擎支持用于数据分析的通用计算图。它还支持一组丰富的高级工具,包括使用 SQL 处理结构化数据处理的 Spark SQL,用于机器学习的 MLlib,用于图计算的 GraphX,以及 Spark Streaming。
spark的一个主要特点是能够在内存中进行计算,及时依赖磁盘进行复杂的运算,相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中来说,Spark依然比MapReduce更加高效。
二、为什么要用Spark?
我们都知道Hadoop框架虽然优秀,但是也有天然的缺陷,所以Spark应运而生。比如说:
① MapReduce不能进行实时流计算。实时流处理场景需要数据处理的延迟比较低,需要达到秒级,甚至毫秒级,但是MapReduce处理时间是相对很长的。
② MapReduce不适用于交互式处理。比如说当收到查询请求,需要快速处理并返回结果,MapReduce不能快速的返回计算结果。
③MapReduce不适合处理迭代计算,迭代计算需要不断对Job调度执行,Job之间依赖度比较高,处理逻辑比较复杂。
④ MapReduce只支持Map和Reduce两种语义的操作,如果实现复杂的操作需要开发大量的Map和Reduce程序。
⑤ MapReduce处理效率低,耗费时间长,具体表现在以下几个方面:
- MapReduce是基于磁盘的,无论是MapReduce还是YARN都是将数据从磁盘中加载出来,经过DAG,然后重新写回到磁盘中。
- MapReduce计算过程中会经历Suffle阶段,Map段会将中间写入到磁盘,如果数据文件比较大,会多次写入到磁盘,产生很多小文件,当Map任务执行结束之后,会将这些小的文件合并成一个大的文件,要经历多次读取和写入磁盘的操作,非常耗时。如果一个计算逻辑需要多个MapReduce串联,后一个MapReduce任务依赖前一个MapReduce任务的计算结果,那么每个MapReduce任务计算完都会将计算结果写入到HDFS,多个MapReduce之间通过HDFS交换数据,效率非常低,耗时也很长。
- MapReduce任务的调度和启动开销也很大(由于MapReduce任务是通过进程的方式启动的),不能充分利用内存资源,而且Map端和Reduce端都需要对数据进行排序,由于MapReduce框架设计的特点决定了它在运行过程中的效率是非常低的,只能满足离线的批处理计算任务。
针对以上的一些介绍,所以MapReduce主要用于离线的分布式批处理计算,所以Spark应运而生。
三、Spark特点
① 运行速度快
Apache Spark官方介绍运行工作负载的速度提高了100倍。
Apache Spark使用最先进的DAG调度程序,查询优化程序和物理执行引擎,实现批量和流式数据的高性能。
② 使用方便
提供了丰富的开发API,可以使用Java,Scala,Python,R和SQL快速编写应用程序。推荐谁用Scala来开发,因为Spark是使用Scala语言来开发的,实现相同的功能Scala所写的代码要比Java少很多。
集成批处理、流处理、交互式计算、机器学习算法、图计算。
③ 运行方式多样(后面会详细介绍)
四、基本概念及RDD、checkpoint介绍
4.1 基本概念
(1)Application:表示你的应用程序。
(2)Driver:表示main()函数,创建SparkContext。由SparkContext负责与ClusterManager通信,进行资源的申请,任务的分配和监控等。程序执行完毕后关闭SparkContext。
(3)Executor:某个Application运行在Worker节点上的一个进程,该进程负责运行某些task,并且负责将数据存在内存或者磁盘上。在Spark on Yarn模式下,其进程名称为 CoarseGrainedExecutor Backend,一个CoarseGrainedExecutor Backend进程有且仅有一个executor对象,它负责将Task包装成taskRunner,并从线程池中抽取出一个空闲线程运行Task,这样,每个CoarseGrainedExecutorBackend能并行运行Task的数据就取决于分配给它的CPU的个数。
(4)Worker:集群中可以运行Application代码的节点。在Standalone模式中指的是通过slave文件配置的worker节点,在Spark on Yarn模式中指的就是NodeManager节点。
(5)Task:在Executor进程中执行任务的工作单元,多个Task组成一个Stage。
(6)Job:包含多个Task组成的并行计算,是由Action行为触发的。
(7)Stage:每个Job会被拆分很多组Task,作为一个TaskSet,其名称为Stage。
(8)DAGScheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler,其划分Stage的依据是RDD之间的依赖关系。
(9)TaskScheduler:将TaskSet提交给Worker(集群)运行,每个Executor运行什么Task就是在此处分配的。
注意:一个Job == 多个Stage;一个Stage == 多个同种Task。
4.2 Spark核心RDD
RDD全称叫做弹性分布式数据集(Resilient Distributed Datasets),Spark计算都是基于RDD进行的。它是一种分布式的内存抽象,表示一个只读的记录分区的集合,它只能通过其他RDD转换而创建,为此,RDD支持丰富的转换操作(如map, join, filter, groupBy等),通过这种转换操作,新的RDD则包含了如何从其他RDDs衍生所必需的信息,所以说RDDs之间是有依赖关系的。