我有一个非常强大的集群,每个24核有3个节点,96GB RAM = 288gb。我尝试将100gb的tsv文件加载到Spark缓存中,并对数据进行一系列简单的计算,例如col2-col4组合的sum(col20)。我认为缓存使用情况很明显。
但是在Spark执行期间,我发现尽管有足够的RAM空间,缓存仍然不会加载100%的数据。执行1小时后,我有70%的缓存分区和170gb可用的75gb缓存使用率。它看起来像Spark以某种方式限制它添加到缓存中的块/分区的数量,而不是在第一次操作时添加所有块并从一开始就具有很好的性能。
我使用MEMORY_ONLY_SER / Kryo(缓存大小约为磁盘数据大小的110%)
是否有人有类似的经历或了解一些可能导致此缓存行为的Spark配置/环境条件?
答案 0 :(得分:0)
因此,“问题”通过进一步减少分割尺寸得以解决。将 mapreduce.input.fileinputformat.split.maxsize 设置为100mb后,我在第一个操作完成后获得了98%的缓存加载,在第二个操作时获得了100%的缓存加载。
其他恶化我的结果 spark.speculation = true - 我试图避免长期运行的任务,但猜测管理创造了巨大的性能开销,对我的情况毫无用处。因此,只需保留 spark.speculation 的默认值(false)
我对20个查询的表现比较如下:
- 没有缓存 - 160分钟(20次x 8分钟,每次从磁盘重新加载100gb到内存)
- 缓存 - 总共33分钟 - 10米加载缓存100%(前2个查询)和18个查询x 1.5分钟(来自内存中的Kryo序列化缓存)