- 安装部署Spark
1. 将安装包拖入到Linux虚拟机的桌面,然后进入桌面所在的文件路径,对Spark进行解压和重命名等操作
2.通过如下Linux命令进入Spark解压文件中的conf文件夹,并根据Spark自带的模板创建spark-env.sh配置文件
3.通过在Linux终端使用命令“vim spark-env.sh”修改配置文件spark-env.sh。在配置文件的空白处,添加如下内容
4.在spark-env.sh修改完成之后,我们进一步配置Spark的环境变量。使用如下命令打开当前用户根目录下的配置文件,然后,在该文件的尾部添加如下信息,并通过source命令来使配置生效。
:
5.在Linux终端通过如下命令来启动Spark,并查看Master和Worker进程是否启动
linux终端如果显示如下信息,即表明Spark安装和启动成功
- 总结Spark的基本原理
为了更好理解,借助MapReduce理解spark。
MapReduce有一些缺点如下:
-
- MapReduce的编程模型表达能力有限
MapReduce计算框架将计算任务抽象为map和reduce两个计算任务,这简化了编程过程,但也导致MapReduce的编程模型表达能力有限。
当实际中有些处理过程比较复杂时,我们需要建立多个MapReduce过程并连接起来,这也使得MapReduce的编程过程变得复杂。
-
- 无法实现快速的迭代计算
当一个复杂的需求涉及多个MapReduce计算任务时,MapReduce只能一个任务完成之后将结果写入磁盘,另一个计算任务才能开始,无法实现快速的迭代计算。
-
- MapReduce计算过程的延迟一般比较高
,由于MapReduce的计算过程需要从磁盘中读取数据,并将中间结果和最终结果写入HDFS通过磁盘保存(同时考虑到HDFS的多备份机制),因此MapReduce计算任务涉及大量的磁盘I/O开销。
受制于磁盘的响应速度,MapReduce计算过程的延迟一般比较高。
一个普通的MapReduce作业往往需要分钟级的运算,复杂的作业或者是数据量更大的情况下,可能花费一个小时或者更多。
相对于MapReduce:
1.Spark提供了更多的操作,这使得Spark的编程模型的表达能力更强
2.Spark将计算过程中的中间结果放到内存中而不是写入磁盘,通过提供基于内存的计算,Spark减少了磁盘的I/0开销,能够更好的支持迭代计算任务,并提高了计算的效率
3.Spark提供了基于有向无环图DAG的任务调度执行机制,能够较好的支持涉及多任务、多阶段的计算需求
通过有向无环图的任务调度执行机制以及基于内存的计算,4.Spark具有比MapReduce更快的计算速度
5.虽然spark有很多的优点,但是它并不能取代hadoop,反而,spark在某些方面很好的融入了hadoop。虽然spark的部分运算在内存中进行不用写入文件系统,但最终结果或者不能一次性运算的体积较大的中间文件还是要写入HDFS文件系统的。所以spark是离不开hadoop的。
Spark 系统架构
Application: Appliction都是指用户编写的Spark应用程序,其中包括一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码
Driver: Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,通常用SparkContext代表Driver
Cluter Manager:指的是在集群上获取资源的外部服务
Worker: 集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slave文件配置的Worker节点,在Spark on Yarn模式下就是NoteManager节点
Task: 被送到某个Executor上的工作单元,但hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责
Job=多个stage,Stage=多个同种task, Task分为ShuffleMapTask和ResultTask,Dependency分为ShuffleDependency和NarrowDependency
我个人的理解:application就是spark程序,包括main函数(实现Driver功能,统筹管理代码的执行,相当于领导可以进行任务分配和监督)和executor功能的进程(负责原材料的搬运和储存,处理,到数据所在的结点进行操作)。
RDD
全称是Resilient Distributed DataSet,弹性分布式数据集
Spark所定义的一种抽象数据类型
是对Spark中一个只读数据集合的逻辑描述
封装了Spark中数据集合的分区列表、分区在集群中的位置、与其他RDD的衍生关系以及对数据集合的相关操作等信息,但并不包含数据集合中的具体数据
只能通过来自HDFS、Hbase等数据源的数据进行创建或者通过对其他RDD进行计算得到
RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后衍生血缘关系
RDD通过记录自己与其它RDD之间的血缘依赖关系,在部分分区数据丢失时,通过重新计算来恢复丢失的分区
转换操作(例如map,与MapReduce中相同)
转换操作是由一个RDD经过操作得到一个新的RDD。
这类操作在Spark中都是惰性的,也就是说Spark在碰到这类操作并不会立即执行。但新生成的RDD会记录转换的相关信息
动作操作(例如reduce,与MapReduce中不同,是对RDD的连续计算)
动作操作一般用于向Driver进程返回结果或者写入结果到文件中
这类操作会触发Spark中的一次Job作业的提交。
当碰到动作操作时,Spark会根据前面记住的RDD转换过程以及RDD之间衍生关系,建立RDD 有向无环图DAG,然后将DAG划分为不同的阶段,产生具体的任务集合,并将具体的任务分发给不同的Executor去执行
并不是所有的RDD都可以以流水线形式一次在同一结点执行。符合窄依赖的才行(指父RDD的每一个分区最多被一个子RDD的分区所用);符合宽依赖(指子RDD的分区依赖于父RDD的多个分区或所有分区)的要等待所有的父RDD所有分区执行完毕。