Spark应用程序在集群上作为独立的进程集合运行,由主程序(称为驱动程序)中的sparkContext对象与Spark集群进行交互协调
- 每个application(应用程序)有自己的executor进程,他们相互隔离,每个executor中可以有多个task线程。这样可以更好的隔离各个application;各个spark application 不能分享数据,除非把数据存储到外部系统。
(1)driver program : 运行应用程序的main函数并创建spark context进程,称之为主程序。
(2)cluster manager :spark 中的集群资源管理器,用于获取集群资源的外部服务。
(3)Master:进程,负责整个集群资源的调度,分配等职责。
(4)Worker node :进程,负责存储RDD的某个或某些partition(分区),启动其他进程或线程对RDD的partition进行处理计算。
(5)Executor:进程,运行任务并将数据保存在内存或磁盘存储器中。
(6)Task:线程,对RDD的partition进行并行计算。
(7)Stage:每个作业被划分为更小的任务集,称为相互依赖阶段(类似于 map reduce中的map 和 reduce阶段)
(8)cache:可使用cache 方法在内存中持久化RDD,spark将保留集群中的元素,以便下次查询时更快的访问它,还支持在磁盘上持久化RDD,或跨多个节点复制RDD。
(9)Application :运行在集群上的用户程序,包含集群上的driver program 和 多个 executor。
-
Spark context 对象可以视为Spark 应用程序的入口,主程序被成为driver program ,spark context 可以与不同种类的集群资源管理器cluster manager进行通信,从而分配到程序运行所需的资源,获取到集群运行所需的资源后,spark context 将得到集群中其他工作节点(worker node )上对应的executors (不同的spark应用程序不同的executor,他们之间也是独立的进程,executor 为应用程序提供分布式计算及数据存储功能),之后 spark context 将应用程序代码分发到各executors,最终将任务(Task)分配给executors执行。
-
一个分区(partition),即数据集的基本组成单位。
-
在 spark application 运行过程中,RDD经过一个个transformation转换算子之后,最后通过Action 算子触发操作。RDD是懒加载的,前面的转化并不发生实际的操作,这个转化为记录在DAG(无回路有向图),只有触发action 后 才实际就行操作。逻辑上每经历一个变化,RDD就会转化为新的RDD。
-
RDD依赖:RDD在每次转化的时候,会生成一个新的RDD,但新的RDD和旧的RDD之间保持着关系,就是依赖,依据依赖的样式,可以划分为窄依赖和宽依赖。
(1)窄依赖是指一个父RDD只能被一个子RDD使用(一对一,比如map,filter)
(2)宽依赖是指一个父RDD可被多个子RDD使用。(一对多,比如 groupByKey,reduceByKey)
6.RDD 持久化: Spark中最重要的功能之一就是在内存中持久化(或缓存)数据集。
当您持久化一个RDD时,每个节点将其计算的任何分区存储在内存中,并在该数据集(或从该数据集派生的数据集)上的其他操作中重用它们。这使得未来的行动更快(通常超过10倍)。
缓存是迭代算法和快速交互使用的关键工具 可以使用persist()或cache()方法将RDD标记为持久化。第一次在操作中计算它时,它将保存在节点的内存中。Spark的缓存是容错的——如果RDD的任何分区丢失,它将使用最初创建它的转换自动重新计算。 此外,每一个持久化RDD可以使用不同的存储级别进行存储
持久化级别 | 使用未序列化的Java对象格式,将数据保存在内存中。如果内存不够存放所有的数据,则数据可能就不会进行持久化,默认的持久化策略 |
---|---|
MEMORY_AND_DISK | 使用未序列化的Java对象格式,优先尝试将数据保存在内存中。如果内存不够存放所有的数据,会将数据写入磁盘文件中,不会立刻输出到磁盘 |
MEMORY_ONLY_SER | RDD的每个partition会被序列化成一个字节数组,节省空间,读取时间更占CPU |
MEMORY_AND_DISK_SER | 序列化存储,超出部分写入磁盘文件中 |
DISK_ONLY | 使用未序列化的Java对象格式,将数据全部写入磁盘文件中 |
MEMORY_ONLY_2, MEMORY_AND_DISK_2, etc. | 对于上述任意一种持久化策略,如果加上后缀_2,代表的是将每个持久化的数据,都复制一份副本,并将副本保存到其他节点上 |
OFF_HEAP (experimental) | RDD序列化存储在Tachyon |
-
shuffle 操作 : 洗牌
之所以需要shuffle , 是因为具有某种共同特征的一类数据需要最终汇聚(aggregate)到一个计算节点上进行计算。
主要分两个步骤:
(1)shuffle write
(2)shuffle read
shuffle 主要是在宽依赖时出现,shuffle操作会导致大量数据在不同节点之间传输,在整个spark中最复杂,最消耗性能的过程。
这些算子都要掌握!!