Spark-RDD模型介绍
更新时间 2021-09-10 19:13:59    浏览 0   

TIP

本文主要是介绍 Spark-RDD模型介绍 。

本篇文章主要是介绍什么RDD、RDD的5个特性和RDD的特征。

# 1.RDD是什么

RDD是Resilient Distributed Dataset。 RDD是Spark的基础数据结构。表现形式为不可变的分区元素的集合,并且可以在集群中并行操作。

# RDD解析

  • Resilient(弹性):在DAG的帮助下,具有容错性。即在节点故障导致丢失或者损坏分区,可以重新计算数据。
  • Distributed:数据存储在多个节点上。
  • Dataset:要处理的数据集。用户可以在外部数据源获取数据,这些数据源可以JSON文件、CSV文件、文本文件获取通过JDBC的形式获取数据库中没有特定数据结构的数据。

# RDD的5特属性

  • 获取分区列表(getPartitions):有一个数据分片列表,能够将数据进行切分,切分后的数据能够进行并行计算,是数据集的原子组成部分。
  • 可以在每一个分区上进行计算(compute):计算每个分区,得到一个可便利的结果,用于说明在父RDD上执行何种计算。
  • 获取每个RDD的依赖(getDependencies):计算每个RDD对父RDD的依赖列表,源RDD没有依赖,通过依赖关系描述血统。
  • RDD的键值分区器( @transient val partitioner: Option[Partitioner] = None):描述分区模式和数据存放的位置,键值对的RDD根据哈希值进行分区。
  • 在那个分区上进行计算最好(getPreferredLocations):每一个分片的优先计算位置。

RDD中的数据集是按照逻辑分不到集群中的节点上,这样可以在各个节点上并行计算。RDD具有容错性,在失败的情况下,可以自动恢复。

RDD可以被缓存,并且可以手动分区。

开发人员可以将需要再次使用的RDD进行持久化。Spark是默认将数据持久化到内存中,如果内存不足,会将数据写入到磁盘上。用户可以自定义持久化方式。

# 2.为什么需要RDD

提出RDD的动机有:

  • 迭代计算。
  • 交互式的数据挖掘工具。
  • DSM(Distributed Shared Memory)是一个通用的抽象,这种通用性使得在集群上高效执行和容错性变得更难。

RDD具有容错性,这是因为RDD是基于coarse-grained transformation而不是fine-grained updates来更新状态。

RDD是lazy的,在需要的时候,这样可以节省很多时间并提高效率。

# 3.RDD vs DSM

RDD DSM
Read RDD的读操作可以是粗力度,也可以是细粒度。 粗粒度是对整个数据集进行转换操作,而不是针对数据集中的每一个元素。 细粒度是针对数据集中的每一个元素进行转换操作。 DSM中的转换操作是细粒度的。
Write RDD的写入是粗粒度 DSM的写操作是细粒度
Consistency RDD的数据是不可变的 如果开发者遵循规则,内存中的数据保持一致,并且内存操作结果是可预测的
Fault-Recovery Mechanism 丢失的数据可以通过DAG来恢复,RDD的数据都是不可变的,很容易恢复 通过checkpoint实现容错,如果出现问题,回到最新的checkpoint
Straggler Mitigation RDD可以用备份任务来解决运行比较慢的任务 解决运行慢的任务非常困难
Behavior if not enough RAM RDD的数据比较多,在内存中存储不了,将多余数据写入磁盘 DSM中,如果数据量大于内存的最大值,性能下降厉害

# 4.RDD的特征

# 4.1 In-memory Computation

Spark RDD具有内存计算功能。RDD将中间的结果存储在内存中,如果内存中存不下的时候,将数据放在磁盘上。

# 4.2 Lazy Evaluations

Spark的所有转换操作都是Lazy的,如果遇到action操作时,才会执行之前的操作。

# 4.3 Fault Tolerance

Spark RDD具有容错能力。如果碰到故障时,RDD可以根据追踪数据的依赖关系,来重新生成丢失的数据。

# 4.4 Immutability

RDD中的数据都是不可变的,可以在进程之间共享使用。

# 4.5 Partitioning

分区是RDD并行计算的基本单元。每个分区都是一个可变数据的逻辑分区。在现有分区的基础上可以通过一些转换操作生成新的分区。

# 4.6 Coarse-grained Operations

将一个方法作用于数据集中的每一个元素。

# 4.7 Location-Stickiness

RDD可以定义计算分区的放置首选项。DAG Scheduler将尽量任务放到数据所在的节点上。

# 4.8 Persistence

RDD可以根据需要不同,选择相应的存储策略。

# 5.RDD Operation

# 5.1 Transformations

