SparkCore RDD

学习Spark,多用源码和官网说话。

一, RDD(弹性的分布式数据集)简介:

1.the basic abstraction in Spark:RDD是一个抽象类,不能new,必须new其子类
2.Represents an immutable :a==>b==>c RDD本身不可变化,只能由一个转变为另外一个
3.partitioned collection of elements that can be operated on in parallel:
一个List可以分为3个partition ,每个partition的数据可以并行的操作计算。

二,五大特性(对应于源码分析):

* 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)
 *
  All of the scheduling and execution in Spark is done based on these methods,allowing each RDD
   to implement its own way of computing itself. Indeed, users can implement custom RDDs 
   (e.g. forreading data from a new storage system) by overriding these functions. 

对于如上的5个特点,对应于RDD中的5个方法

① A list of partitions   (一系列的partition)
         protected def getPartitions: Array[Partition]
         
② A function for computing each split  (针对RDD做操作其实就是针对RDD底层的partition进行操作)
		def compute(split: Partition, context: TaskContext): Iterator[T]
		
③ A list of dependencies on other RDDs (rdd之间的依赖)
protected def getDependencies: Seq[Dependency[_]] = deps

④ Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
@transient val partitioner: Option[Partitioner] = None

⑤ Optionally, a list of preferred locations to compute each split on (e.g. block locations for  an HDFS file)
protected def getPreferredLocations(split: Partition): Seq[String] = Nil

1)由分区组成的。可以理解为RDD是由一系列partition构成的。
2)对于计算,一个函数是作用于每个split/partition上的。比如你对RDD做了一个功能/函数/转换,它会对RDD里面的所有分片或者说分区去做一个相同的计算。
3)依赖于其他的RDD
比如RDD1=>RDD2=>RDD3=>RDD4,的RDD是由RDD1转换来的。RDD之间会有依赖关系,每个RDD都是由分区构成,你对RDD1进行转换,变成了RDD2,那么RDD1里面的partition变成了RDD2里面的partition,如果RDD1里面的某个分区或者元素挂掉了,再加载一下就可以了。如果是窄依赖,如果RDDB里面的某个分区或者某个元素挂掉了,用RDD1转换一下就可以了。这就体现了它的一个弹性。当RDD某个分区数据丢失的时候,spark可以通过这个依赖关系重新计算分区里的分区数据,而不是对于RDD里面的所有的分区进行计算,而是某一个分区进行计算就可以了,前提是窄依赖。
4) (可选) 对key-value的RDD做分区的,默认是hash分区。对于key-value的RDD可指定一个partitioner,告诉它如何分片;常用的有hash,range
5) (可选) 对每个分片进行计算的时候,要运行的计算执行最好在存储数据的机器上运行。preferred locations:数据本地性,比如你要进行的计算/操作,最好在哪台机器上进行运行,比如你的数据在哪里,最好的就是把你的task分配到数据所在的地方去运行。这样性能会更好,因为没有数据的IO,移动计算而不是移动数据。locations为复数,是因为可能会有副本,对于一个块/partition来说,可能有多个preferred locations。比如:hadoop默认有三个位置,或者spark cache到内存是可能通过StorageLevel设置了多个副本,所以一个partition可能返回多个最佳位置。

在这里插入图片描述
五个partition对应于5个task 并行的执行

三,RDD的创建方式:

① parallelize 适用于测试用
② External Datasets 生产中常用
③ 通过已有的RDD转换过来,生产中常用

四,RDD的操作

① transformation 转换操作,不会立即执行 lazy
② action 动作 ,只有遇到action才会提交作业开始执行 eager

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬瓜螺旋雪碧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值