分享

RDD如何修改持久方式?

evababy 发表于 2017-3-22 13:50:34 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 7 15099
本帖最后由 evababy 于 2017-3-22 14:33 编辑

RDD默认持久方式是MEMORY_ONLY,无法通过persist进行修改持久方式,提示“Cannot change storage level of an RDD after it was already assigned a level”,如何设置系统或JOB的RDD持久方式?

已有(7)人评论

跳转到指定楼层
tntzbzc 发表于 2017-3-22 16:13:52


[mw_shl_code=java,true]private def persist(newLevel: StorageLevel, allowOverride: Boolean): this.type = {
  // TODO: Handle changes of StorageLevel
  if (storageLevel != StorageLevel.NONE && newLevel != storageLevel && !allowOverride) {
    throw new UnsupportedOperationException(
      "Cannot change storage level of an RDD after it was already assigned a level")
  }
  // If this is the first time this RDD is marked for persisting, register it
  // with the <span class="wp_keywordlink_affiliate"><a href="http://www.iteblog.com/archives/tag/spark" title="" target="_blank" data-original-title="View all posts in Spark">Spark</a></span>Context for cleanups and accounting. Do this only once.
  if (storageLevel == StorageLevel.NONE) {
    sc.cleaner.foreach(_.registerRDDForCleanup(this))
    sc.persistRDD(this)
  }
  storageLevel = newLevel
  this
}[/mw_shl_code]
上面中if (storageLevel != StorageLevel.NONE && newLevel != storageLevel && !allowOverride) {
throw new UnsupportedOperationException(
"Cannot change storage level of an RDD after it was already assigned a level")
}
这段代码的最主要作用其实就是将storageLevel设置为persist()函数传进来的存储级别,而且一旦设置好RDD的存储级别之后就不能再对相同RDD设置别的存储级别,否则将会出现异常。

回复

使用道具 举报

tntzbzc 发表于 2017-3-22 16:17:25
spark通过rdd.persist()或rdd.cache()来缓存RDD中的数据,cache()其实就是调用persist()实现的
楼主相信会产生rdd,rdd产生后,直接rdd.cache()或则rdd.persist()就实现了,很简单的
推荐参考
spark缓存cache()详解
http://www.aboutyun.com/forum.php?mod=viewthread&tid=21120


回复

使用道具 举报

evababy 发表于 2017-3-22 17:03:10
tntzbzc 发表于 2017-3-22 16:17
spark通过rdd.persist()或rdd.cache()来缓存RDD中的数据,cache()其实就是调用persist()实现的
楼主相信会 ...

不是我想要的,我不打算使用MEMORY_ONLY,想改为其他的类型,如何改?
回复

使用道具 举报

evababy 发表于 2017-3-22 17:05:41
包括官网的例子2.0.2中NetworkWordCount.scala也无法顺利运行,删除类型或改为MEMORY_ONLY可顺利通过,我想知道MEMORY_ONLY是默认,设置过了就不允许修改,那么,何时可以修改这个默认呢?
[mw_shl_code=scala,true]ssc.socketTextStream(args(0), args(1).toInt, StorageLevel.MEMORY_AND_DISK)[/mw_shl_code]
回复

使用道具 举报

qcbb001 发表于 2017-3-23 08:56:49
evababy 发表于 2017-3-22 17:05
包括官网的例子2.0.2中NetworkWordCount.scala也无法顺利运行,删除类型或改为MEMORY_ONLY可顺利通过,我想 ...

楼主尝试下面方法:例如
sc.textFile("hdfs://192.168.0.1:9000/hello.txt").persist(StorageLevel.MEMORY_AND_DISK_SER)
回复

使用道具 举报

evababy 发表于 2017-3-23 13:19:01
本帖最后由 evababy 于 2017-3-23 15:55 编辑

谢谢大家的恢复,问题解决了,虽然没找到哪里可以修改服务器的默认值MEMORY_ONLY,但是RDD是可以制定任何一个存储级别的,不过不能重复改变类型而已,之前测试代码是由于persist 前面有 cache的测试代码,所以。。。。
回复

使用道具 举报

整天出bug 发表于 2018-11-8 20:45:17
你好,能回复一下嘛,无法给你发信息,关于这个bug的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条