首页 > 解决方案 > Spark Caching - 数据分发和复制

问题描述

spark如何决定复制缓存分区的次数?spark UI 上存储选项卡中的存储级别显示“Disk Serialized 1x Replicated”,但看起来分区被复制到多个执行器上。我们注意到使用 spark 2.3 的 DISK_ONLY 和 OFF_HEAP 存储级别都会发生这种情况。我们正在缓存一个包含 101 个分区的数据集(磁盘大小为 468.4 GB)。数据最初分布在 101 个执行器上(我们总共有 600 个执行器)。当我们在这个数据集上运行查询时,磁盘上的大小以及分布在执行器上的数据的数量都会增长。

当我在缓存数据集上运行 spark 查询时,我可以看到 spark 作业正在创建 101 个任务并将其分配给 101 个执行程序。很少有执行程序是 PROCESS_LOCAL,其他很少是 NODE_LOCAL 或 RACK_LOCAL。对于 NODE_LOCAL 和 RACK_LOCAL ,任务执行需要更长的时间,因为它涉及数据复制。

我注意到,如果在 NODE_LOCAL 或 RACK_LOCAL 上分配任务,则在每次查询执行时,缓存大小都会增加。在某个阶段,我看到它超过了 2.5TB

我想了解为什么在查询执行时缓存大小会增加?如果这是默认的 spark 行为,将数据从 DISK 复制到 NODE_LOCAL 或 RACK_LOCAL 执行程序,那么如何管理缓存大小?

我还注意到通常一个块/分区被复制到同一节点上的多个执行器上——如果它存储在磁盘上,为什么同一节点的执行器之间不共享呢?

标签: apache-spark

解决方案


推荐阅读