我问这个问题听起来很天真,但这是我最近在项目中遇到的一个问题。需要对此有更好的理解。
df.persist(StorageLevel.MEMORY_AND_DISK)每当我们在HBase读取中使用这种持久化时,流作业的其他批处理都会一次又一次地返回相同的数据,但是每次批处理运行时都会更新HBase。
HBase读代码:
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
有人能给我解释一下并帮助我更好地理解吗?
发布于 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的地方。
希望能帮上忙。
https://stackoverflow.com/questions/52032904
复制相似问题