您的位置:首页 > 其它

SparkCore:RDD特性详细解读

2019-07-31 08:15 316 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/greenplum_xiaofan/article/details/97873364

文章目录

  • 3、RDD图解
  • 1、RDD源码定义

    RDD源码地址:
    https://github.com/apache/spark/tree/master/core/src/main/scala/org/apache/spark/rdd
    打开

    RDD.scala
    源码文件
    斜杠后面的单词就是目录层次,逐级往下就行

    • A Resilient Distributed Dataset (RDD), the basic abstraction in Spark.
      基于Spark,弹性分布式数据集(RDD)
      弹性体现在计算上,在Spark分布式计算的时候,可以容错,比如计算过程中某一部分数据丢失,可以通过一些机制修复。

    • Represents an immutable,partitioned collection of elements that can be operated on in parallel.
      代表不可变的,以并行的方式操作分区的元素集合。
      that can be operated on in parallel.这里that,指partitioned collection of elements
      不可变说明RDD一旦生成,就不可变的。
      分区的元素集合,就是把一个大的拆分成很多个小的,可以理解为HDFS的Block/InputSplit
      举例:
      RDDA:(1,2,3,4,5,6,7,8,9) --> RDDA生成不可变
      hadoop001:Partition1:(1,2,3) -->三个分区,每个分区分布在不同节点上
      hadoop002:Partition1:(4,5,6)
      hadoop003:Partition1:(7,8,9)
      如果要睿RDDA做一个 operated +1,应该是对所有Partition上的元素做了 +1的操作,并且是在每个节点
      是同时进行的(并行处理)

    • RDD的定义
      abstract class RDD[T: ClassTag](
      @transient private var sc: SparkContext,
      @transient private var deps: Seq[Dependency[]]
      ) extends Serializable with Logging {}

    1. 抽象类:RDD必然是有子类实现,使用时调用子类即可
    2. Serializable序列化,比如网络的传输
    3. Logging特质
    4. [T: ClassTag]泛型,说明RDD存储的数据类型时不确定的
    5. SparkContext
    6. @transient 指定该属性或字段不是永久的。

    2、RDD五大特性

    2.1 each RDD is characterized by five main properties:

    • A list of partitions
      分区列表
    • A function for computing each split(理解成partition)
      函数作用在每个分区上
    • A list of dependencies on other RDDs
      RDD之间有依赖关系
      RDDA=>RDDB=>RDDC=>RDDD
    • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
      分区器是作用在K,V格式的RDD上,默认是hash-partitioned
    • Optionally, a list of preferred locations to compute each split on (e.g. block locations for
      an HDFS file)
      preferred locations 优先位置
      每一个分区在计算时会选择最佳的计算位置(体现了数据本地性,要运行的计算或操作,最要是把task放到
      对应数据的那台)

    2.2 RDD五大特性和RDD源码的对应关系

    打开这个文件RDD.scala
    对应第二个特性
    def compute(split: Partition, context: TaskContext): Iterator[T]
    计算:其实是对RDD立面的每个分区做计算
    传入的参数:split类型是Partition
    context类型是TaskContext

    对应第一个特性
    protected def getPartitions: Array[Partition]
    得到分区,返回的类型Array[Partition],是一个数组或集合,数组或集合的类型是Partition

    对应第三个特点
    protected def getDependencies: Seq[Dependency[_]] = deps
    得到一个Dependencies

    对应第五个特点
    protected def getPreferredLocations(split: Partition): Seq[String] = Nil

    对应第四个特点
    @transient val partitioner: Option[Partitioner] = None

    其他RDD源码
    打开JdbcRDD.scala
    override def getPartitions: Array[Partition] = {}
    override def compute(thePart: Partition, context: TaskContext): Iterator[T] = new NextIterator[T]

    打开JdbcRDD.scala
    override def getPartitions: Array[Partition]
    override def compute(theSplit: Partition, context: TaskContext): InterruptibleIterator[(K, V)]
    override def getPreferredLocations(split: Partition): Seq[String]

    3、RDD图解

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: