RDD的概念及Pyspark操作RDD

RDD

1.简介

RDD(弹性分布式数据集) 是 PySpark 的基本构建块,它是容错不可变的 分布式对象集合。

换句话说,RDD 是类似于 Python 中的列表的对象集合,不同之处在于 RDD 是在分散在多个物理服务器上的多个进程上计算的,也称为集群中的节点,而 Python 集合仅在一个进程中存在和处理。 一旦你创建了一个 RDD,就不能改变它。

RDD是Spark编程中最基本的数据对象, 无论是最初加载的数据集,还是任何中间结果的数据集,或是最终的结果数据集,都是RDD。 在Pyspark中,RDD是由分布在各节点上的python对象组成,如列表,元组,字典等。 RDD主要是存储在内存中(亦可持久化到硬盘上),这就是相对于Hadoop的MapReduce的优点,节省了重新读取硬盘数据的时间。

  • 弹性:RDD是有弹性的,意思就是说如果Spark中一个执行任务的节点丢失了,数据集依然可以被重建出来;
  • 分布式:RDD是分布式的,RDD中的数据被分到至少一个分区中,在集群上跨工作节点分布式地作为对象集合保存在内存中;
  • 数据集:RDD是由记录组成的数据集。

RDD的另一个关键特性是不可变,也即是在实例化出来导入数据后,就无法更新了。 每次对已有RDD进行转化操作(transformation)都会生成新的RDD

2.PySpark RDD 的优势

内存处理

PySpark 从磁盘加载数据并 在内存中处理数据 并将数据保存在内存中,这是 PySpark 和 Mapreduce(I/O 密集型)之间的主要区别。在转换操作过程中,我们还可以在内存中缓存/持久化 RDD 以重用之前的计算。

不变性

PySpark 在 HDFS、S3 等上的容错数据存储上运行,因此任何 RDD 操作失败,它会自动从其他分区重新加载数据。此外,当 PySpark 应用程序在集群上运行时,PySpark 任务失败会自动恢复一定次数(根据配置)并无缝完成应用程序。

惰性运算

PySpark 不会在驱动程序出现/遇到 RDD 转换时对其进行评估,而是在遇到(DAG)时保留所有转换,并在看到第一个 RDD 操作时评估所有转换。

分区

当从数据创建 RDD 时,它默认对 RDD 中的元素进行分区。默认情况下,它会根据可用内核数进行分区。

局限

PySpark RDD 不太适合更新状态存储的应用程序,例如 Web 应用程序的存储系统。对于这些应用程序,使用执行传统更新日志记录和数据检查点的系统(例如数据库)更有效。 RDD 的目标是为批处理分析提供高效的编程模型,并离开这些异步应用程序。

3.创建RDD

转化操作(Transformations ): 操作RDD并返回一个 新RDD 的函数; 参考文献

行动操作(Actions ): 操作RDD, 触发计算, 并返回 一个值 或者 进行输出 的函数。 参考文献

二者最大的区别是,转化操作是惰性的,将一个 RDD 转换/更新为另一个,意味着直到我们调用一个 行动操作之前,是不会执行计算的。

#创建一个SparkSession对象,方便下面使用
from pyspark.sql import SparkSession
spark = SparkSession\
                    .builder\
                    .appName('exam1')\
                    .enableHiveSupport()\
                    .getOrCreate()
