首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spark RDD中的持久化

持久化在早期被称作缓存(cache),但缓存一般指将内容放在内存中。虽然持久化操作在绝大部分情况下都是将RDD缓存在内存中,但一般都会在内存不够时用磁盘顶上去(比操作系统默认的磁盘交换性能高很多)。...当然,也可以选择不使用内存,而是仅仅保存到磁盘中。所以,现在Spark使用持久化(persistence)这一更广泛的名称。...默认情况下,RDD只使用一次,用完即扔,再次使用时需要重新计算得到,而持久化操作避免了这里的重复计算,实际测试也显示持久化对性能提升明显,这也是Spark刚出现时被人称为内存计算的原因。...storage level参数 storage level 说明 MEMORY_ONLY 默认的持久化级别,只持久到内存中(以原始对象的形式),需要时直接访问,不需要反序列化操作。...内存不足时,多余的部分不会被持久化,访问时需要重新计算 MEMORY_AND_DISK 持久化到内存中,内存不足时用磁盘代替 MEMORY_ONLY_SER 类似于MEMORY_ONLY,但格式是序列化之后的数据

74530

spark中的rdd的持久化

rdd的持久化操作有cache()和presist()函数这两种方式。 ---- Spark最重要的一个功能,就是在不同操作间,持久化(或缓存)一个数据集在内存中。...当你持久化一个RDD,每一个结点都将把它的计算分块结果保存在内存中,并在对此数据集(或者衍生出的数据集)进行的其它动作中重用。这将使得后续的动作(Actions)变得更加迅速(通常快10倍)。...缓存是用Spark构建迭代算法的关键。你可以用persist()或cache()方法来标记一个要被持久化的RDD,然后一旦首次被一个动作(Action)触发计算,它将会被保留在计算结点的内存中并重用。...当需要删除被持久化的RDD,可以用unpersistRDD()来完成该工作。...MEMORY_AND_DISK存储级别时当内存足够时直接保存到内存队列中,当内存不足时,将释放掉不属于同一个RDD的block的内存。

