Learning Spark笔记5-持久化(缓存)

来源:互联网 发布:centos添加ip黑名单 编辑:程序博客网 时间:2024/05/19 13:07
持久化(缓存)


之前讨论过,Spark RDDs是lazily evaluated,我们可能会多次使用同一个RDD。如果这样做的话,每次在RDD上调用一个动作时,Spark都将重新计算RDD以及它的所有依赖。对于迭代算法就特别的耗费资源,下面是一个计数的例子。


Example 3-39. Double execution in Scala


val result = input.map(x => x*x)
println(result.count())
println(result.collect().mkString(","))


防止多次一个RDD,我们可以让Spark持久化数据。当我们让Spark持久化一个RDD的时候,计算RDD的节点会存储他们的分区。如果在一个节点上持久化时失败了,那么Spark会根据需要重新计算丢失数据的分区。如果我们不想要让集群变慢,那么我们就可以在复制多个数据到不同的节点上。


Spark可以根据不同的目的,支持不同级别的持久化。在Scala和Java中,默认的persist()会将数据以非序列化对象形式保存在JVM堆中。对于Python,通常是序列化数据到持久化的存储。


堆栈缓存还是实验性的,这里使用了Tachyon。


Example 3-40. persist() in Scala
val result = input.map(x => x * x)
result.persist(StorageLevel.DISK_ONLY)
println(result.count())
println(result.collect().mkString(","))


注意我们在第一个动作之前调用persist()。


如果在内存中存储了太多的数据,Spark将使用最近最少(LRU)缓存策略自动释放旧分区。对于仅内存存储级别,下次它被访问时会重新计算所有分区,但对于内存-磁盘的方式,它会将他们写到磁盘上。


RDDs有一个unpersist(),可以手动删除缓存
0 0
原创粉丝点击