RDD的转换操作都是lazy的,分为两种narrow transformation, wide transformation。

# 5.1.1 Narrow Transformations(窄依赖)

在单个分区中计算记录所需的所有元素都存在父RDD的单个分区中。 map、flatMap、MapPartition、filter、Sample、Union操作的结果就是Narrow transformation。

一个父RDD的partition至少会被子RDD的某个partition使用一次。就是一个父类RDD的一个分区不可能对应一个子RDD的多个分区。

# 5.1.2 Wide transformation(宽依赖)

在单个分区中计算记录所需的所有元素都存在父RDD的多个分区中。 intersection、distinct、reduceByKey、GroupByKey、join、Cartesian、repartition、colaesce操作的结果是Wide transformation。

一个父RDD的partition会被子RDD的partition使用多次。就是一个父RDD的一个分区对应一个子RDD的多个分区。

Join操作:窄依赖,两个数据集使用相同的分区器;宽依赖,使用不同的分区器。

可以使用toDebugString,看到RDD的线性信息,如果出现ShuffleDependency,就是发生shuffle操作。

# 5.1.3依赖关系说明

窄依赖的RDd可以通过相同的键进行联合分区,整个操作都可以在一个集群节点上进行,以流水线的方式计算所有父分区,不会造成网络之间的数据混合。

宽依赖RDD涉及数据混合,宽依赖需要首先计算好所有父分区数据,然后在节点直接进行shuffle。

窄依赖能够更有效的进行失效节点的恢复,重新计算丢失RDD分区的父分区,不同节点之间可以并行计算; 对一个宽窄依赖的血统图,单个节点失效可能导致这个RDD的所有祖先丢失部分数据,因而需要整体重新计算(Shuffle执行时固化操作,以及采取persist缓存策略,可以在固化点或者缓存点重新计算)。

执行时,调度程序检查依赖性的类型,将窄依赖的RDD划到一组处理当中,即Stage,宽依赖在一个跨越连续的Stage,同时需要显示指定多个子RDD的分区。

可以参考Wide vs Narrow Dependencies (opens new window)

# 6.RDD的局限性

# 6.1 No input optimization engine

RDD没有自动优化的规则,无法使用Spark高级优化器,例如catalyst优化器和Tungsten执行引擎。可以实现手动RDD优化。

在Dataset和DataFrame中不存在这个问题,DataSet和DataFrame可以使用catalyst来产生优化后的逻辑和物理执行计划,这样可以节省空间和提高运行速度。

# 6.2 Runtime type safety

在RDD中没有静态类型和运行时类型安全,并且不允许在运行时检查错误。 Dataset提供了编译时期类型安全来构建复杂数据工作流。

# 6.3 Degrade when not enough memory

在存储RDD时,如果没有足够的内存或者磁盘,将会使得RDD的性能下降特别厉害。

# 6.4 Performance limitation & Overhead of serialization & garbage collection

因为RDD是内存中的JVM对象,这就牵扯到GC和Java序列化,在数据增长时,会需要大量的内存或者磁盘空间。 GC的成本与Java对象是成正比的,使用数据结构比较少的对象可以减少成本,或者将数据持久化。

# 6.5 Handling structured data

RDD不提供数据的schema信息。 Dataset和DataFrame提供了数据的schema信息,可以每一列数据的含义。

# 【----------------------------】

# Spark—RDD介绍

Spark—RDD

# 1、概念介绍

RDD(Resilient Distributed Dataset):弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。

官方定义还是比较抽象,个人理解为:它本质就是一个类,屏蔽了底层对数据的复杂抽象和处理,为用户提供了一组方便数据转换和求值的方法。

# 2、RDD特点

# 1)不可变:

弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合

# 2)可分区:

RDD在抽象上来说是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布在集群中的不同Worker节点上,从而让RDD中的数据可以被并行操作。(分布式数据集)

# 3)弹性:

  • 1.存储弹性:内存与磁盘的自动切换
  • 2.容错弹性:数据丢失可以自动恢复
  • 3.计算弹性:计算出错重试机制
  • 4.分片弹性:根据需要重新分片

# 3、在计算数据中RDD都做了什么:

wxmp

主要流程:

RDD创建——>RDD转换——>RDD缓存——>RDD行动——>RDD的输出

spark计算的核心就在RDD转换、缓存、行动上。

# 4、Spark wordcount 解释RDD

wxmp

# 参考文章

  • https://www.jianshu.com/p/c43cd6a5538d
  • https://www.cnblogs.com/jnba/p/10830446.html
更新时间: 2021-09-10 19:13:59
  0
手机看
公众号
讨论
左栏
全屏
上一篇
下一篇
扫一扫 手机阅读
可分享给好友和朋友圈