今天的大数据入门分享,我们就来具体讲讲Spark持久化存储策略。 所谓的Spark持久化存储,就是将一个RDD持久化到内存或磁盘中,以便重用该RDD,省去重新计算的环节,以空间换时间。...Spark提供了persist和cache两个持久化函数,其中cache将RDD持久化到内存中,而persist则支持多种存储级别。...两个持久化方法的主要区别是:cache()方法默认使用的是内存级别,其底层调用的是persist()方法。 RDD持久化存储级别 Spark的提供了多种持久化级别,比如内存、磁盘、内存+磁盘等。...MEMORY_AND_DISK_SER 与MEMORY_ONLY_SER类似,如果内存放不下,则溢写到磁盘。 DISK_ONLY 将RDD的分区数据存储到磁盘。...持久化通常在有状态的算子中使用,比如窗口操作,默认情况下,虽然没有显性地调用持久化方法,但是底层已经帮用户做了持久化操作。与RDD的持久化不同,DStream的默认持久性级别将数据序列化在内存中。
MEMORY_AND_DISK : 将 RDD 以反序列化 Java 对象的形式存储在 JVM 中。如果内存空间不够,将未缓存的数据分区存储到磁盘,在需要使用这些分区时从磁盘读取。...MEMORY_AND_DISK_SER : 类似于 MEMORY_ONLY_SER ,但是溢出的分区会存储到磁盘,而不是在用到它们时重新计算。 DISK_ONLY : 只在磁盘上缓存 RDD。...建议按下面的过程进行存储级别的选择 : 如果使用默认的存储级别(MEMORY_ONLY),存储在内存中的 RDD 没有发生溢出,那么就选择默认的存储级别。...默认存储级别可以最大程度的提高 CPU 的效率,可以使在 RDD 上的操作以最快的速度运行。...除了在计算该数据集的代价特别高,或者在需要过滤大量数据的情况下,尽量不要将溢出的数据存储到磁盘。因为,重新计算这个数据分区的耗时与从磁盘读取这些数据的耗时差不多。
RDDcache 到内存中。...spark 所有复杂一点的算法都会有 persist 身影,spark 默认数据放在内存,spark 很多内容都是放在内存的,非常适合高速迭代,1000 个步骤只有第一个输入数据,中间不产生临时数据,但分布式系统风险很高...4)shuffle 之后要 persist,shuffle 要进性网络传输,风险很大,数据丢失重来,恢复代价很大 5)shuffle 之前进行 persist,框架默认将数据持久化到磁盘,这个是框架自动做的...4)极大的减少磁盘 I/o,通常情况下能够减少 75%的存储空间,由此可以极大的减少 spark sql 处理数据的时候的数据输入内容,尤其是在 spark1.6x 中有个下推过滤器在一些情况下可以极大的减少磁盘的...1)用于设置 RDD 持久化数据在 Executor 内存中能占的比例,默认是 0.6,,默认 Executor 60%的内存,可以用来保存持久化的 RDD 数据。
当 RDD 第一次在 action 操作中计算时,将持久化(缓存)到节点的内存中。Spark 的缓存是可容错的 - 如果 RDD 的任意分区丢失,将使用最初创建的转换操作自动重新计算。 2....cache() 方法使用默认存储级别,即 StorageLevel.MEMORY_ONLY(将反序列化的对象存储在内存中)。...如果数据在内存中放不下,则溢写到磁盘上.需要时则会从磁盘上读取 MEMORY_ONLY_SER (Java and Scala) 此级别与MEMORY_ONLY完全相同,但会在存储到内存之前序列化对象。...DISK_ONLY 将 RDD 分区存储在磁盘上而不是内存上。...如果要重用,我们仍然建议用户对生成的 RDD 调用 persist。 3. 选择存储级别 Spark 的存储级别旨在提供内存使用率和CPU效率之间的不同权衡。
当持久化或缓存一个 RDD 时,每个工作节点将它的分区数据存储在内存或磁盘中,并在该 RDD 的其他操作中重用它们。...Spark 在节点上的持久数据是容错的,这意味着如果任何分区丢失,它将使用创建它的原始转换自动重新计算 ①cache() 默认将 RDD 计算保存到存储级别MEMORY_ONLY ,这意味着它将数据作为未序列化对象存储在...() 有两种函数签名 第一个签名不接受任何参数,默认情况下将其保存到MEMORY_AND_DISK存储级别, 例: dfPersist = df.persist() 第二个签名StorageLevel...这是 RDD cache() 方法的默认行为, 并将 RDD 或 DataFrame 作为反序列化对象存储到 JVM 内存中。...MEMORY_AND_DISK 在此存储级别,RDD 将作为反序列化对象存储在 JVM 内存中。当所需的存储空间大于可用内存时,它会将一些多余的分区存储到磁盘中,并在需要时从磁盘读取数据。
当持久化或缓存一个 RDD 时,每个工作节点将它的分区数据存储在内存或磁盘中,并在该 RDD 的其他操作中重用它们。...Spark 在节点上的持久数据是容错的,这意味着如果任何分区丢失,它将使用创建它的原始转换自动重新计算 ① cache() 默认将 RDD 计算保存到存储级别 MEMORY_ONLY ,这意味着它将数据作为未序列化对象存储在...() 有两种函数签名 第一个签名不接受任何参数,默认情况下将其保存到MEMORY_AND_DISK存储级别, 例: dfPersist = df.persist() 第二个签名StorageLevel...这是 RDD cache() 方法的默认行为, 并将 RDD 或 DataFrame 作为反序列化对象存储到 JVM 内存中。...MEMORY_AND_DISK 在此存储级别,RDD 将作为反序列化对象存储在 JVM 内存中。当所需的存储空间大于可用内存时,它会将一些多余的分区存储到磁盘中,并在需要时从磁盘读取数据。
cache他是persist的一个简化版cache他默认是将RDD的数据持久化到内存里面去 persist这个算子我们可以自己指定持久化的级别,可以自定义,我们可以将RDD的数据持久化到磁盘上,如果你想要把数据持久化到磁盘上...堆外内存?什么是堆外内存,堆以外的内存就是堆外内存对吗? JVM管理了一块内存对吗?那不受JVM 的GC管理的内存是不是就是堆外内存啊? 参考阅读: 什么是堆外内存?堆内内存还是堆外内存?...,也是同学们经常会问到的,当我内存不够的时候,我还是cache了一个RDD,会不会报OOM?...,我们是用persist给我们持久化到内存硬盘安全,还是使用checkpoint让Spark给我们把数据持久化到hdfs上安全?...持久化到hdfs上更安全一些对吗? 那为什么持久化到HDFS上安全呢? 因为这就是双保险了,所以会更安全对吧?
() cache方法其实是persist方法的一个特例:调用的是无参数的persist(),代表缓存级别是仅内存的情况 persist方法有三种,分为默认无参数仅内存级别的persist(),还有persist...缓存实现的原理:DiskStore磁盘存储和MemoryStore内存存储 DiskStore磁盘存储:spark会在磁盘上创建spark文件夹,命名为(spark-local-x年x月x日时分秒-随机数...建议按下面的过程进行存储级别的选择 : 如果使用默认的存储级别(MEMORY_ONLY),存储在内存中的 RDD 没有发生溢出,那么就选择默认的存储级别。...默认存储级别可以最大程度的提高 CPU 的效率,可以使在 RDD 上的操作以最快的速度运行。...除了在计算该数据集的代价特别高,或者在需要过滤大量数据的情况下,尽量不要将溢出的数据存储到磁盘。因为,重新计算这个数据分区的耗时与从磁盘读取这些数据的耗时差不多。
如果你正在运行Spark Shell,那么默认情况下,可以通过URL http://localhost:4040 访问此接口: ? 每个Action都会在Spark中生成一个单独的作业。...如果没有足够的内存存储 RDD,则某些分区将不会被缓存,每次需要时都会重新计算。这是默认级别。如果你知道数据大小可以装载进内存中,可以使用此选项,否则会重新计算某些分区,会显着降低整体作业的性能。...需要时则会从磁盘上读取,但与重新计算不能放进内存的分区相比,花费的时间会少得多。 MEMORY_ONLY_SER 此级别与MEMORY_ONLY完全相同,但会在存储到内存之前序列化对象。...DISK_ONLY 将 RDD 分区存储在磁盘上而不是内存上。 OFF_HEAP 分区可以存储在堆外内存上。需要启用堆外内存才能使此存储级别正常工作。...此作业从Spark开始并经历 stage 1到5。第一个 stage 从磁盘读取数据文件,然后stage 2到5在RDD上执行一些昂贵且复杂的计算。
Storage Level 是 RDD 持久化的存储级别,RDD 持久化可以调用两种方法:cache 和 persist:persist 方法可以自由的设置存储级别,默认是持久化到内存;cache 方法是将...RDD 持久化到内存,cache 的内部实际上是调用了persist 方法,由于没有开放存储级别的参数设置,所以是直接持久化到内存。...默认情况下,性能最高的当然是 MEMORY_ONLY,但前提是你的内存必须足够大到可以绰绰有余地存放下整个 RDD 的所有数据。...Spark 提供了 rdd.persist(StorageLevel.DISK_ONLY) 这样的方法,相当于 cache 到磁盘上,这样可以使 RDD 第一次被计算得到时就存储到磁盘上,它们之间的区别在于...:persist 虽然可以将 RDD 的 partition 持久化到磁盘,但一旦作业执行结束,被 cache 到磁盘上的 RDD 会被清空;而 checkpoint 将 RDD 持久化到 HDFS 或本地文件夹
当第一次对RDD2执行算子,获取RDD3的时候,就会从RDD1开始计算,就是读取HDFS文件,然后对RDD1执行算子,获取到RDD2,然后再计算,得到RDD3 默认情况下,多次对一个RDD执行算子,去获取不同的...第二,公共RDD一定要实现持久化 持久化,也就是说,将RDD的数据缓存到内存中/磁盘中,(BlockManager),以后无论对这个RDD做多少次计算,那么都是直接取这个RDD的持久化的数据,比如从内存中或者磁盘中...当纯内存无法支撑公共RDD数据完全存放的时候,就优先考虑,使用序列化的方式在纯内存中存储。...如果序列化纯内存方式,还是导致OOM,内存溢出;就只能考虑磁盘的方式,内存+磁盘的普通方式(无序列化)。内存+磁盘,序列化。...第四,为了数据的高可靠性,而且内存充足,可以使用双副本机制,进行持久化 持久化的双副本机制,持久化后的一个副本,因为机器宕机了,副本丢了,就还是得重新计算一次;持久化的每个数据单元,存储一份副本,放在其他节点上面
正是由于 Spark 开发之初就考虑到支持 Mesos,因此,目前而言,Spark 运行在 Mesos 上会比运行在 YARN 上更加灵活,更加自然。...RDD cache 到内存中。...spark 所有复杂一点的算法都会有 persist 身影,spark 默认数据放在内存,spark 很多内容都是放在内存的,非常适合高速迭代,1000 个步骤只有第一个输入数据,中间不产生临时数据,但分布式系统风险很高...shuffle 之后要 persist,shuffle 要进性网络传输,风险很大,数据丢失重来,恢复代价很大 shuffle 之前进行 persist,框架默认将数据持久化到磁盘,这个是框架自动做的 17...极大的减少磁盘 I/o,通常情况下能够减少 75%的存储空间,由此可以极大的减少 spark sql 处理数据的时候的数据输入内容,尤其是在 spark1.6x 中有个下推过滤器在一些情况下可以极大的减少磁盘的
如果RDD不能被内存装下,一些分区将不会被缓存,并且在需要的时候被重新计算。这是系统默认的存储级别。 MEMORY_AND_DISK 将RDD作为非序列化的Java对象存储在jvm中。...MEMORY_AND_DISK_SER 和MEMORY_ONLY_SER类似,但不是在每次需要时重复计算这些不适合存储到内存中的分区,而是将这些分区存储到磁盘中。...DISK_ONLY 仅仅将RDD分区存储到磁盘中 MEMORY_ONLY_2, MEMORY_AND_DISK_2, etc....和上面的存储级别类似,但是复制每个分区到集群的两个节点上面 如何使用 我们可以利用不同的存储级别存储每一个被持久化的RDD。可以存储在内存中,也可以序列化后存储在磁盘上等方式。...Spark也会自动持久化一些shuffle操作(如reduceByKey)中的中间数据,即使用户没有调用persist方法。这样的好处是避免了在shuffle出错情况下,需要重复计算整个输入。
CheckPoint机制是我们在spark中用来保障容错性的主要机制,它可以阶段性的把应用数据存储到诸如HDFS等可靠存储系统中,以供恢复时使用。...它是被分区的,分为多个分区,每个分区分布在集群中的不同结点上,从而让RDD中的数据可以被并行操作(分布式数据集) RDD的数据默认存放在内存中,但是当内存资源不足时,spark会自动将RDD数据写入磁盘...通过查看 RDD 的源码发现 cache 最终也是调用了 persist 无参方法,默认存储只存在内存中(MEMORY_ONLY) cache只有一个默认的缓存级别MEMORY_ONLY ,而persist...缓存与checkpoint的区别 位置:缓存只能保存在本地的磁盘和内存中, Checkpoint 可以保存数据到 HDFS 这类可靠的存储上。...10、Spark中的广播变量与累加器 在默认情况下,当 Spark 在集群的多个不同节点的多个任务上并行运行一个函数时,它会把函数中涉及到的每个变量,在每个任务上都生成一个副本。
传统内存管理的不足: 1)Shuffle占用内存0.2*0.8,内存分配这么少,可能会将数据spill到磁盘,频繁的磁盘IO是很大的负担,Storage内存占用0.6,主要是为了迭代处理。...,其他Task过来就没有内存了,只能等待; 2)默认情况下,Task在线程中可能会占满整个内存,分片数据 10、 Spark的数据本地性有哪几种? ...spark所有复杂一点的算法都会有persist身影,spark默认数据放在内存,spark很多内容都是放在内存的,非常适合高速迭代,1000个步骤只有第一个输入数据,中间不产生临时数据,但分布式系统风险很高...4)shuffle之后要persist,shuffle要进性网络传输,风险很大,数据丢失重来,恢复代价很大 5)shuffle之前进行persist,框架默认将数据持久化到磁盘,这个是框架自动做的...4)极大的减少磁盘I/o,通常情况下能够减少75%的存储空间,由此可以极大的减少spark sql处理数据的时候的数据输入内容,尤其是在spark1.6x中有个下推过滤器在一些情况下可以极大的减少磁盘的
这些失败的RDD由哪来呢?这就牵涉到,Spark中的一个很重要的概念:Lineage即血统关系。...缓存(cache/persist) cache和persist其实是RDD的两个API,并且cache底层调用的就是persist,区别之一就在于cache不能显示指定缓存方式,只能缓存在内存中,...但是persist可以通过指定缓存方式,比如显示指定缓存在内存中、内存和磁盘并且序列化等。...容错(checkpoint) 本质上是将RDD写入磁盘做检查点(通常是checkpoint到HDFS上,同时利用了hdfs的高可用、高可靠等特征)。...(根据父RDD计算出子RDD) 3.RDD的依赖列表 4.RDD默认是存储于内存,但当内存不足时,会spill到disk(可通过设置StorageLevel来控制) 5.默认hash分区,可自定义分区器
而且Spark的持久化机制还是自动容错的,如果持久化的RDD的任何partition丢失了,那么Spark会自动通过其源RDD,使用transformation操作重新计算该partition。...比如可以将RDD持久化在内存中、持久化到磁盘上、使用序列化的方式持久化,多持久化的数据进行多路复用。只要在调用persist()时传入对应的StorageLevel即可。...2>MEMORY_AND_DISK:同上,但是当某些partition无法存储在内存中时,会持久化到磁盘中。下次需要使用这些partition时,需要从磁盘上读取。...5>DISK_ONLY:使用非序列化Java对象的方式持久化,完全存储到磁盘上。...2>如果MEMORY_ONLY策略,无法存储的下所有数据的话,那么使用MEMORY_ONLY_SER,将数据进行序列化进行存储,纯内存操作还是非常快,只是要消耗CPU进行反序列化。
在默认情况下,Spark所有的转换操作都是惰性(Lazy)的,每个被转换得到的RDD不会立即计算出结果,只是记下该转换操作应用的一些基础数据集,可以有多个转换结果。...”一个RDD到内存中。...在这种情况下,Spark将会在集群中保留这个RDD,以便其他Job可以更快地访问,另外,Spark也支持持久化RDD到磁盘中,或者复制RDD到各个节点。...checkpoint会直接将RDD持久化到磁盘或HDFS等路径,不同于Cache/Persist的是,被checkpoint的RDD不会因作业的结束而被消除,会一直存在,并可以被后续的作业直接读取并加载...选择存储等级 Spark的不同存储级别,旨在满足内存使用和CPU效率权衡上的不同需求,建议通过以下步骤进行选择: □如果你的RDD可以很好地与默认的存储级别(MEMORY_ONLY)契合,那么就不需要做任何修改
说明 MEMORY_ONLY(默认) 将RDD以非序列化的Java对象存储在JVM中。...如果没有足够的内存存储RDD,则某些分区将不会被缓存,每次需要时都会重新计算。 这是默认级别。 MEMORY_AND_DISK (开发中可以使用这个) 将RDD以非序列化的Java对象存储在JVM中。...如果数据在内存中放不下,则溢写到磁盘上.需要时则会从磁盘上读取 MEMORY_ONLY_SER (Java and Scala) 将RDD以序列化的Java对象(每个分区一个字节数组)的方式存储.这通常比非序列化对象...DISK_ONLY 将RDD分区存储在磁盘上。...,rdd2会真正执行缓存/持久化 rdd2.sortBy(_._2,false).collect//触发action,会去读缓存中的数据,执行速度会比之前快,因为rdd2已经持久化到内存中了 总结:何时使用缓存
任务返回结果数据块:用来存储在存储管理模块内部的任务返回结果。通常情况下任务返回结果随任务一起通过Akka返回到Driver端。...cache调用了persist方法,cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据情况设置其它的缓存级别。...DISK_ONLY:使用非序列化Java对象的方式持久化,完全存储到磁盘上。...Task调度到Executor上,Executor启动线程执行Task逻辑 Driver管理Task状态 Task完成,Stage完成,作业完成 21、Spark相比MapReduce的计算模型有哪些区别...spark处理数据是基于内存的,而MapReduce是基于磁盘处理数据的。
领取专属 10元无门槛券
手把手带您无忧上云