1. Spark是一个基于内存的用于处理、分析大数据的集群计算框架。他提供了一套简单的编程接口,从而使得应用程序开发者方便使用集群节点的CPU、内存、存储资源来处理大数据。
2. Spark主要特点:
1. 使用方便:spark提供了比MapReduce更简单的编程模型。Spark针对开发大数据应用程序提供了丰富的API,这些API比Hadoop MapReduce更易读懂。相比之下,Hadoop MapReduce只有两个操作符,map和reduce。Hadoop要求任何问题都必须能够分解成一系列的map作业和reduce作业,有些算法难以用map和reduce来描述。
2. 快速:(1)使用基于内存的集群计算,直接从内存读取数据,减少磁盘I/O延迟,显著提升作业执行时间。(2)spark拥有更先进的作业执行引擎。Spark和Hadoop一样都将一个作业转化成若干个阶段构成的有向无环图(DAG)。Hadoop需要对作业创建由map和reduce两个阶段构成的有向无环图,若一个复杂的作业需要用MapReduce实现,则可能要划分成多个作业,而后按顺序执行。这种设计导致Hadoop MapReduce无法做优化。Spark的DAG可以包含任意个阶段,所以可以一次执行包含多个阶段的复杂作业。
3. 通用:spark为各种类型的数据处理作业提供了一个统一的集成平台,可以用于批处理、交互分析、流处理、机器学习和图计算。相比Hadoop MapReduce只适合做批处理。Spark可以使用单一框架来创建包含多个不同类型任务的数据处理流水线。
4. 可拓展:spark集群的数据处理能力是可以通过增加更多的集群节点的方式得以提升。
5. 可容错:spark能自动处理集群中的几点故障。
3. Spark总体架构:
一个spark应用包括5个重要部分:驱动程序,集群管理员,worker,执行者,任务。
Worker:为spark应用提供CPU、内存和存储资源,把spark应用当成分布式进程在集群节点上执行。
集群管理员:spark使用集群管理员来获得执行作业所需要的集群资源。集群管理员管理集群中worker节点的计算资源。(单独模式、Mesos模式、YARN模式)
驱动程序:驱动程序是一个把spark当成库使用的应用,提供数据处理的代码,spark将在worker节点上执行这些代码。一个驱动程序可以在spark集群上启动一个或多个作业。
执行者:执行者是一个JVM进程,对于一个应用由spark在每一个worker上创建,可以多线程的方式执行应用代码,也可以把数据缓存在内存或硬盘中。生命周期和应用一样,spark应用结束,执行者也会终结。
任务:任务是spark发送给执行者的最小工作单元,它运行在worker节点上执行者的一个进程中,每一个任务都执行一些计算,然后将结果返回给驱动程序,或者区分以用于shuffle操作。Spark为每一个数据分区创建一个任务,一个执行者可以并发执行一个或多个任务,任务数量由分区的数据决定。
4. 术语:
1.Shuffle操作。Shuffle操作是指在集群节点上对数据进行重新分配。这是一个耗时操作,因为他涉及在网络间传输数据。Shuffle操作不是对数据进行随机重新分配,它按照某些标准将数据分成不同的集合,每个集合就是一个新的分区。
2.作业。作业是一系列计算的集合,spark将这些计算并将结果返回给驱动程序。作业本质上就是在spark集群上运行数据处理算法。
3.阶段。一个阶段由若干个任务构成。Spark将一个作业分解成一个由若干个阶段构成的DAG,每一个阶段依赖于其他阶段。Spark利用shuffle边界将任务分成不同的阶段。
应用运行过程:一个spark应用开始运行时,spark会连接集群管理员,获取在worker节点上的执行者资源。Spark应用把数据处理算法当成一个作业提交,spark将这个作业分解成若干个阶段构成的DAG。然后spark在执行者上调度这些阶段的运行,调度操作由集群管理员提供的底层调度器实现。执行者并行的运行spark提交的任务。
5. RDD
RDD:弹性分布式数据集,表示一个关于分区数据元素的集合。是spark的主要数据抽象概念,也是spark库中定义的一个抽象类。由SparkContext类提供的工厂方法来创建RDD实现类的类实例。
RDD的操作归为两类:转换和行动,转换会创建新的RDD实例,行动则会将结果返回给驱动程序。
RDD特点:
1.不可变性
RDD是一种不可变的数据结构,一旦创建就不可在原地更改,一个修改的操作会返回一个新的RDD。
2.分片
RDD表示的是一组数据的分区,这些分区分布在集群的节点上。默认情况下,一个RDD分区对应一个HDFS文件分片。其他的数据源(如Cassandra)也将数据分片分散存储在集群多个节点上,然而一个RDD对应多个Cassandra分片。
3.容错性
RDD为可容错的,代表了分散在集群中多个节点的数据,但是任何一个节点都有可能出故障。RDD会自动处理出故障的情况,故障节点数据无法被访问,spark会在其他节点重建丢失的RDD分区数据。
4.接口
RDD是一个处理数据的接口。在spark库中他被定义为一个抽象类。RDD为多种数据源提供了一个处理数据的统一接口,包括HDFS、HBASE,Cassandra等。Spark为不同的数据源提供了各自具体的实现类,比如HadoopRDD、CassandraRDD。
5.强类型
RDD类有一个参数用于表示类型,使得RDD可以表示不同类型的数据。
6.驻留在内存中
Spark具有内存集群计算的特性,RDD提供了一套支持内存计算的API,spark允许RDD在内存中缓存或长期驻留。
6. 惰性操作
RDD的创建和转换都是惰性操作,当调用一个返回RDD的方法的时候,spark并不会立即执行运算。Spark仅仅记录了这个RDD是怎么创建的,在它上面做转换操作会创建怎样的子RDD等信息,为每一个RDD维护其各自的血统信息。类似这种就是惰性操作。
7. 触发计算的操作
当spark应用调用操作方法或者保存RDD至存储系统的时候,RDD的转换计算才真正执行。保存RDD至存储系统也被视为一种操作,尽管没有给驱动程序返回值。
当spark应用调用RDD的操作方法或者保存RDD的时候,它会触发spark的连锁反应。