大数据入门:Spark RDD基础概念

2020-12-09 17:45:14 浏览数 (1)

在Spark框架的核心部分,SparkCore作为平台基础通用执行引擎,重要性自是不必多说。而在SparkCore当中,RDD作为SparkCore的核心抽象,是需要重点搞懂的概念。今天的大数据入门分享,我们就来讲讲Spark RDD入门基础。

Spark框架的核心是SparkCore,而在更深一个层面上,SparkCore的核心就是RDD。SparkCore建立在统一的抽象RDD之上,这使得Spark的各个组件可以随意集成,可以在同一个应用程序中使用不同的组件以完成复杂的大数据处理任务。

RDD设计初衷

RDD,全称Resilient Distributed Datasets,在设计之初是为了解决计算框架对不同应用场景处理效率不高的问题,比如说迭代式算法和交互式数据挖掘。在这两种应用场景中,通过将数据保存在内存中,可以将性能提高到几个数量级。

对于迭代式算法而言,比如PageRank、K-means聚类、逻辑回归等,常常需要重用中间结果;而交互式数据挖掘,常常需要在同一份数据集上运行多个即席查询。

大部分的计算框架(比如Hadoop),使用中间计算结果的方式是将其写入到一个外部存储设备(比如HDFS),这会增加额外的负载(数据复制、磁盘IO和序列化),由此会增加应用的执行时间。

RDD可以有效地支持多数应用中的数据重用,它是一种容错的、并行的数据结构,可以让用户显性地将中间结果持久化到内存中,并且可以通过分区来优化数据的存放,另外,RDD支持丰富的算子操作,用户可以很容易地使用这些算子对RDD进行操作。

RDD基本概念

本质上来说,一个RDD就是一个分布式对象集合,一个只读的、分区的记录集合。每个RDD可以分成多个分区,不同的分区保存在不同的集群节点上。

RDD是一种高度受限的共享内存模型,即RDD是只读的分区记录集合,所以也就不能对其进行修改。只能通过两种方式创建RDD,一种是基于物理存储的数据创建RDD,另一种是通过在其他RDD上作用转换操作(transformation,比如map、filter、join等)得到新的RDD。

RDD不需要被物化,它通过血缘关系(lineage)来确定其是从RDD计算得来的。另外,用户可以控制RDD的持久化和分区,用户可以将需要被重用的RDD进行持久化操作(比如内存、或者磁盘)以提高计算效率。也可以按照记录的key将RDD的元素分布在不同的机器上,比如在对两个数据集进行JOIN操作时,可以确保以相同的方式进行hash分区。

RDD主要特点

①基于内存

RDD是位于内存中的对象集合。RDD可以存储在内存、磁盘或者内存加磁盘中,但是,Spark之所以速度快,是基于这样一个事实:数据存储在内存中,并且每个算子不会从磁盘上提取数据。

②分区

分区是对逻辑数据集划分成不同的独立部分,分区是分布式系统性能优化的一种技术手段,可以减少网络流量传输,将相同的key的元素分布在相同的分区中可以减少shuffle带来的影响。RDD被分成了多个分区,这些分区分布在集群中的不同节点。

③强类型

RDD中的数据是强类型的,当创建RDD的时候,所有的元素都是相同的类型,该类型依赖于数据集的数据类型。

④懒加载

Spark的转换操作是懒加载模式,这就意味着只有在执行了action(比如count、collect等)操作之后,才会去执行一些列的算子操作。

⑤不可修改

RDD一旦被创建,就不能被修改。只能从一个RDD转换成另外一个RDD。

⑥并行化

RDD是可以被并行操作的,由于RDD是分区的,每个分区分布在不同的机器上,所以每个分区可以被并行操作。

⑦持久化

由于RDD是懒加载的,只有action操作才会导致RDD的转换操作被执行,进而创建出相对应的RDD。对于一些被重复使用的RDD,可以对其进行持久化操作(比如将其保存在内存或磁盘中,Spark支持多种持久化策略),从而提高计算效率。

0 人点赞