Spark2_RDD定义

18 篇文章 0 订阅

Spark2什么是RDD

1.RDD

1.1RDD定义

让开发者大大降低开发分布式应用程序的门槛以及提高执行效率

Resilient Distributed Dataset(RDD) 也就是弹性分布数据集

弹性体现在计算之上,代表的是spark可以做到在做分布式计算的时候可以容错,比如说某个节点挂了,或者是某个节点数据丢失了,可以用RDD的机制进行数据修复,这是计算层面得.

分布式也就是数据可以跨节点存储在不同的节点上,spark计算的时候也一样,代码可以运行在一个和多个节点之上,提升计算效率.

数据集在spark中可以通过读文件创建,或者通过编程的方式创建,或者通过一个数据集转换成另一个数据集,类似于hdfs的block.

1.RDD是不可变的,但是能通过RDDA转换为RDDB

2.RDD的元素可以被拆成分区,可以理解成hdfs的block或者是mapreduce的Inputsplit

3.并且RDD的分区可以被并行操作.

例如:RDDA:(1,2,3,4,5,6,7,8,9) operated +1

hadoop000:Partition1:(1,2,3) +1

hadoop000:Partition2:(4,5,6) +1

hadoop000:Partition3:(7,8,9) +1

RDDA执行了+1的操作,那么RDDA的3个partition分区都会执行+1操作,并且是并行的

1.2RDD源码定义
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:泛型,RDD支持各种数据类型

5.SparkContext:

6.@transient:

2.RDD的五大特性

Internally, each RDD is characterized by five main properties:

1.A list of partitions
2.A function for computing each split
3.A list of dependencies on other RDDs
4.Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
5.Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

1.RDD有很多分区partition.

2.函数对RDD的操作是作用于所有的分区partition,函数的应用实现了RDD之间partition的转换.

3.RDD跟RDD之间有依赖关系,当依赖关系为窄依赖时,RDD中某个分区数据丢失的时候,spark可以通过依赖关系重新计算分区里的数据,而不是对所有RDD进行重新计算.

RDDA => RDDB => RDDC => RDDD

4.(可选项)Partitioner 都是key-value形式的(默认使用hash).例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面

5.(可选项)对某个分区(分片)进行计算的时候,会在最优的位置去计算,也就是数据本地性。

3.RDD特性和源码的对应关系

def compute(split: Partition, context: TaskContext): Iterator[T]

可以看到这个compute计算方法传入参数包含了split: Partition,这就是RDD的第二特性

protected def getPartitions: Array[Partition]

getPartitions方法返回类型是一个Array[Partition]类型,得到的是partition的集合.对应了RDD的第一特性

protected def getDependencies: Seq[Dependency[_]] = deps

getDependencies方法返回类型是Seq[Dependency[_]],对应了RDD的第三特性

protected def getPreferredLocations(split: Partition): Seq[String] = Nil

进行计算的时候要获得最佳位置PreferredLocation,也就是getPreferredLocations方法,最后的返回结果是一个Seq[String],也就是路径的集合,对应了RDD的第五特性

@transient val partitioner: Option[Partitioner] = None

可以被子类覆盖,可以指定需要的partitioner,对应了RDD的第四特性

4.RDD图解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值