sparkrdd(sparkrdd是什么)
本篇文章给大家谈谈sparkrdd,以及sparkrdd是什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Spark最基本的单位 RDD
- 2、Spark-RDD分区器
- 3、sparkrdd中没有的特性
- 4、什么是 Spark RDD ?
- 5、spark RDD
- 6、spark之RDD详解----五大特性
Spark最基本的单位 RDD
最近在负责Spark Streaming 结合 Spark Sql的相关项目,语言是Java,留下一些笔记,也供大家参考,如有错误,请指教!
1.RDD(Resilient Distributed Dataset):弹性分布式数据集。
2.RDD是只读的,由多个partition组成
3.Partition分区,和Block数据块是一一对应的
1.Driver:保存block数据,并且管理RDD和Block的关系
2.Executor 会启动一个BlockManagerSlave,管理Block数据并向BlockManagerMaster注册该Block
3.当RDD不再需要存储的时候,BlockManagerMaster将向BlockManagerSlave发送指令删除相应的Block。
Transformation:转换算子,这类转换并不触发提交作业,完成作业中间过程处理。
Action:行动算子,这类算子会触发SparkContext提交Job作业。
RDD的依搜答赖关系有两种:窄依赖(narrow dependency)和宽依赖(wide dependency)。
窄依码迹赖: 每一个parent RDD的Partition最多被世模慧子RDD的一个Partition使用
宽依赖: 多个子RDD的Partition会依赖同一个parent RDD的Partition
[img]Spark-RDD分区器
Spark中现在支持的分区器有Hash分区器和Range分区器,除此之外,用户也可以自定义分区方式。默认的分区方式为Hash分区器。
Spark中的分区器直接决定了RDD中分区的个数,以及RDD经过Shuffle后数据的分区和Reduce的任务数。
注:
可以通过RDD的 partitioner 属性来获取RDD的分区器。
结果:
看到现在没有分区器,现在我们设置分区器并重新分区:
结果:
可以看到分区器已经成为我们指定的 HashPartitioner
HashPartitioner分区的原理:对于给的key,计算其hashcode,并除以分区数取余,如果余数小于0,则设置分区ID为余数+分区的个数,若大于0则核李宽,直接设置余数为分区ID。
使用HashPartitioner存在一些弊端,由于散列函数会发生碰撞,对于不同的数据,发生碰撞的概率不同,因此会导致分区数据的倾斜问题。
而RangePartitioner则扰洞很好的解决了这个问题,它将将一定范围的数据映射至某一分区,尽可能的保证分区间数据量均匀,实现过程为:
要实现自定改亮义分区,需要继承Partitioner类,并实现以下方法:
sparkrdd中没有的特性
sparkrdd中没键薯链有的特性是不支持细粒度的写和更新操作(如网络爬虫)。根据相关资料查询spark写数据是粗粒手孝度的,所谓粗粒度,就是批量写入数据,为了提高稿孙效率,但是读数据是细粒度的也就是说可以一条条的读,就是比较麻烦。
什么是 Spark RDD ?
RDD 是一个弹性的分布式的数据集,是 Spark 中最基础的抽象。它表示了一个可以并行操作的、不可变得、被分区了的元素集合。用户不需要关心底层复杂的抽象处理,直接使用方便的算子处理和计算就可以了。
RDD 示意图:
默认情况下,一个 HDFS 上的数据分片就是一个 partiton,RDD 分片数决定了并行计算的力度,可以在创建 RDD 时指定 RDD 分片个数,如果不指定分区数量,当 RDD 从集合创建时,则默认分区数量为该程序所分配到的资源的 CPU 核数 (每个 Core 可以承载 2~4 个 partition),如果是从 HDFS 文件创建,默认为文件的 Block 数。
有一点非常重要,就是由于 RDD 有前后依赖关系,遇到弯桥宽依赖关系,如 reduce By Key 等这些操作时划分成 Stage, Stage 内部的操作都是通过 Pipeline 进行的,在具体处理数据时它会通过 Blockmanager 来获取相关的数据,因为具体的 split 要从外界读数据,也要把具体的计算结果写入外界,所以用了一个管理器,具体的 split 都会映射成 BlockManager 的 Block,而体的 splt 会被函数处理,函数处理的具体形式是以任务的形式进行的。
并行集合的方式:
引用外部存储系统的数据集 (text、HDFS、Hbase 等):
最简单的理解就是在 RDD 的算子中使用了外部 (Driver 端) 定义的变量。
RDD 每经过一次转换操作都会生成一个新的 RDD,它们之间存在着依赖关系,这种依赖关系被划分成了两种,即 窄依赖 和 宽依赖 。
宽窄依赖示意图
当 RDD 触发了 action 算子之后,DAGScheduler 会开始分析最终 RDD 形成的依赖关系,逆向往前推导,前一个 RDD 被看做是父 RDD。每当遇到一个 宽依答银赖 的时候,便会以此为分界线,划分出一个 Stage。
stage 划分
当一个 RDD 需要被重复使用时,或者当任务失败重新计算的时候,这时如果将 RDD 缓存起来,就可以避免重新计算,保证程序运行的性能。
其实 cache 底层实际调用的就是 persist 方法,只是缓存的级别默认是 MEMORY_ONLY,而 persist 方法可以指定其他的缓存级别。
persist 也可以选择将数据缓存到磁盘当中,但是它交给 blockManager 管理的,一旦程序运行结束,blockManager 也会被停止,这时候埋举猛缓存的数据就会被释放掉。而 checkPoint 持久化的数据并不会被释放,是一直存在的,可以被其它的程序所使用。
What is RDD ?
RDD is the spark's core abstraction which is resilient distributed dataset.
It is the immutable distributed collection of objects.
RDD Creation
RDD vs Dataframe vs Dataset
spark RDD
job由stage构成,stage由task构成。
job:一个action就是一个job
job-划分-stage:当遇到宽依赖,则划分一个stage。
stage-划分-task:task对等partition概念。
Spark 的核心是建立在统一的抽象弹性分布式数据集(Resiliennt Distributed Datasets,RDD)之上的.
RDD特性:
图 1 RDD 分区及分区与工作节点的分布关系
transformation:惰性、实际没有执行、直到action操作才真正运行
表 1 RDD转换操作(rdd1={1, 2, 3, 3},rdd2={3,4,5})
action操作:行动操作接受 RDD,但是返回非 RDD,即输出一个值或者结果
窄依赖是指父 RDD 的每个分区 最多 会被1个子 RDD 的分区所使用。
宽依赖是指父 RDD 的每个分区 会被多个子分区所依赖。
map、filter、union 等操作是窄依赖,而 groupByKey、reduceByKey 等操作是宽依赖。
join 操作有两种情况,如果 join 操作中使用的每个 Partition 仅仅和固定个 Partition 进行 join,则顷嫌该 join 操作是窄依赖,其他情况下的 join 操作是宽依赖。
所以可得出一个结论,窄依赖不仅包含一对一的窄依赖,还包含一对凯冲固定个数的窄依赖,也就是说,对父 RDD 依赖的 Partition 不会随着 RDD 数据规模的改变而改变。
Spark 的这种依赖关系设计,使其具有了天生的容错性,大大加快了 Spark 的执行速度。RDD 通过血缘关系记住了它是如何从其他 RDD 中演变过来的。当这个 RDD 的部分分区数据丢失时,它可以通过血缘关系获取足够的信息来重新运算和恢复丢失的数据分区,从而带来性能的提升。
相对而言,窄依赖的失败恢复更为高效,它只需要根据父 RDD 分区重新计算丢失的分区即可,而不需要重新计算父 RDD 的所有分区。而对于宽依赖来讲,单个结点失效,即盯乎歼使只是 RDD 的一个分区失效,也需要重新计算父 RDD 的所有分区,开销较大。
spark之RDD详解----五大特性
spark Github :
RDD: 让开发者大大降低开发分布式应用程序的门槛以及执行效率。
RDD源码:
弹性:代表着spark在分布式计算的时候,可以容错 ---计算层面
分布式:把一份咐粗滑数据拆分成多份衡腊,在各个节点上并行的运行,他们之间没有任何的依赖关系
数据集:一个文件就是一个数据集
partitioned collection of elements :数据可以拆分成分区
that can be operated on in parallel.:每个分区的内容可以并行的被操作
解释:
RDD(1,2,3,4,5,6,7,8,9) 假如需要 + 1
那么数据被分成三个分区,只要每个分区上的内容都执行+1的操作就可以
Hadoop001: (1,2,3) +1
Hadoop002: (4,5,6) +1
Hadoop003: (7,8,9) +1
@transient private var sc: SparkContext,
@transient private var deps: Seq[Dependency[ ]]
) extends Serializable with Logging {
(1)抽象类:RDD必然是由子类实现的,我们使用的直接使用其子类即可
(2)Serializable:可以序列化
(3)Logging:spark1.6可以使用,spark2.0之后不可以使用
(4)T:存储各种数据类型
(5)SparkContext
(6)@transient
大数据里面一般是移动数据不是移动计算,所以数据本地化计算这样性能更高。
def compute(split: Partition, context: TaskContext): Iterator[T]
RDD计算是对RDD里面的分区做计算,所以传入split: Partition 对应的RDD特点第二点
protected def getPartitions: Array[Partition]:凳李
拿到分区,RDD是由一系列的分区构成,所以得到的一定是分区 Array[Partition] 对应着第一大特点
......
关于sparkrdd和sparkrdd是什么的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。