1.1K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Spark性能优化 (1) | 常规性能调优

    RDD 持久化 在Spark中,当多次对同一个 RDD 执行算子操作时,每一次都会对这个 RDD 的祖先 RDD 重新计算一次,这种情况是必须要避免的,对同一个RDD的重复计算是对资源的极大浪费,因此,...必须对多次使用的RDD进行持久化,通过持久化将公共RDD的数据缓存到内存/磁盘中,之后对于公共RDD的计算都会从内存/磁盘中直接获取RDD数据。...对于RDD的持久化,有两点需要说明: RDD的持久化是可以进行序列化的,当内存无法将RDD的数据完整的进行存放的时候,可以考虑使用序列化的方式减小数据体积,将数据完整存储在内存中。...当持久化启用了复本机制时,对于持久化的每个数据单元都存储一个副本,放在其他节点上面,由此实现数据的容错,一旦一个副本数据丢失,不需要重新计算,还可以使用另外一个副本。 3....当task要处理的数据不在task所在节点上时,会发生数据的传输。

    62110

    Spark入门指南:从基础概念到实践应用全解析

    阶段之间的划分是根据数据的依赖关系来确定的。当一个 RDD 的分区依赖于另一个 RDD 的分区时,这两个 RDD 就属于同一个阶段。...而且Spark的持久化机制还是自动容错的,如果持久化的RDD的任何partition丢失了,那么Spark会自动通过其源RDD,使用transformation操作重新计算该partition。...会真正执行持久化 rdd2.sortBy(_._2,false).collect//触发action,会去读缓存中的数据,执行速度会比之前快,因为rdd2已经持久化到内存中了 需要注意的是,在触发action...),将数据持久化到内存中。...假如某个节点挂掉了,节点的内存或磁盘中的持久化数据丢失了,那么后续对RDD计算时还可以使用该数据在其他节点上的副本。如果没有副本的话,就只能将这些数据从源头处重新计算一遍了。

    68041

    Spark入门指南:从基础概念到实践应用全解析

    阶段之间的划分是根据数据的依赖关系来确定的。当一个 RDD 的分区依赖于另一个 RDD 的分区时,这两个 RDD 就属于同一个阶段。...而且Spark的持久化机制还是自动容错的,如果持久化的RDD的任何partition丢失了,那么Spark会自动通过其源RDD,使用transformation操作重新计算该partition。...rdd2.sortBy(_._2,false).collect//触发action,会去读缓存中的数据,执行速度会比之前快,因为rdd2已经持久化到内存中了需要注意的是,在触发action的时候,才会去执行持久化...),将数据持久化到内存中。...假如某个节点挂掉了,节点的内存或磁盘中的持久化数据丢失了,那么后续对RDD计算时还可以使用该数据在其他节点上的副本。如果没有副本的话,就只能将这些数据从源头处重新计算一遍了。

    2.9K42

    Pyspark学习笔记(四)弹性分布式数据集 RDD(下)

    当持久化或缓存一个 RDD 时,每个工作节点将它的分区数据存储在内存或磁盘中,并在该 RDD 的其他操作中重用它们。...)的一些细微区别:链接 二、持久性存储级别 参考文献: ①https://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-persistence...这是 RDD cache() 方法的默认行为, 并将 RDD 或 DataFrame 作为反序列化对象存储到 JVM 内存中。...当没有足够的可用内存时,它不会保存某些分区的 DataFrame,这些将在需要时重新计算。这需要更多的存储空间,但运行速度更快,因为从内存中读取需要很少的 CPU 周期。...MEMORY_AND_DISK 在此存储级别,RDD 将作为反序列化对象存储在 JVM 内存中。当所需的存储空间大于可用内存时,它会将一些多余的分区存储到磁盘中,并在需要时从磁盘读取数据。

    2.7K30

    2021年大数据Spark(十七):Spark Core的RDD持久化

    ---- RDD 持久化 引入 在实际开发中某些RDD的计算或转换可能会比较耗费时间,如果这些RDD后续还会频繁的被使用到,那么可以将这些RDD进行持久化/缓存,这样下次再使用到的时候就不用再重新计算了...在实际的项目中缓存RDD数据时,往往使用如下函数,依据具体的业务和数据量,指定缓存的级别 缓存/持久化级别 在Spark框架中对数据缓存可以指定不同的级别,对于开发来说至关重要,如下所示: 持久化级别...如果没有足够的内存存储RDD,则某些分区将不会被缓存,每次需要时都会重新计算。 这是默认级别。 MEMORY_AND_DISK (开发中可以使用这个) 将RDD以非序列化的Java对象存储在JVM中。...释放缓存/持久化 当缓存的RDD数据,不再被使用时,考虑释资源,使用如下函数: 此函数属于eager,立即执行。...rdd2已经持久化到内存中了 总结:何时使用缓存/持久化 在实际项目开发中,什么时候缓存RDD数据,最好呢???

    39130

    Pyspark学习笔记(四)弹性分布式数据集 RDD 综述(下)

    当持久化或缓存一个 RDD 时,每个工作节点将它的分区数据存储在内存或磁盘中,并在该 RDD 的其他操作中重用它们。...)的一些细微区别:链接 二、持久性存储级别 参考文献: ①https://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-persistence...这是 RDD cache() 方法的默认行为, 并将 RDD 或 DataFrame 作为反序列化对象存储到 JVM 内存中。...当没有足够的可用内存时,它不会保存某些分区的 DataFrame,这些将在需要时重新计算。这需要更多的存储空间,但运行速度更快,因为从内存中读取需要很少的 CPU 周期。...MEMORY_AND_DISK 在此存储级别,RDD 将作为反序列化对象存储在 JVM 内存中。当所需的存储空间大于可用内存时,它会将一些多余的分区存储到磁盘中,并在需要时从磁盘读取数据。

    2K40

    大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

    0.2 Spark Core 0.2.1 Spark RDD 持久化   Spark 非常重要的一个功能特性就是可以将 RDD 持久化在内存中,当对 RDD 执行持久化操作时,每个节点都会将自己操作的...RDD 的 partition 持久化到内存中,并且在之后对该 RDD 的反复使用中,直接使用内存的 partition。...巧妙使用 RDD 持久化,甚至在某些场景下,可以将 Spark 应用程序的性能提高 10 倍。对于迭代式算法和快速交互式应用来说,RDD 持久化是非常重要的。   ...在该 RDD 第一次被计算出来时,就会直接缓存在每个节点中,而且 Spark 的持久化机制还是自动容错的,如果持久化的 RDD 的任何 partition 丢失了,那么 Spark 会自动通过其源 RDD...(MEMORY_ONLY),将输入持久化到内存中。

    2.7K20

    Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN

    用户为了让它在整个并行操作中更高效的重用,也许会让 Spark persist(持久化)一个 RDD 到内存中。最后,RDD 会自动的从节点故障中恢复。...但是,您也可用 persist (或 cache) 方法将 RDD persist(持久化)到内存中;在这种情况下,Spark 为了下次查询时可以更快地访问,会把数据保存在集群上。...当持久化一个 RDD 时,每个节点的其它分区都可以使用 RDD 在内存中进行计算,在该数据上的其他 action 操作将直接使用内存中的数据。...RDD 可以使用 persist() 方法或 cache() 方法进行持久化。数据将会在第一次 action 操作时进行计算,并缓存在节点的内存中。...另外,每个持久化的 RDD 可以使用不同的 storage level 存储级别进行缓存,例如,持久化到磁盘、已序列化的 Java 对象形式持久化到内存(可以节省空间)、跨节点间复制、以 off-heap

    1.6K60

    Spark RDD编程指南

    用户还可以要求 Spark 将 RDD 持久化到内存中,以便在并行操作中有效地重用它。 最后,RDD 会自动从节点故障中恢复。 Spark 中的第二个抽象是可以在并行操作中使用的共享变量。...但是,您也可以使用持久(或缓存)方法将 RDD 持久化在内存中,在这种情况下,Spark 会将元素保留在集群上,以便下次查询时更快地访问它。 还支持在磁盘上持久化 RDD,或跨多个节点复制。...请参阅 Spark 配置指南中的“随机播放行为”部分。 RDD持久化 Spark 中最重要的功能之一是跨操作将数据集持久化(或缓存)在内存中。...当你持久化一个 RDD 时,每个节点都会将它计算的任何分区存储在内存中,并在对该数据集(或从它派生的数据集)的其他操作中重用它们。 这使得未来的操作更快(通常快 10 倍以上)。...此外,每个持久化的 RDD 都可以使用不同的存储级别进行存储,例如,允许您将数据集持久化到磁盘上,将其持久化在内存中,但作为序列化的 Java 对象(以节省空间),跨节点复制它。

    1.4K10

    SparkCore快速入门系列(5)

    第三章 RDD的持久化/缓存 3.1 引入 在实际开发中某些RDD的计算或转换可能会比较耗费时间,如果这些RDD后续还会频繁的被使用到,那么可以将这些RDD进行持久化/缓存,这样下次再使用到的时候就不用再重新计算了...).collect//触发action,会去读缓存中的数据,执行速度会比之前快,因为rdd2已经持久化到内存中了 ●存储级别 默认的存储级别都是仅在内存存储一份,Spark的存储级别还有好多种,存储级别在...3.只有执行action操作的时候才会真正将RDD数据进行持久化/缓存 4.实际开发中如果某一个RDD后续会被频繁的使用,可以将该RDD进行持久化/缓存 第四章 RDD容错机制Checkpoint...4.1 引入 ●持久化的局限 持久化/缓存可以把数据放在内存中,虽然是快速的,但是也是最不可靠的;也可以把数据放在磁盘上,也不是完全可靠的!...提交Task–>Worker上的Executor执行Task 第八章 RDD累加器和广播变量 在默认情况下,当Spark在集群的多个不同节点的多个任务上并行运行一个函数时,它会把函数中涉及到的每个变量,

    37110

    Spark Day05:Spark Core之Sougou日志分析、外部数据源和共享变量

    1、RDD函数类型 - 转换函数 当RDD调用转换函数,产生新的RDD lazy懒惰,不会立即执行 - 触发函数 当RDD调用Action函数,返回值不是RDD,要么没有返回值Unit,...RDD 持久化 可以将RDD数据缓存,要么存储到内存(Executor内存),要么存储到本地磁盘 为什么要对RDD数据进行持久化,为了快速读取数据,分析处理 - 持久化函数 cache、persist...persist(StorageLevel) - 持久化级别 5类 - 释放资源 当RDD不在被使用时,要缓存数据进行释放资源 - 什么时候对RDD进行持久化操作 4、RDD Checkpoint...将RDD Checkpoint到可靠文件系统中 - 为什么需要对RDD 进行Checkpoint操作 - Checkpoint与持久化区别 02-[了解]-内容提纲 主要讲解3个方面内容:Sougou....set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") // TODO: 注册序列化的数据类型

    1K20

    【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优

    二、具体    1、代码调优 1、避免创建重复的RDD,尽量使用同一个RDD 2、对多次使用的RDD进行持久化 如何选择一种最合适的持久化策略?...但是这里必须要注意的是,在实际的生产环境中,恐怕能够直接用这种策略的场景还是有限的,如果RDD中数据比较多时(比如几十亿),直接用这种持久化级别,会导致JVM的OOM内存溢出异常。...3) 使用可序列化的持久化策略时(比如MEMORY_ONLY_SER),Spark会将RDD中的每个partition都序列化成一个大的字节数组。 4) Task发送时也需要序列化。  ...JVM堆内存分为一块较大的Eden和两块较小的Survivor,每次只使用Eden和其中一块Survivor,当回收时将Eden和Survivor中还存活着的对象一次性复制到另外一块Survivor上,...比如在存数据的时候我们使用了foreach来将数据写入到内存,每条数据都会封装到一个对象中存入数据库中,那么有多少条数据就会在JVM中创建多少个对象。 Spark中如何内存调优?

    1.3K30

    Pyspark学习笔记(四)---弹性分布式数据集 RDD (上)

    RDD主要是存储在内存中(亦可持久化到硬盘上),这就是相对于Hadoop的MapReduce的优点,节省了重新读取硬盘数据的时间。...4.RDD持久化与重用 RDD主要创建和存在于执行器的内存中。默认情况下,RDD是易逝对象,仅在需要的时候存在。 在它们被转化为新的RDD,并不被其他操作所依赖后,这些RDD就会被删除。...若一RDD在多个行动操作中用到,就每次都会重新计算,则可调用cache()或persist( )方法缓存或持久化RDD。...5.RDD谱系 Spark维护每个RDD的谱系,也就是获取这个RDD所需要的一系列转化操作的序列。 默认情况下,每个RDD都会重新计算整个谱系,除非调用了RDD持久化。...(当 然,如果存在一些非确定性函数,比如random,因为其随机性,所以可能影响到RDD的重建。)

    2K20

    揭秘Spark应用性能调优

    用缓存和持久化来加速 Spark 我们知道Spark 可以通过 RDD 实现计算链的原理 :转换函数包含在 RDD 链中,但仅在调用 action 函数后才会触发实际的求值过程,执行分布式运算,返回运算结果...下表列出了 Spark 支持的所有持久 化等级。 ? 每个持久化等级都定义在单例对象 StorageLevel 中。...注意 :其他的持久化等级,如 MEMORY_ONLY2、MEMORY_AND_ DISK2 等,也是可用的。它们会复制 RDD 到集群的其他节点上,以便 提供容错能力。...当缓存越来越多的 RDD 后,可用的内存就会减少。最终 Spark 会把分区数据从 内存中逐出(使用最少最近使用算法,LRU)。同时,缓存过多的 Java 对象,JVM 垃圾回收高耗是不可避免的。...定义 :当 RDD 由逐级继承的祖先 RDD 链形成时,我们说从 RDD 到 根 RDD 的路径是其谱系。 下面清单所示的示例是一个简单的算法,可生成一个新顶点集并更新图。

    99420

    RDD:创建的几种方式(scala和java)

    用户也可以让spark将一个RDD持久化到内存中,使其能再并行操作中被有效地重复使用,最后RDD能自动从节点故障中恢复。...RDD的数据默认的情况下是存放在内存中的,但是在内存资源不足时,Spark会自动将RDD数据写入磁盘。...Spark会将集合中的数据拷贝到集群上去,形成一个分布式的数据集合,也就是一个RDD。即:集合中的部分数据会到一个节点上,而另一部分数据会到其它节点上。...= lineLengths.reduce(new Sum()); System.out.println("总长度"+totalLength); // 为了以后复用 持久化到内存...一般来说,Spark会尝试根据集群的状况,来自动设定slices的数目。当让,也可以手动的设置它,通过parallelize方法的第二个参数。

    93930

    Spark 性能调优之开发调优

    这种方式的性能是很差的。 因此对于这种情况,我们的建议是:对多次使用的RDD进行持久化。此时Spark就会根据你的持久化策略,将RDD中的数据保存到内存或者磁盘中。...// cache()方法表示:使用非序列化的方式将RDD中的数据全部尝试持久化到内存中。 // 此时再对rdd1执行两次算子操作时,只有在第一次执行map算子时,才会将这个rdd1从源头处计算一次。...// 比如说,StorageLevel.MEMORY_AND_DISK_SER表示,内存充足时优先持久化到内存中,内存不充足时持久化到磁盘文件中。...// 而且其中的_SER后缀表示,使用序列化的方式来保存RDD数据,此时RDD中的每个partition都会序列化成一个大的字节数组,然后再持久化到内存或磁盘中。...使用可序列化的持久化策略时(比如MEMORY_ONLY_SER),Spark会将RDD中的每个partition都序列化成一个大的字节数组。

    97231

    Apache Spark 内存管理详解(下)

    导读:本文是续接上一篇《Apache Spark内存管理详解(上)》(未阅读的同学可以点击查看)的内容,主要介绍两部分:存储内存管理,包含RDD的持久化机制、RDD缓存的过程、淘汰和落盘;执行内存管理,...所以如果一个RDD上要执行多次行动,可以在第一次行动中使用persist或cache方法,在内存或磁盘中持久化或缓存这个RDD,从而在后面的行动时提升计算速度。...事实上,cache方法是使用默认的MEMORY_ONLY的存储级别将RDD持久化到内存,故缓存是一种特殊的持久化。...RDD的持久化由Spark的Storage模块负责,实现了RDD与物理存储的解耦合。...,当其大到一定程度,无法再从MemoryManager申请到新的执行内存时,Spark就会将其全部内容存储到磁盘文件中,这个过程被称为溢存(Spill),溢存到磁盘的文件最后会被归并(Merge)。

    1.1K10
    领券