RDD

作者: SunnyRivers | 来源:发表于2018-12-14 23:19 被阅读0次

RDD的定义

RDD是分布式内存的一个抽象概念,是一种高度受限的内存模型,即RDD是只读的记录分区的集合,能横跨集群所有节点并行计算,是一种基于工作集的应用抽象

RDD底层存储原理

其数据分布存储在多态机器上,事实上,每个RDD的数据都以Block的形式存储于多台机器上,每个Executor会启动一个BlockManagerSlave,并管理一部分Block;而Block的元数据由Driver节点上的BlockMangerMaster保存,BlockManagerSlave生成Block后向BlockManagerMaster注册该Block,BlockManagerMaster管理RDD与Block的关系,当RDD不再需要存储的时候,将向BlockManagerSlave发送指令删除相应的Block。
BlockManager管理RDD的物理分区,每个Block就是节点上对应的一个数据块,可有存储在内存或者磁盘上。而RDD中的Partition是一个逻辑数据块,对应相应的物理块Block。本质上,一个RDD在代码中相当于数据的一个元数据结构,存储着数据分区及逻辑结构映射关系,存储着RDD之前的依赖转换关系。
BlockManager在每个节点上运行管理Block(Driver和Executor),它提供一个接口检查本地和远程的存储变量,如memory、disk、off-heap。使用BlockManager前必须先初始化

RDD五大特性

(1)分区列表(a list of partition)

Spark RDD是被分区的,每一个分区都会被一个计算任务(Task)处理,分区数决定并行计算数量,RDD的并行度默认从父 RDD传给子RDD。默认情况下,一个HDFS上的数据分片就是一个Partition,RDD分片数决定了并行计算的力度,可以在创建RDD的时候指定RDD的分片个数,如果不指定分区数量,如果不指定分区数据量,当RDD从集合创建时,则默认分区数量为该程序所分配到的资源的CPU核数(每个Core可以承载2~4个Partition),如果是从HDFS文件创建,默认为文件的Block数。

(2)每个分区都有一个计算函数(a function for computing each split)

每个分区都会有计算函数,Spark的RDD的计算函数是以分片为基本单位的,每个RDD都会实现compute函数,对具体的分片进行计算,RDD的分片是并行的,所以是分布式并行计算。有一点非常重要,就是因为RDD有前后依赖关系,遇到宽依赖关系,例如,遇到reduceBykey等宽依赖操作的算子,Spark将根据宽依赖划分Stage,Stage内部通过Pipeline操作,通过BlockManger获取相关的数据,因为具体的split要从外界读数据,也要把具体的计算结果写入外界,所以用了一个管理器,具体的split都会映射成BlockManager的Block,而具体split会被函数处理,函数处理的具体形式是以任务的形式进行

(3)依赖于其他RDD的列表(a list of dependencies on other RDDs)

RDD的依赖关系,由于RDD每次转换都会生成新的RDD,所以RDD会形成类似流水线的前后依赖关系,当然宽依赖就不类似于流水线了,宽依赖后面的RDD具体的数据分片会依赖前面所有的RDD的所有的数据分片,这是数据分片就不进行内存中的Pipeline,这时一般是跨机器的。因为有前后依赖关系,所以当有分区数据丢失的时候,Spark会通过依赖关系重新计算,算出丢失的数据,而不是对RDD的所有分区进行重新计算。RDD之间的依赖关系有两种:窄依赖(Narrow Dependency)、宽依赖(Wide Dependency)。RDD是Spark的核心数据结构,通过RDD的依赖关系形成调度关系。通过对RDD的操作形成整个Spark程序。
RDD有Narrow Dependency和Wide Dependency两种不同的类型依赖,其中Narrow Dependency指的是每一个parent RDD的Partition最多被child RDD的一个Partition所使用,而Wide Dependency指的是多个child RDD的Partition会依赖于同一个parent RDD的Partition。可以从两个方面来理解RDD之间的依赖关系:一方面是该RDD的parent RDD是什么;另一方面是依赖于parent RDD有哪些Partitions;根据依赖于parent RDD的Partitions的不同情况,Spark将Dependency分为宽依赖和窄依赖两种。Spark中宽依赖指的是生成的RDD的每一个partition都依赖于父 RDD的所有Partition,宽依赖典型的操作有groupByKey、sortByKey等,宽依赖意味着shuffle操作,这是Spark划分Stage边界的依据,Spark中宽依赖支持两种 Shuffle Manager,即HashShuffleManager和SortShuffleManager,前者是基于Hash的Shuffle机制,后者是基于排序的Shuffle机制。Spark2.2现在的版本中已经没有Hash Shuffle的方式

