大三寒假学习 spark学习 RDD

设计背景:

  许多迭代式算法(比如机器学习、图算法等)和交互式数据挖掘工具,共同之处是,不同计算阶段之间会重用中间结果

  目前的MapReduce框架都是把中间结果写入到HDFS中,带来大量的数据复制、磁盘I0和序列化开销

 

  RDD就是为了满足这种需求而出现的,它提供了一个抽象的数据架构

  我们不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理

  不同RDD之间的转换操作形成依赖关系,可以实现管道化,避免中间数据存储

RDD概念:

  一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算

  RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作(如map、join和group by)而创建得到新的RDD

RDD操作:

  表面上RDD的功能很受限、不够强大,实际上RDD已经被实践证明可以高效地表达许多框架的编程模型((比如MapReduce、sQL、Pregel)

  RDD提供了一组丰富的操作以支持常见的数据运算,分为“动作”(Action)和“转换”(Transformation)两种类型

  RDD提供的转换接口都非常简单,都是类似map、filter. groupBy、 join等粗粒度的数据转换操作,而不是针对某个数据项的细粒度修改(不适合网页爬虫)

  Spark用Scala语言实现了RDD的APl,程序员可以通过调用API实现对RDD的各种操作

RDD的执行过程:

  RDD读入外部数据源进行创建

  RDD经过一系列的转换(Transformation)操作每一次都会产生不同的RDD供给下一个转换操作使用

  最后一个RDD经过“动作”操作进行转换并输出到外部数据源

  这一系列处理称为一个Lineage(血缘关系),即DAG拓扑排序的结果

 

  优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单

RDD特性:

  • 存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化
  • 高效的容错性
  • 中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销

  Spark采用RDD以后能够实现高效计算的原因:

    现有容错机制:数据复制或者记录日志

    RDD:血缘关系、重新计算丢失分区、无需回滚系统、重算过程在不同节点之间并行、只记录粗粒度的操作

posted @ 2022-01-20 12:20  风吹过半夏  阅读(36)  评论(0编辑  收藏  举报