Learning Spark 笔记(三) -- take和persist

4 . take(n)试图最小化访问分区,此操作并不一定以期待的顺序返回数据。
5 . 当持久化一个RDD的时候,计算这个RDD的节点会保存它们的分区。如果缓存了数据的节点出错了,Spark会在需要的时候重新计算丢失的分区。只有遇到action的时候才会真正的执行持久化操作。默认的持久化操作是将数据存放在JVM中作为非序列化对象。如下面wordcount的例子:

val lines = sc.textFile("...",100)
val words = lines.flatMap(x=>x.split(" "))
\\持久化words的RDD,并且内存硬盘序列化存储
words.persist(StorageLevel.MEMORY_AND_DISK_SER)                               
val wordcount = words.map(x=>(x,1))
val result = wordcount.reduceBykey(_+_)

如上面的wordcount,如果words的RDD中某一个丢失了,就只会对丢失的数据进行split操作,并不会全部计算。
关于persist的存储级别有5种,如图所示:

其中persist()和cache()相当于persist(StorageLevel.MEMORY_ONLY)。
后缀中带有 _SER 的表示序列化存储,使用序列化的方式来保存RDD数据,此时RDD中的每个分区都会序列化成一个大的字节数组,然后再持久化到内存或者磁盘中。序列化的方式可以减少持久化的数据对内存或磁盘的占用量,进而避免内存被持久化数据占用太多,从而发生频繁的GC。但是序列持久化会有序列化和反序列化的时间开销。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值