大数据技术之SparkCore(1)

RDD :弹性分布式数据集

什么是RDD

RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,他代表一个比可变,可分区,里面的元素可并行计算的集合.在Spark中,对数据的所有操作不外乎创建RDD,转化(算子)已有RDD以及调用RDD操作进行求值(执行).每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上.RDD可以包含Pyhon,JAVA,Scala中任意类型的对象,甚至可以包含用户自定义的对象.RDD具有数据流模型的特点:自动容错,位置感知性调度和可伸缩性.RDD允许用户在执行多个查询时显示地将工作集缓存(cache)在内存中,后续的查询能够重用工作集群,这极大地提升了查询速度

        RDD支持两种操作:转化(TransFormation(抽象懒加载))操作和行动(action)操作.RDD的转化操作是返回一个新的RDD操作,比如map()和filter(),而行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作.比如count()和first()

       spark采用惰性计算模式,RDD只有在第一次在一个行动操作中用到时,才会真正计算.Spark可以优化整个计算过程.默认情况下,Spark的RDD会在每次对它们进行行动操作时重新计算.如果想在多个行动操作中重用一个RDD,可以使用RDD.persist()让spark把这个RDD缓存下来

RDD的属性

1) 一组分片(partition),即数据集的基本组成单位.对于RDD来说,每个分配片都会被一个计算任务处理,并决定计算的维度,用户可以在创建RDD时指定RDD分片个数,如果没有指定,那么就会采用默认值.默认值就是程序所分配到的CPU CORE 的数目

2)一个core计算每个分区的函数.spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的.copute函数会对迭代器进行复合,不需要保存每次计算的结果

3)RDD之间的依赖关系.RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系(血缘关系).在部分分区数据丢失时,spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算

4)一个Partitioner,即RDD的分区函数.当前spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另一个是基于范围的RangePartitioner.只有对于key-value的RDD,才会有Partitioner.非key-value的RDD的Partitioner的值是None.Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle的输出时的分片数量

5)一个列表(FIFO),存储存取每个Partition的优先位置(preferred location).对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置.按照"移动数据不如移动计算"的理念,spark在进行任务调度的时候,会尽可能地将任务计算分配到其所要处理数据块的存储位置

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

RDD的弹性

1)自动进行内存和磁盘数据储存的切换 存储弹性.

spark优先把数据放到内存中,如果内存放不下,就会放到磁盘里面,程序进行自动的存储切换

2)基于血统的高效容错机制(过程弹性)

在RDD进行转换和动作的时候,会形成RDD的lineage依赖链,当某一个RDD失效的时候,可以通过重新计算上游的RDD来重新生成丢失的RDD 数据

3)Task如果失败会自动进行特定次数的重试

RDD的任务如果运行失败,会自动进行任务的重新计算,默认次数是4次

4)Stage 如果失败会自动进行特定次数的重试(是否执行shuffle)

如果JOB的某个Stage阶段计算失败,框架也会自动进行 任务的重新计算,默认次数也是4次

5)Checkpoint 和Persist可主动或被动触发

RDD可以通过Persist持久化将RDD缓存到内存或者磁盘,当再次用到该RDD时直接读取就行.也可以将RDD进行检查点,检查点会将数据储存在HDFS中.该RDD的所有父RDD依赖都会被移除

6)数据调度弹性

spark把这个job执行模型抽象为通用的有向无环图DAG 可以将Stage的任务串联或并行执行,调度引擎自动处理stage的失败以及Task的失败

7)数据分片的高度弹性

可以根据业务的特征,动态调整数据分片的个数,提升整体的应用执行效率

RDD全程叫做弹性分布式数据集(Resilient Distributed Datasets),它是一种分布式的内存抽象,表示一个只读的记录分区的集合,它只能通过其他RDD进行RDD转换而创建,为此,RDD支持丰富的转换操作(如map,join,filter,groupBy等),通过这种转换操作,新的RDD则包含了如何从其他RDDs衍生所必须的信息.所有RDDs之间是有依赖关系的基于RDDs之间的依赖,RDDs会形成一个有向无环图DAG,该DAG描述了整个数据计算的流程,实际执行的时候,RDD是通过血缘关系(Lineage)一气呵成的,即是出现数据分区丢失,也可以用过血缘关系重建分区,总结起来,基于RDD的流式计算任务可描述为:从稳定的物理储存(如分布式文件系统)中加载记录,记录被传入由一组确定性操作构成的DAG,然后写会稳定存储.另外RDD还可以将数据集缓存到内存中,使得在多个操作之间可以重写数据集,基于这个特点可以很方便地构建迭代型应用(图计算.机器学习等)或者交互式数据分析应用.可以说spark最初也就是实现RDD 的一个分布式系统,后面通过不断发展壮大成现在较为完善的大数据生态系统,简单来说,spark-RDD的关系类似于Hadoop-MapReduc关系

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值