关于广播变量-driver将广播变量数据发送给excutor,但并不是发给所有excutor,已经接收到数据的excutor会横向传输给附近未接收到数据的excutor,如同星星之火,燎原之势快速实现广播
spark作业
在用 Spark shell 进行的交互式会话中,驱动器会将 Spark 应用转为一个或多个Spark 作业,驱动器会将每个作业转为一个 DAG,这个DAG 本质上就是 Spark 的执行计划,其中每个节点可能是一个或多个 Spark 执行阶段

Spark执行阶段
Spark 执行阶段可以作为 DAG 节点。Spark 会根据操作能否并行执行或必须串行执行来创建执行阶段。

Spark任务
每个任务对应一个处理器核心,并处理一个数据分区。也就是说,有 16 个处理器核心的执行器可以同时执行 16 个任务,而且可以并行处理 16 个数据分区,从而让 Spark 的任务执行高度并行化。

Spark 对分布式数据的操作可以分为两种类型:转化操作和行动操作
所有转化操作都是惰性求值的
惰性求值是 Spark 的策略,目的是直到调用行动操作或“碰”到数据(从硬盘上读取或向硬盘写入)时才真正执行
Spark 只是将具体的转化关系作为血缘(lineage)记录下来
行动操作会触发所记录下来的所有转化操作的实际求值

根据依赖关系属于窄依赖还是宽依赖,转化操作可以分为两类。窄转化和宽转化
如果输出中的单个数据分区是由单个输入分区计算得来的,那么这样的转化操作就称为窄转化(无shuffle)
宽转化要从其他分区读取数据并进行整合,可能要写入硬盘(有shuffle)

Tez框架可以像Map-Reduce一样,可以用来设计DAG应用程序,但需要注意的是,Tez只能运行在YARN上。Tez的一个重要应用是优化Hive和PIG这种典型的DAG应用场景,它通过减少数据读写IO,优化DAG流程使得Hive速度提供了很多倍。
spark相比于mapreduce的设计优势
1:把数据缓存在内存里
2:记录数据生成的"拓扑图",即数据计算的依赖关系。单点故障时,根据拓扑图重新计算这一部分数据即可
3:通过检查点把特定环节的数据落入磁盘。
RDD:弹性分布式数据集
Spark 架构原理

1. 核心组件-Driver
Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。
Driver 在Spark 作业执行时主要负责:
将用户程序转化为作业(job)
在 Executor 之间调度任务(task)
跟踪Executor 的执行情况
通过UI 展示查询运行情况
所谓的Driver 就是驱使整个应用运行起来的程序,也称之为Driver 类
2. 核心组件-Executor
Spark Executor 是集群中工作节点(Worker)中的一个 JVM 进程,负责在 Spark作业中运行具体任务(Task),任务彼此之间相互独立
如果有Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行
Executor 有两个核心功能:
负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程
它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储,RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算
3.核心组件-Master 和 Worker
Master 是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,类似于 Yarn 环境中的 RM
Worker也是进程,一个 Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处理和计算,类似于 Yarn 环境中 NM
4.核心组件-ApplicationMaster
ApplicationMaster,用于向资源调度器申请执行任务的资源容器 Container,运行用户自己的程序任务 job,监控整个任务的执行,跟踪整个任务的状态,处理任务失败等异常情况
ResourceManager(资源)和Driver(计算)之间的解耦合靠的就是ApplicationMaster
核心概念 1. Executor 与 Core
Spark Executor 是集群中运行在工作节点(Worker)中的一个 JVM 进程,是整个集群中的专门用于计算的节点
core是单个Executor使用的虚拟 CPU 核(Core)数量
名称 | 说明 |
–num-executos | 配置 Executor 的数量 |
–executor-memory | 配置每个 Executor 的内存大小 |
–executor-cores | 配置每个 Executor 的虚拟 CPU core 数量 |
核心概念 2.并行度( Parallelism)
将整个集群并行执行任务的数量称之为并行度
分布式计算框架中一般都是多个任务同时执行,由于任务分布在不同的计算节点进行计算,所以能够真正地实现多任务并行执行,是并行,而不是并发
一个作业到底并行度是多少呢?这个取决于框架的默认配置。应用程序也可以在运行过程中动态修改
核心概念 3.有向无环图( DAG)
DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环

所谓的有向无环图,并不是真正意义的图形,而是由 Spark 程序直接映射成的数据流的高级抽象模型
就是将整个程序计算的执行过程用图形表示出来,这样更直观, 更便于理解,可以用于表示程序的拓扑结构
yarn-cluster和yarn-client模式的区别:
其实就是Application Master(AM)进程的区别
yarn-cluster模式下,driver运行在AM中,它负责向YARN申请资源,并监督作业的运行状况,当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行
yarn-client模式下,ApplicationMaster仅仅向YARN请求executor,client会和请求的container通信来调度他们工作,也就是说Client不能离开
RDD
RDD 是一种抽象,是 Spark 对于分布式数据集的抽象,它用于囊括所有内存中和磁盘中的分布式数据实体。
弹性:
存储的弹性:内存与磁盘的自动切换
容错的弹性:数据丢失可以自动恢复
计算的弹性:计算出错重试机制
分片的弹性:可根据需要重新分片
分布式:数据存储在大数据集群不同节点上数据集:RDD 封装了计算逻辑,并不保存数据
数据抽象:RDD 是一个抽象类,需要子类具体实现
不可变:RDD 封装了计算逻辑,是不可以改变的,想要改变,只能产生新的RDD,在新的RDD 里面封装计算逻辑
可分区、并行计算
RDD特点
1 分区
RDD逻辑上是分区的,每个分区的数据是抽象存在的

2 只读
RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD; 一个RDD转换为另一个RDD,通过丰富的操作算子(map、 filter、 union、join、reduceByKey…)实现,不再像MR那样只能写map和reduce了

RDD的操作算子包括两类:
转换算子transformation: 用来对RDD进行转化,延迟执行(Lazy);
行动算子action:用来触发RDD的计算;得到相关计算结果或者将RDD保存的文件系统中;
3 依赖
RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生所必需的信息,RDDs之间维护着这种血缘关系(lineage),也称之为依赖
窄依赖。RDDs之间分区是一一对应的(1:1或n:1) 无shuffle
宽依赖。子RDD每个分区与父RDD的每个分区都有关,是多对多的关系(即
n:m)。有shuffle

4 缓存
可以控制存储级别(内存、磁盘等)来进行缓存,在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,加速后期的重用

5 checkpoint
RDD支持checkpoint将数据保存到持久化的存储中(相比于缓存,checkpoint是持久化存储),会切断血缘
spark的编程模型