# 通过文件创建RDD
sc = spark.sparkContext
sc.textFile(name, minPartitions=None, use_unicode=True)
Example=sc.textFile(“hdfs://exam_dir/running_logs/”)

# 代码内部创建RDD
#Create RDD from parallelize    
data = [1,2,3,4,5,6,7,8,9,10,11,12]
Rdd = spark.sparkContext.parallelize(data)

#创建空RDD
rdd = spark.sparkContext.emptyRDD
rdd2 = spark.sparkContext.parallelize( [ ],10)  #This creates 10 partitions

从数据源创建RDD

一般是使用SparkSession中的函数,SparkSession对象提供了read method,返回一个DataFrameReader对象。用该对象将数据读取到DataFrame中,DataFrame是一种特殊的RDD,老版本中称为SchemaRDD。 比如说,spark现在是一个已经被创建的SparkSession对象,然后调用read方法,spark.read就是一个DataFrameReader对象,然后就调用该对象(DataFrameReader)的一系列方法

常见的RDD类型

PairRDD: 由键值对组成的RDD,比如前面提到的用wholeTextFiles()方法读取的内容就是以键值对的形式存在

DoubleRDD: 由双精度浮点数组成的RDD。

DataFrame:以前的版本被称为SchemaRDD,按一组有固定名字和类型的列来组织的分布式数据集。DataFrame等价于sparkSQL中的关系型表! 所以我们在使用sparkSQL的时候常常要创建这个DataFrame,在sparkSQL部分会提及。

HadoopRDD:提供读取存储在HDFS上的数据的RDD。

重新分区

第一:使用repartition(numPartitions)从所有节点混洗数据的方法,也称为完全混洗, repartition()方法是一项非常昂贵的操作,因为它会从集群中的所有节点打乱数据。

第二:使用coalesce(n)方法从最小节点混洗数据,仅用于减少分区数。 这是repartition()使用合并降低跨分区数据移动的优化或改进版本。

第三:使用partitionBy(numPartitions, partiontionFunc=portable_hash)函数

混洗操作

Shuffle 是 PySpark 用来在不同执行器甚至跨机器重新分配数据的机制。 可能导致shuffle的操作包括:

repartitioncoalesce重新分区操作,

groupByKeyreduceByKey聚合操作(计数除外),

以及cogroupjoin连接操作

PySpark Shuffle 是一项昂贵的操作,因为它涉及以下内容 ·磁盘输入/输出 ·涉及数据序列化和反序列化 ·网络输入/输出

混洗分区大小和性能 根据数据集大小,较多的内核和内存混洗可能有益或有害我们的任务。 ①当处理较少的数据量时,通常应该减少 shuffle 分区, 否则最终会得到许多分区文件,每个分区中的记录数较少,形成了文件碎片化。

②另一方面,当有太多数据且分区数量较少时,会导致运行时间较长的任务较少,有时也可能会出现内存不足错误。

获得正确大小的 shuffle 分区总是很棘手,需要多次运行不同的值才能达到优化的数量。当在 PySpark task上遇到性能问题时,这是要寻找的关键属性之一

RDD持久化与重用

RDD主要创建和存在于执行器的内存中。默认情况下,RDD是易逝对象,仅在需要的时候存在。 在它们被转化为新的RDD,并不被其他操作所依赖后,这些RDD就会被删除。 若一RDD在多个行动操作中用到,就每次都会重新计算,则可调用cache()persist( )方法缓存或持久化RDD。

窄依赖(窄操作)- 宽依赖(宽操作)

  • 窄操作:
  • ①多个操作可以合并为一个阶段,比如同时对一个数据集进行的map操作或者filter操作可以在数据集的各元 素的一轮遍历中处理;
  • ②子RDD只依赖于一个父RDD
  • ③不需要进行节点间的数据混洗
  • 宽操作:
  • ①通常需要数据混洗
  • ②RDD有多个依赖,比如在join或者union的时候
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PySpark RDD是一种分布式的数据集,它是PySpark的核心抽象之一。RDD代表弹性分布式数据集(Resilient Distributed Dataset),它是由一系列分区组成的可并行处理的集合。RDD可以包含任何类型的对象,并且可以在集群上进行并行操作PySpark RDD可以通过不同的方式创建,其中一种常见的方式是使用`sc.parallelize`方法,该方法可以将Python列表、NumPy数组或Pandas Series/Pandas DataFrame转换为Spark RDD。例如,通过以下代码可以使用列表创建一个RDD: ```python rdd = sc.parallelize([1, 2, 3, 4, 5]) ``` 这将创建一个名为`rdd`的RDD对象,其中包含了列表中的元素。RDD支持各种转换和操作,例如映射、过滤、排序和聚合等。你可以使用这些操作来对RDD进行变换和计算,最终得到你想要的结果。 PySpark提供了丰富的文档来帮助你了解RDD的更多细节和使用方法。你可以参考Spark官方网站的RDD编程指南和PySpark官方文档,它们提供了详细的介绍和示例代码,帮助你更好地理解和使用PySpark RDD。 总结起来,PySpark RDD是一种分布式的可并行处理的数据集,它可以通过不同的方式创建,例如使用`sc.parallelize`方法。RDD支持各种转换和操作,它是PySpark中非常重要的概念之一。 参考文献: Spark官方网站 - RDD编程指南:http://spark.apache.org/docs/latest/rdd-programming-guide.html PySpark官方文档:https://spark.apache.org/docs/latest/api/python/index.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值