DAG
概念:点和线形成有方向性的依赖图
死循环:maven不允许出现循环依赖
Yarn环境的两种补数据模式qqqerqrer898wwqœ
Client和Cluster的区别:cluster运行在集群中;Client运行在客户端,一般用于测试。
三大数据结构
为了支持高并发和高吞吐处理数据,封装了这三大数据机构
RDD:弹性分布数据集,最小的计单元
累加器:分布式共享只写变量
广播变量:分布式共享只读变量
完成别完美更重要
RDD算子
RDD持久化
rdd cache 缓存
rdd通过cache和persist方法将前面的计算结果进行缓存,默认情况下会把数据缓存在JVM堆内存中。当触发action时,会被调用。
cache 操作会增加血缘关系,不改变原有的血缘关系
persist 可以更改存储级别
内存不足,缓存失败,数据重算,由于RDD的各个partition是相对独立的,只需计算丢失的partition。
Spark 会自动对一些 Shuffle 操作的中间数据做持久化操作(比如:reduceByKey)。这样 做的目的是为了当一个节点 Shuffle 失败了避免重新计算整个输入。但 是,在实际使用的时 候,如果想重用数据,仍然建议调用 persist 或 cache。
RDD Checkpoint检查点(setCheckpointDir)
将RDD的中间结果写入磁盘
血缘依赖过长造成容错成本高,顾设检查点,减少开销
RDD 进行 checkpoint 操作并不会马上被执行,必须执行 Action 操作才能触发
缓存和检查点区别
1)Cache 缓存只是将数据保存起来,不切断血缘依赖。Checkpoint 检查点切断血缘依赖。
2)Cache 缓存的数据通常存储在磁盘、内存等地方,可靠性低。Checkpoint 的数据通常存 储在 HDFS 等容错、高可用的文件系统,可靠性高。
3)建议对 checkpoint()的 RDD 使用 Cache 缓存,这样 checkpoint 的 job 只需从 Cache 缓存 中读取数据即可,否则需要再从头计算一次 RDD。
RDD 分区器
Spark 目前支持 Hash 分区和 Range 分区,和用户自定义分区。Hash 分区为当前的默认
分区。分区器直接决定了 RDD 中分区的个数、RDD 中每条数据经过 Shuffle 后进入哪个分 区,进而决定了 Reduce 的个数
只有K-V类型的RDD才有分区器,非Key-Value类型的RDD分区的值是None
Hash 分区:对于给定的 key,计算其 hashCode,并除以分区个数取余
Range 分区:将一定范围内的数据映射到一个分区中,尽量保证每个分区数据均匀,而 且分区间有序
RDD累加器
累加器用来把 Executor 端变量信息聚合到 Driver 端。在 Driver 程序中定义的变量,在 Executor 端的每个 Task 都会得到这个变量的一份新的副本,每个 task 更新这些副本的值后, 传回 Driver 端进行 merge
## 声明累加器
var sum = sc.longAccumulator("sum");
## 自定义累加器
// 1. 继承 AccumulatorV2,并设定泛型
// 2. 重写累加器的抽象方法
广播变量(broadcast)
广播变量用来高效分发较大的对象