如何将表固定在缓存中,这样它就不会交换出内存?
情况:我们正在使用 Microstrategy BI报告。语义层已建立。我们希望使用Spark SQL CACHE表将常用表缓存到CACHE中;我们为SPARK上下文(Thrift服务器)进行了缓存。最初它们全部在高速缓存中,现在有些在高速缓存中,有些在磁盘中。该磁盘可能是本地磁盘,与从s3读取相比,其开销相对较大。从用户体验的角度来看,查询可能需要更长的时间和不一致的时间。如果使用缓存表运行更多查询,则会复制缓存表映像的副本,并且副本不保留在内存中,从而导致报表运行时间更长。因此如何固定表,这样就不会交换到磁盘。 Spark内存管理是动态分配,以及如何使用这几张表将其固定在内存中。
答案 0 :(得分:0)
有两种解决方法。首先要记住,在内存中,存储是在存储和执行之间共享的。因此,进行可能需要临时存储的大型联接等可能会争用内存空间。您可能要查看“ spark.memory.storageFraction”,当前默认值为0.5,考虑为0.75,但这可能会降低查询速度。还可以考虑对问题应用良好的数据工程。减少需要存储的数据量。创建一个临时视图,其中删除了旧记录并修剪了不需要的列,然后对其进行缓存。考虑使用较小的数据类型以改善存储。 EXINT比大字符串更节省空间。最后,考虑切换到具有更多可用内存的实例类型,或者切换到具有快速本地磁盘的实例。在某些情况下,磁盘存储并不比内存慢多少。如果您正在运行大型复杂的分析查询,而该集群是cpu绑定而不是io绑定的,则尤其如此。