Spark整理:RDD中是否保存数据

Spark整理:RDD中是否保存数据,第1张

Spark整理:RDD中是否保存数据

根据编写Spark任务的代码来看,很直观的感觉是RDD就是一个只读的数据,例如 rdd.foreach(println)。 但是不是, RDD其实不存储真是的数据,只存储数据的获取的方法,以及分区的方法,还有就是数据的类型。
百闻不如一见, 下面看看RDD的源码:

通过RDD的这两个抽象方法,我们可以看出 :其实是不存储真实数据的,存储的的只是 真实数据的分区信息getPartitions,还有就是针对单个分区的读取方法 compute.
到这里可能就有点疑惑,要是RDD只存储这分区信息和读取方法,那么RDD的依赖信息是怎么保存的?
其实RDD是有保存的,只是我粘贴出的只是RDD顶层抽象类,还要一点需要注意 ,RDD只能向上依赖,而真正实现这两个方法的RDD都是整个任务的输入端,即处于RDD血统的顶层,初代RDD 举个例子:val rdd = sc.textFile(...); val rdd1 = rdd.map(f) . 这里的 rdd是初代RDD, 是没有任何依赖的RDD的,所以没就没有保存依赖信息, 而 rdd1是子代RDD,那么它就必须得记录下自己是来源于谁,也就是血统.
下面展示的是HadoopRDD和 MapPartitionsRDD

class HadoopRDD[K, V](
  @transient sc: SparkContext,
  broadcastedConf: Broadcast[SerializableConfiguration],
  initLocalJobConfFuncOpt: Option[JobConf => Unit],
  inputFormatClass: Class[_ <: InputFormat[K, V]],
  keyClass: Class[K],
  valueClass: Class[V],
  minPartitions: Int)
  extends RDD[(K, V)](sc, Nil) with Logging {
  override def getPartitions: Array[Partition] = { ***篇幅所限  自己查看**}
   

//子代RDD的作用起始很简单 就是记录初代RDD到底在干了什么才得到了自己

到这里,我们就大概了解了RDD到底存储了什么东西,
Ø 初代RDD: 处于血统的顶层,存储的是任务所需的数据的分区信息,还有单个分区数据读取的方法,没有依赖的RDD, 因为它就是依赖的开始。
子代RDD: 处于血统的下层, 存储的东西就是 初代RDD到底干了什么才会产生自己,还有就是初代RDD的引用.
现在我们基本了解了RDD里面到底存储了些什么东西,那么问题就来了,到底读取数据发生在什么时候。直接开门见山的说, 数据读取是发生在运行的Task中,也就是说,数据是在任务分发的executor上运行的时候读取的,上源码:

在spark中的任务 最终是会被分解成多个TaskSet到executor上运行,TaskSet的划分是根据是否需要shuffle来的。在spark中就只有两种Task,一种是ResultTask ,一种是ShuffleTask, 两种Task都是以相同的方式读取RDD的数据。




备注:
另一个角度理解RDD带不带数据 。first() 就是我们之前调用的一个行动 *** 作,它会返回 RDD 的第一个元素。

result = testlines.first()
//我们读取一个文本文件创建一个RDD,然后把其中包含spark的行筛选出来。
//如果Spark在我们运行lines = sc.textFile(test.txt) 时就把文件中所有的行都读取到内存中并存储起来,内存开销会很大,
//而我们接下来的 *** 作会筛选掉其中的很多数据。
//相反, 如果Spark 在知道了完整的转化 *** 作链之后,它就可以只计算求结果时真正需要的数据。
//事实上,在执行行动 *** 作 first()时,Spark也只是扫描文件直到找到第一个匹配的行为止,而不是读取整个文件。

我们读取一个文本文件创建一个RDD,然后把其中包含spark的行筛选出来。如果Spark在我们运行lines = sc.textFile(test.txt) 时就把文件中所有的行都读取到内存中并存储起来,内存开销会很大,而我们接下来的 *** 作会筛选掉其中的很多数据。相反, 如果Spark 在知道了完整的转化 *** 作链之后,它就可以只计算求结果时真正需要的数据。
事实上,在执行行动 *** 作 first()时,Spark也只是扫描文件直到找到第一个匹配的行为止,而不是读取整个文件。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5656595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存