Spark Core

Spark的核心是Spark Core

Spark的核心是Spark Core,上面的Spark Sql对接的是Hive等结构化查询,Spark Streaming是对接的流式计算,后面的那两个也是主要用在科学任务中,但是他们的基础都是spark core,而Spark core的核心就是RDD操作,RDD的操作最重要的是算子。
在这里插入图片描述

RDD产生背景

RDD是Spark的基石,是实现Spark数据处理的核心抽象。
Hadoop的MapReduce是一种基于数据集的工作模式,面向数据,这种工作模式一般是从存储上加载数据集,然后操作数据集,最后写入物理存储设备。数据更多面临的是一次性处理。
MR中的迭代:
在这里插入图片描述
MR的这种方式对数据领域两种常见的操作不是很高效。第一种是迭代式的算法,基于数据集或者数据集的衍生数据反复查询反复操作,即使多MR串行处理,性能和时间也是一个问题。另外一种是交互式数据挖掘,MR显然不擅长。
Spark中的迭代:
在这里插入图片描述
注:提供一个抽象数据架构,避免中间结果存储

RDD概述

RDD的全称是,Resilient Distributed Dataset,弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。在 Spark 中,对数据的所有操作不外乎创建 RDD、转化已有RDD 以及调用 RDD 操作进行求值。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。
RDD支持两种操作:转化操作和行动操作。RDD 的转化操作是返回一个新的 RDD的操作,比如 map()和 filter(),而行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作。比如 count() 和 first()。
注:Spark采用惰性计算模式,RDD只有第一次在一个行动操作中用到时,才会真正计算。Spark可以优化整个计算过程。默认情况下,Spark 的 RDD 会在你每次对它们进行行动操作时重新计算。如果想在多个行动操作中重用同一个 RDD,可以使用 RDD.persist() 让 Spark 把这个 RDD 缓存下来。

RDD的特点

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

RDD的属性

给定一个RDD我们至少可以知道如下几点信息:1、分区数以及分区方式;2、由父RDDs衍生而来的相关依赖信息;3、计算每个分区的数据,计算步骤为:1)如果被缓存,则从缓存中取的分区的数据;2)如果被checkpoint,则从checkpoint处恢复数据;3)根据血缘关系计算分区的数据。
在这里插入图片描述
1、分区
一组分片(Partition),即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。每个分区的数据是抽象存在的,计算的时候会通过一个compute函数得到每个分区的数据。
注:1、用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。
2、compute函数会对迭代器进行复合,不需要保存每次计算的结果。
2、只读
DD只读的,要想改变RDD中数据,可通过ransformations算子和actions算子,在现有的基础上创建新的RDD。
3、依赖
每一条partition操作线叫做task,task中会有依赖关系,因此即使Rdd丢失了,也会根据它的父Rdd重新计算得到。
注:1、RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生所必需的信息,RDDs之间维护着这种血缘关系,也称之为依赖。依赖包括两种,一种是窄依赖,RDDs之间分区是一一对应的,另一种是宽依赖,下游RDD的每个分区与上游RDD的每个分区都有关,是多对多的关系。
2、宽依赖中ShuffleWrite端如果结果不进行缓存或者持久化,则会将结果写到磁盘。
3、shuffle:
为了解决存放在不同partition上的数据聚合问题。shuffle可分为shuffle_write和shuffle_read。shuffle常用的种类可分为HashShuffle和SortShuffle,
shuffle_write端每一个stage的MapTask都会将自己处理的当前分区中key相同的数据写到一个分区文件中,每个stage中会有多个MapTask,因此也会又多个分区文件,
shuffle_read端ReduceTask会从shuffle_write端的stage上所有的task所在节点上寻找到属于自己分区文件并拉取到ReduceTask对应的文件缓冲区中,保证每个相同key的数据都汇聚到同一个节点上进行处理
4、缓存
如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。
5、CheckPoint
虽然RDD的血缘关系可以实现容错,当RDD的某个分区数据失败或丢失,可以通过血缘关系重建。但随着迭代的进行,RDDs之间的血缘关系会越来越长,出错需要重建较长的血缘关系。因此,RDD支持checkpoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,从checkpoint处拿到数据。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值