sparkRDD的概述和特点以及常用算子

RDD(Resilient Distributed Dataset)是Spark的核心数据抽象,表示不可变、可分区的并行数据集。它具备数据流模型特性,如自动容错、位置感知调度和可伸缩性。RDD通过血统(lineage)实现容错,支持三种创建方式:从集合、外部文件和转换已有RDD。常见的算子包括转换(transformation)如map、filter和reduceByKey,以及行动(action)如saveAsTextFile。
摘要由CSDN通过智能技术生成

RDD基本概念

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将数据缓存在内存中,后续的查询能够重用这些数据,这极大地提升了查询速度。
Dataset:一个数据集合,用于存放数据的。
Distributed:RDD中的数据是分布式存储的,可用于分布式计算。
Resilient:RDD中的数据可以存储在内存中或者磁盘中。

RDD和MR的区别: MR更多的是面向数据的一次性处理,RDD速度更快,支持迭代算法和数据共享模型。

RDD里面的数据不可变,被用来进行并行计算。

RDD的属性

1)一组分片(Partition),即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。
如果文件的block个数 <=2 那么 sc.textFile(“file:///wordcount.txt”)分区个数为2
如果文件的block块个数 >2 那么 sc.textFile(“file:///wordcount.txt”)分区的个数等于block块的个数
2)一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。
3)RDD之间的依赖关系。RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。
4)一个Partitioner,即RDD的分片函数。当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于于key-value的RDD,才会有Partitioner,非key-value的RDD的Parititioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle输出时的分片数量。
5)**一个列表,存取每个Partition的优先位置(preferred location)。**对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。

RDD是一个应用层面的逻辑概念。一个RDD多个分片。RDD就是一个元数据记录集,记录了RDD内存所有的关系数据。

以单词统计为例来看Spark的五大属性:
在这里插入图片描述

RDD的弹性与特点

rdd的弹性:

1、自动进行内存以及磁盘文件切换

2、基于血统lineage的高效容错性。lineage记录了rdd之间的依赖关系

3、task执行失败自动进行重试

4、stage失败自动进行重试

5、checkpoint实现数据的持久化保存

rdd的特点:

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

只读:rdd当中的数据是只读的,不能更改

依赖:rdd之间的依赖关系

缓存:常用的rdd我们可以给缓存起来

checkpoint:持久化,对于一些常用的rdd我们也可以持久化

RDD的三种创建方式

RDD的创建三种方式

第一种方式创建RDD:由一个已经存在的集合创建

val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))

第二种方式创建RDD:由外部存储文件创建
包括本地的文件系统,还有所有Hadoop支持的数据集,比如HDFS、Cassandra、HBase等。

val rdd2 = sc.textFile("/words.txt")

第三种方式创建RDD:由已有的RDD经过算子转换,生成新的RDD

val rdd3=rdd2.flatMap(_.split(" "))

RDD中的算子

算子一般分为两种:

 Transformation(转换):根据数据集创建一个新的数据集,计算后返回一个新RDD;例如:一个rdd进行map操作后生了一个新的rdd。

Action(动作):对rdd结果计算后返回一个数值value给驱动程序。

常用的算子

transformation:

map(func)
map(func) 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成
在这里插入图片描述

scala> var source  = sc.parallelize(1 to 10)
source: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[8] at parallelize at <console>:24

scala> source.collect()
res7: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> val mapadd = source.map(_ * 2)
mapadd: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[9] at map at <console>:26

scala> mapadd.collect()
res8: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

lter(func)
filter(func) 返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成

scala> var sourceFilter = sc.parallelize(Array("xiaoming","xiaojiang","xiaohe","dazhi"))
sourceFilter: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[10] at parallelize at <console>:24
scala> val filter = sourceFilter.filter(_.contains("xiao"))
filter: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[11] at filter at <console>:26
scala> sourceFilter.collect()
res9: Array[String] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值