首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么持久化(StorageLevel.MEMORY_AND_DISK)给出的结果与HBase的cache()不同?

为什么持久化(StorageLevel.MEMORY_AND_DISK)给出的结果与HBase的cache()不同?
EN

Stack Overflow用户
提问于 2018-08-27 05:15:46
回答 1查看 2.8K关注 0票数 3

我问这个问题听起来很天真,但这是我最近在项目中遇到的一个问题。需要对此有更好的理解。

代码语言:javascript
复制
df.persist(StorageLevel.MEMORY_AND_DISK)

每当我们在HBase读取中使用这种持久化时,流作业的其他批处理都会一次又一次地返回相同的数据,但是每次批处理运行时都会更新HBase。

HBase读代码:

代码语言:javascript
复制
val df = sqlContext.read.options(Map(HBaseTableCatalog.tableCatalog -> schema)).format(dbSetup.dbClass).load().persist(StorageLevel.MEMORY_AND_DISK)

我将persist(StorageLevel.MEMORY_AND_DISK)替换为cache(),它将按预期从HBase表返回更新的记录。

我们尝试使用persist(StorageLevel.MEMORY_AND_DISK)的原因是为了确保内存中的存储空间不会被填满,并且我们不会在执行特定流期间再次执行所有转换。

火花版- 1.6.3 HBase版本- 1.1.2.2.6.4.42-1

有人能给我解释一下并帮助我更好地理解吗?

EN

回答 1

Stack Overflow用户

发布于 2022-05-03 06:34:07

正如您提到的,您正在寻找一个“为什么”的原因,因此我回答这个问题,因为否则这个问题将仍然没有答案,因为现在没有合理的理由运行sense 1.6.3来感知特定的HBASE版本发生了什么。

在内部,当您使用cache()时,星火调用将持久化(),并且它在RDDs上的行为与在数据集(或Dataframes)上的行为不同。在RDDs上,它使用MEMORY_ONLY,在数据集上,MEMORY_AND_DISK.I不能看到您已经(完全)编码了什么,但是通常我可以说,您不应该面对缓存和持久化两种方式之间的区别,您的问题只是版本不兼容,或者只是一个未被Apache修复的bug。

有几个地方可以检查,看看出了什么问题

在这个链接https://spark.apache.org/releases/spark-release-1-6-3.html中,您可以在分支1.6中找到代码的维护性,所以这里是查找代码https://github.com/apache/spark/blob/branch-1.6/core/src/main/scala/org/apache/spark/CacheManager.scala的地方。

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52032904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档