RDD的持久化和广播变量

RDD的持久化

缓存方式:cache, persist
特点:并不是调用时立即执行,必须遇到行动算子时才会缓存。因此第一次运行速度并不会变快,只有下次执行时才会生效。

  1. rdd.cache():缓存数据
  2. DAG有向无环图会增加一个绿点
  3. rdd.toDebugTostring()可以查看缓存的具体信息
  4. 只有在shuffle后进行缓存才有意义

目前来说,spark的缓存位置和级别非常优秀,一般无需修改。缓存不会切断血缘关系,如果缓存后面的计算出错,会重新将缓存前的计算再做一遍。

RDD checkPoint检查点

将某个RDD数据落盘保存,如果检查点之后出现问题,可以从检查点开始重做,减少开销。

  1. 设置检查点存储路径,sc.setCheckpointDir("ck");
  2. rdd.checkpoint(): 保存某个RDD的数据
  3. 检查点会切断血缘关系,若后面计算出错,也不会把检查点之前的计算再跑一遍。

有分区器的RDD

  1. 只有kv类型的RDD才有分区器,单value类型的RDD没有分区器
  2. hashPartitioner是为了聚合计算,RangePartitioner是为了排序。

广播变量

分布式共享只读变量,向所有工作节点executor发送一个只读变量。每个executor可以有多个Task, 由于Task是计算的基本单位,本来需要将共享的变量向每个节点都发送一份。 因此可以将变量直接发送给executor,减少通信压力。

  1. sc.broadcast(变量); 广播该变量给executor
  2. broadcast.getValue(); 获取广播变量

你可能感兴趣的:(spark)