暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spark Core-RDD三部曲(上)

码农大腿哥 2021-03-14
264
前言:

RDD是Spark中一个非常重要的概念,学会它Spark就会一半了

不过RDD比较抽象,也是学习Spark的一个难点

本文一共2114字,不建议你几分钟就读完!



01

什么是RDD

1.RDD概念


RDD(Resilient Distributed Dataset)全称是弹性分布式数据集,官方文档的描述是:


The main abstraction Spark provides is a resilient distributed dataset (RDD), which is a collection of elements partitioned across the nodes of the cluster that can be operated on in parallel


RDD虽然叫数据集,但它并不存储数据,可以抽象理解为待处理数据的代理


在分布式情况下,数据分布在不同位置,我们不可能一个一个去处理。所以用RDD代表要处理的所有数据集,这样就能方便的进行并行计算


需要注意的是 Spark is a dataset,说明RDD是一种数据结构

2.RDD的作用

代码中RDD是个抽象类,计算逻辑是由其子类(算子)具体实现的

操作RDD就是操作对应的数据集,针对RDD编写的代码会被转换成Task发送到不同机器上执行



02

RDD里有什么

RDD既然是种数据结构,那么它到底包含了哪些信息?

源码中描述了RDD的5个主要属性,我认为这5个属性刚好说明了RDD里有哪些信息

     * Internally, each RDD is characterized by five main properties:
    *
    * - A list of partitions
    * - A function for computing each split
    * - A list of dependencies on other RDDs
    * - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
     *  - Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
    复制

    1.分区列表

    RDD中有一个分区列表,记录了数据的分区信息,这样就能实现分布式计算

    如果数据源是HDFS,那么这个列表记录的就是每个Block的位置信息

    2.计算函数

    这个函数就是数据计算的逻辑,也就是我们写的算子的计算逻辑。程序执行时,每个分区都会使用这个函数

    3.RDD依赖关系

    在一个Word Count程序中,会产生多个RDD,这些RDD是单向依赖的

      // 创建配置对象
      val sparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount");
      val sc = new SparkContext(sparkConf)

      /** Word Count **/
      val fileRDD: RDD[String] = sc.textFile("data/input/word.txt") // (1)读取,一行一行的读取文件
      val flatRDD: RDD[String] = fileRDD.flatMap( _.split(" ") ) // (2)切分,一行字符切成单个单词
      val mapRDD: RDD[(String, Int)] = flatRDD.map((_,1)) // (3)转换,数据结构 word => (word, 1)
      val reduceRDD: RDD[(String, Int)] = mapRDD.reduceByKey(_+_) // (4)聚合,相同相加
      复制

      每个RDD都有自己的使命,它们共同努力实现了复杂的计算逻辑

      4.分区器(可选)

      数据为Key:Value类型时,可以通过设定分区器自定义分区规则

      5.首选位置(可选)

      计算分区数据时,这部分数据应该由集群中的哪个节点计算呢?

      假设处理的HDFS上的数据,那么数据在哪个节点,就把Task发给哪个节点执行。也就是说,分区数据在哪个节点,这个节点就是这个分区的首选位置,计算效率最优

      RDD中记录了每个分区的首选位置



      03

      RDD几个重要特点


      1.弹性

      RDD的弹性主要表现在两个方面:

      容错的弹性:不管是数据丢失还是计算失败,Spark都能根据RDD依赖关系恢复出错的RDD

      分区的弹性:在经过转换算子处理时,RDD中的分区数以及分区所在的位置可以改变的。这样可以改变并行度,合理利用资源


      2.数据模型

      RDD是一个封装了计算逻辑的数据模型,并不保存数据

      3.不可变

      RDD封装了计算逻辑,是不可以改变的。如果改变了,就产生了新的RDD

      比如一个Word Count程序中就包含了一系列的RDD



      总结:

      看完本篇,希望你能对RDD有个深刻的认识,这会决定你后面学Spark能不能学好

      从宏观角度看,它是对数据的抽象,代表了要处理的所有数据

      从编程角度看,它是一个抽象类,是我们编程的主要对象

      从计算角度看,它是最小的计算单元。一个复杂的逻辑是多个RDD组合在一起来实现的

      从原理角度看,它是一数结构。将分区列表、计算函数、依赖关系等信息封装到了一起,从而实现了弹性分布式计算

      你学废了吗?

      — END  —


      文章转载自码农大腿哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论