Spark概述
大数据开发的总体架构 可以看到,在数据计算层,作为Hadoop核心组成的MapReduce可以结合Hive通过类SQL的方式进行数据的离线计算(当然也可以编写独立的MapReduce应用程序进行计算);而Spark既可以做离线计算(Spark SQL),又可以做实时计算(Spark Streaming),它们底层都使用的是Spark的核心(Spark Core)。
Spark初识
Apache Spark是一个快速通用的集群计算系统,是一种与Hadoop相似的开源集群计算环境,但是Spark在一些工作负载方面表现得更加优越。它提供了Java、Scala、Python和R的高级API,以及一个支持通用的执行图计算的优化引擎。它还支持高级工具,包括使用SQL进行结构化数据处理的Spark SQL、用于机器学习的MLlib、用于图处理的GraphX,以及用于实时流处理的Spark Streaming。
Spark的主要特点
- 快速
MapReduce主要包括Map和Reduce两种操作,且将多个任务的中间结果存储于HDFS中。与MapReduce相比,Spark可以支持包括Map和Reduce在内的多种操作,这些操作相互连接形成一个有向无环图(Directed Acyclic Graph, DAG),各个操作的中间数据会被保存在内存中。因此,Spark处理速度比MapReduce更快。
- 易用
Spark可以使用Java、Scala、Python、R和SQL快速编写应用程序。此外,Spark还提供了超过80个高级算子,使用这些算子可以轻松构建应用程序。
- 通用
Spark拥有一系列库,包括SQL和DataFrame、用于机器学习的MLlib、用于图计算的GraphX、用于实时计算的Spark Streaming,可以在同一个应用程序中无缝地组合这些库。
- 到处运行
Spark可以使用独立集群模式运行(使用自带的独立资源调度器,称为Standalone模式),也可以运行在Hadoop YARN、Mesos(Apache下的一个开源分布式资源管理框架)等集群管理器之上,并且可以访问HDFS、HBase、Hive等数百个数据源中的数据。
Spark的主要组件
Spark是由多个组件构成的软件栈,Spark 的核心(Spark Core)是一个对由很多计算任务组成的、运行在多个工作机器或者一个计算集群上的应用进行调度、分发以及监控的计算引擎。
Spark主要有三种运行模式:
- 本地(单机)模式
本地模式通过多线程模拟分布式计算,通常用于对应用程序的简单测试。本地模式在提交应用程序后,将会在本地生成一个名为SparkSubmit的进程,该进程既负责程序的提交,又负责任务的分配、执行和监控等。
- Spark Standalone模式
使用Spark自带的资源调度系统,资源调度是Spark自己实现的。
- Spark On YARN模式
以YARN作为底层资源调度系统以分布式的方式在集群中运行。
Spark Standalone架构
Spark Standalone的两种提交方式
Spark Standalone模式为经典的Master/Slave架构,资源调度是Spark自己实现的。在Standalone模式中,根据应用程序提交的方式不同,Driver(主控进程)在集群中的位置也有所不同。应用程序的提交方式主要有两种:client和cluster,默认是client。可以在向Spark集群提交应用程序时使用–deploy-mode参数指定提交方式。
- client提交方式
当提交方式为client时,运行架构如下图所示:
集群的主节点称为Master节点,在集群启动时会在主节点启动一个名为Master的守护进程;从节点称为Worker节点,在集群启动时会在各个从节点上启动一个名为Worker的守护进程。
Spark在执行应用程序的过程中会启动Driver和Executor两种JVM进程。
Driver为主控进程,负责执行应用程序的main()方法,创建SparkContext对象(负责与Spark集群进行交互),提交Spark作业,并将作业转化为Task(一个作业由多个Task任务组成),然后在各个Executor进程间对Task进行调度和监控。通常用SparkContext代表Driver。如图所示的架构中,Spark会在客户端启动一个名为SparkSubmit的进程,Driver程序则运行于该进程。
Executor为应用程序运行在Worker节点上的一个进程,由Worker进程启动,负责执行具体的Task,并存储数据在内存或磁盘上。每个应用程序都有各自独立的一个或多个Executor进程。
- cluster提交方式
当提交方式为cluster时,运行架构如下图所示:
tandalone以cluster提交方式提交应用程序后,客户端仍然会产生一个名为SparkSubmit的进程,但是该进程会在应用程序提交给集群之后就立即退出。当应用程序运行时,Master会在集群中选择一个Worker启动一个名为DriverWrapper的子进程,该子进程即为Driver进程。
Spark RDD是什么
Spark提供了一种对数据的核心抽象,称为弹性分布式数据集(Resilient Distributed Dataset,简称RDD)。这个数据集的全部或部分可以缓存在内存中,并且可以在多次计算时重用。RDD其实就是一个分布在多个节点上的数据集合。
RDD的弹性主要是指:当内存不够时,数据可以持久化到磁盘,并且RDD具有高效的容错能力。
分布式数据集是指:一个数据集存储在不同的节点上,每个节点存储数据集的一部分。
例如,将数据集(hello,world,scala,spark,love,spark,happy)存储在三个节点上,节点一存储(hello,world),节点二存储(scala,spark,love),节点三存储(spark,happy),这样对三个节点的数据可以并行计算,并且三个节点的数据共同组成了一个RDD。
分布式数据集类似于HDFS中的文件分块,不同的块存储在不同的节点上;而并行计算类似于使用MapReduce读取HDFS中的数据并进行Map和Reduce操作。Spark则包含这两种功能,并且计算更加灵活。
在编程时,可以把RDD看作是一个数据操作的基本单位,而不必关心数据的分布式特性,Spark会自动将RDD的数据分发到集群的各个节点。Spark中对数据的操作主要是对RDD的操作(创建、转化、求值)。
RDD的主要特征
- RDD是不可变的,但可以将RDD转换成新的RDD进行操作,但是原来的RDD没有变化。
- RDD是可分区的。RDD由很多分区组成,每个分区对应一个Task任务来执行。
- 对RDD进行操作,相当于对RDD的每个分区进行操作。
- RDD拥有一系列对分区进行计算的函数,称为算子。
- RDD之间存在依赖关系,可以实现管道化,避免了中间数据的存储。
RDD的创建
RDD中的数据来源可以是程序中的对象集合,也可以是外部存储系统中的数据集,例如共享文件系统、HDFS、HBase或任何提供Hadoop InputFormat的数据源。
- 从对象集合创建RDD
- 从外部存储创建RDD
RDD被创建后是只读的,不允许修改。Spark提供了丰富的用于操作RDD的方法,这些方法被称为算子。一个创建完成的RDD只支持两种算子:转化(Transformation)算子和行动(Action)算子。
转化算子
转化算子负责对RDD中的数据进行计算并转化为新的RDD。Spark中的所有转化算子都是惰性的,因为它们不会立即计算结果,而只是记住对某个RDD的具体操作过程,直到遇到行动算子才会与其一起执行。
小结
Apache Spark是一个开源的分布式计算系统,它提供了一个快速和通用的集群计算平台。Spark 能够处理大规模数据,支持批处理和流处理等多种计算模式。它的核心是弹性分布式数据集(RDD),这是一种不可变的、分布式的数据集合,支持并行操作。RDD提供了多种操作,包括转换操作(如map、filter、reduce等)和行动操作(如count、collect等)。转换操作是惰性的,即它们不会立即执行,而是在需要结果时才触发计算。这种设计使得Spark能够有效地优化执行计划,提高计算效率。学习Spark和RDD,不仅可以帮助我理解分布式计算的基本概念,还能够让我掌握处理大规模数据集的技能,这对于数据科学、大数据分析和云计算等领域都是非常宝贵的。