Spark RDD笔记

从这里学习的,讲的真好~ https://www.bilibili.com/video/av62992342/?p=41

JAVA IO : 装饰者设计模式

IO.png

Spark的RDD也是类似的

RDD.png

RDD是将数据处理的逻辑进行了封装。
JAVA读数据并不是直接读文件,而是在readLine的时候去读。
Spark是在Collect被触发的时候去读数据,所以需要execute驱动。

什么是RDD

RDD(Resilient Distributed Dataset)弹性分布式数据集,是Spark中最基本的数据计算抽象。代码中是一个抽象类,代表一个不可变、可分区、里面的元素可并行计算的集合。

属性

一组分区(Partition),即数据集的基本组成单位
一个计算每个分区的函数
RDD之间的依赖关系
一个Partitioner,RDD的分片函数
一个列表,存储存取每个Partition的优先位置(Preferred location)。(帮助判断数据所在的位置,找近的)

选择Executor.png

RDD特点

RDD表示只读的分区数据集,对RDD进行的改动,只能通过RDD的转换操作,由一个RDD获取到另一个新的RDD。新的RDD包含了从其他RDD衍生所必需的信息。RDD之间存在相互依赖,按照血缘关系延时计算。如果血缘关系较长,可以通过持久化RDD切断关系。

RDD分区

RDD逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个compute函数得到每个分区的数据。
如果RDD是通过已有的文件系统构建,则compute函数是 读取指定文件系统中的数据。
如果RDD是通过其他RDD转换而来,那么compute函数是 执行转换逻辑将其他RDD的数据进行转换。

只读

RDD是只读的,想改变RDD的数据,只能在现有的RDD基础上创建新的RDD。
由一个RDD转换到另一个RDD,可以通过丰富的算子操作实现,不必像MR,写map和reduce。

那么啥是算子?

从认知心理学角度,解决问题,其实是将问题的 初始状态,通过一系列操作(算子)对问题的状态进行转换,然后达到解决状态。(其实就是一顿操作解决问题)

Spark中的所有RDD方法都称之为算子,但分为2大类:转换算子 & 行动算子。

依赖

RDD之间通过算子进行转换,转换得到新RDD包含从其他RDD衍生所必须的信息。RDD之间维护着这种血缘关系,也称之为依赖。依赖包含两种。
窄依赖,RDDs之间的分区是一一对应的。
宽依赖,下游RDD的每个分区与上游RDD的每个分区都有关,多对多的关系。

缓存

如果在应用程序中多次使用同一个RDD,可以将RDD缓存起来,该RDD只有在第一次计算的时候,会根据血缘关系得到分区数据。后续使用到RDD的时候,会直接从缓存处取而不用再根据血缘关系计算,加速重用。

RDD创建

Spark中创建RDD的方式有三种:集合中创建RDD;外部存储创建RDD;从其他RDD创建;

集合中创建

Spark提供两个函数parallelize和makeRDD,没啥区别。

//创建RDD 这俩太大区别
// 1 从内存中创建 makeRDD
val listRDD = sc.makeRDD(List(1,2,3,4))
// 2 从内存中创建 parallelize
val arrayRDD = sc.parallelize(Array(1,2,3,4))

listRDD.collect().foreach(println)
arrayRDD.collect().foreach(println)

外部存储创建RDD

包括本地文件系统,HDFS和HBASE也支持
// 3 从外部存储中创建
// 默认情况下,可以读取项目路径,也可以读取HDFS之类的
// 默认从文件中读取的数据都是字符串类型
val fileRDD = sc.textFile("hdfs://Master:9000/in")

从其他RDD创建新RDD

你可能感兴趣的:(Spark RDD笔记)