[Spark学习笔记] RDD

什么是RDD

RDD是整个Spark的计算基石。是分布式数据的抽象,为用户屏蔽了底层复杂的计算和映射环境

  1. RDD是不可变的,如果需要在一个RDD上进行转换操作,则会生成一个新的RDD
  2. RDD是分区的,RDD里面的具体数据是分布在多台机器上的Executor里面的。堆内内存和堆外内存 + 磁盘。
  3. RDD是弹性的。

    • 存储:Spark会根据用户的配置或者当前Spark的应用运行情况去自动将RDD的数据缓存到内存或者磁盘。他是一个对用户不可见的封装的功能。
    • 容错:当你的RDD数据被删除或者丢失的时候,可以通过血统或者检查点机制恢复数据。这个用户透明的。
    • 计算:计算是分层的,有应用->JOb->Stage->TaskSet-Task 每一层都有对应的计算的保障与重复机制。保障你的计算不会由于一些突发因素而终止。
    • 分片:你可以根据业务需求或者一些算子来重新调整RDD中的数据分布。

Spark Core干了什么东西,其实就是在操作RDD:
RDD的创建--》RDD的转换--》RDD的缓存--》RDD的行动--》RDD的输出。

RDD 持久化

RDD通过persist方法或cache方法可以将前面的计算结果缓存,默认情况下 persist() 会把数据以序列化的形式缓存在 JVM 的堆空间中。
但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

通过查看源码发现cache最终也是调用了persist方法,默认的存储级别都是仅在内存存储一份,
[Spark学习笔记] RDD_第1张图片

RDD 检查点机制

检查点(本质是通过将RDD写入Disk做检查点)是为了通过lineage做容错的辅助,lineage过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的RDD开始重做Lineage,就会减少开销。检查点通过将数据写入到HDFS文件系统实现了RDD的检查点功能。
checkpoint 是把 RDD 保存在 HDFS中, 是多副本可靠存储,所以依赖链就可以丢掉了,就斩断了依赖链(找不到父RDD), 是通过复制实现的高容错。

如果存在以下场景,则比较适合使用检查点机制:
1) DAG中的Lineage过长,如果重算,则开销太大(如在PageRank中)。
2) 在宽依赖上做Checkpoint获得的收益更大。

你可能感兴趣的:(spark)