(4)key-value类型数据的RDD分区器(-Optionally,a Partitioner for key-value RDDs)控制分区策略和分区数

每个key-value形式的RDD都有Partitioner属性,它决定了RDD如何分区。当然,Partition的个数还决定每个Stage的Task个数。RDD的分片函数,想控制RDD的分片函数的时候可以分区(Partitioner)传入相关的参数,如HashPartitioner、RangePartitioner,它本身针对key-value的形式,如果不是key-value形式,就不会有具体的Partitioner。Partitioner本身决定了下一步会产生多少并行的分片,同时它本身也决定了当前并行(parallelize)Shuffle输出的并行数据,从而使Spark具有能够控制数据在不同节点上分区的特性,用户可以自定义分区策略,如Hash分区等。Spark提供了“partitionBy”运算符,能通过集群对RDD进行数据再分配来创建一个新的RDD

(5)每一个分区都有一个优先位置的列表(-Optionally,a list of preferred locations to compute each split on)

它会存储每个Partition的优先位置,对于一个HDFS文件来说,就是每个Block块的位置。观察运行Spark集群的控制台会发现Spark的具体计算,具体分片前,它已经清楚的知道任务发生在什么节点上,也就是说,任务本身是计算层面的、代码层面的,代码发生运算之前已经知道它要运算的数据在什么地方,有具体节点的信息。这就符合大数据中数据不动代码动的特点。数据不动代码动的最高境界是数据就在当前节点的内存中。这时有可能是memory级别的或Alluxio级别的,Spark本身在进行任务调度的时候,会尽可能将任务分配到处理数据块所在的具体位置。据Spark的RDD.Scala源码函数getPreferredLocaitions可知,每次计算都符合完美的数据本地性

相关文章

  • RDD的依赖关系:宽依赖和窄依赖

    RDD之间的依赖关系是指RDD之间的上下来源关系,RDD2依赖RDD1,RDD4依赖于RDD2和RDD3,RDD7...

  • RDD(二)

    class RDD源码解析 1.1 RDD源码 1.2 RDD类解释 1.3 RDD class中如何体现RDD的...

  • Spark Core2--LineAge

    Lineage RDD Lineage(又称为RDD运算图或RDD依赖关系图)是RDD所有父RDD的graph(图...

  • RDD详解

    RDD基本操作(引用) 1、RDD是什么 RDD:Spark的核心概念是RDD (resilientdistrib...

  • 【Spark入门-笔记】RDD编程

    1 RDD基础 2 创建RDD-两种方式 2.1 进行并行化创建RDD 2.2 读取数据创建RDD 3 RDD操作...

  • SPARK[RDD之转换函数]

    前面讲到了RDD的分区、RDD的创建,这节将讲解RDD的转换,RDD的转换就是从父RDD生成一个新的RDD,新的R...

  • Spark-core:Spark的算子

    目录一.RDD基础1.什么是RDD2.RDD的属性3.RDD的创建方式4.RDD的类型5.RDD的基本原理二.Tr...

  • Spark中repartition和coalesce的用法

    在Spark的Rdd中,Rdd是分区的。 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多...

  • Spark中对RDD的理解

    Spark中对RDD的理解 简介 what the is RDD? RDD(Resilient Distribut...

  • Spark RDD

    一、RDD概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹...

网友评论

    本文标题:RDD

    本文链接:https://www.haomeiwen.com/subject/endnhqtx.html