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

  1. ## 声明累加器
  2. var sum = sc.longAccumulator("sum");
  3. ## 自定义累加器
  4. // 1. 继承 AccumulatorV2,并设定泛型
  5. // 2. 重写累加器的抽象方法

广播变量(broadcast)

广播变量用来高效分发较大的对象