请问Presto中LocalMemoryManager与ClusterMemoryManager有何区别?
LocalMemoryManager vs ClusterMemoryManager in Presto
嘿,我刚好对Presto的内存管理机制摸得比较透,来帮你理清这俩的区别——它们真不是集群/单机模式的替代实现,而是分层协作、各司其职的关系:
1. LocalMemoryManager:单节点的内存执行者
每个Presto Worker节点上都会跑一个LocalMemoryManager实例,它的核心职责是管好单个节点内部的内存分配、隔离和回收:
- 它直接管控你看到的三个内存池:
GENERAL_POOL:日常查询任务的主要内存载体RESERVED_POOL:预留内存池,专门用来处理大查询或者紧急任务,避免小任务把节点内存占满导致大查询无法执行SYSTEM_POOL:给Presto节点自身的系统进程(比如任务协调、状态同步)预留的内存,和业务查询内存隔离开
- 简单说,它是节点级别的“内存管家”,所有单个节点上的内存申请、限制、回收动作,都是由它来具体执行的。
2. ClusterMemoryManager:集群全局的调度大脑
这个组件只运行在Presto Coordinator节点上,是集群视角下的内存调度管理者:
- 它并不直接操作任何节点的内存,而是负责收集所有Worker节点的内存使用状态(包括你提到的三个内存池的占用情况),然后做全局层面的决策:比如某个查询该分配多少集群总内存、哪些节点可以承接这个查询的内存需求、要不要限制某些查询的内存占用防止集群过载等。
- 代码里
private static final Set<MemoryPoolId> POOLS = ImmutableSet.of(GENERAL_POOL, RESERVED_POOL, SYSTEM_POOL)这段,就是让ClusterMemoryManager明确要监控和协调Worker节点上的这三类内存池,确保全局内存资源的合理分配。 - 它更像一个**“指挥中心”**,给各个Worker节点的LocalMemoryManager下达内存调度指令,再接收节点返回的状态更新,维持集群内存的整体健康。
二者的协作流程举个例子
当你提交一个查询后:
- Coordinator的ClusterMemoryManager先评估集群整体内存资源,计算这个查询能分配到的总内存额度
- 把内存分配任务下发到对应的Worker节点,每个节点的LocalMemoryManager在自己的
GENERAL_POOL(或其他对应池)里划出对应内存给查询任务使用 - 查询执行过程中,LocalMemoryManager会监控节点内存使用,触发回收或限流;ClusterMemoryManager则监控全局内存状态,必要时调整查询的内存分配策略
- 查询结束后,LocalMemoryManager回收节点上的内存,上报状态给ClusterMemoryManager更新全局统计
内容的提问来源于stack exchange,提问作者lulijun
相关产品推荐
相关产品推荐

