Spark具有spark.executor.memory。我的理解是,即使我的应用程序不需要spark.executor.memory定义的内容。 Spark仍然为每个执行者分配spark.executor.memory。如果我的SQL应用程序使用的数据少于spark.executor.memory,则会浪费大量资源。
执行后,是否有办法知道我的工作使用的真实内存?
我从https://spark.apache.org/docs/latest/monitoring.html找到了peakExecutionMemory
在重排,聚合和联接期间创建的内部数据结构使用的峰值内存。该累加器的值应约为此任务中创建的所有此类数据结构的峰值大小的总和。对于SQL作业,这仅跟踪所有不安全的运算符和ExternalSort。
但是,应用程序完成后,在Spark UI的“阶段”选项卡中,“峰值执行内存”指标始终为0。
我的应用程序使用SQL。在Spark UI的SQL选项卡上,“查询详细信息”显示有关执行计划DAG的指标。我可以看到
peak memory total (min, med, max):
31.1 GB (256.0 KB, 64.2 MB, 64.2 MB)
在DAG上某个节点上的。如何读取指标,相对于64.2M而言,31.1G似乎很大。此指标与peakExecutionMemory有何关系?
我的一般问题是“如何根据执行结果减少执行者的内存”。不确定上述指标是否正确。