CommandPool 实际上是一个线程池的处理,官方实现了好几种线程池

主要作用

  • 限制并行请求以以及job 的运行
  • 定义优先级任务

特点

  • 任务基于优先级以及提交时间进行自然排序
  • 当线程空闲的是否任务会尽快的执行
  • 在其他任务需要运行的是否,比较忙碌的线程必须先完成
  • CommandPool 的注册是由CommandPoolFactory处理的

实现类

dremio CommandPool简单说明_java

 

 

实际具体实现可以参考不同实现的源码

创建

上边也说了,是由CommandPoolFactory 创建的,参加处理
参考代码

 

public CommandPool newPool(final DremioConfig config, final Tracer tracer) {
if (config.getBoolean(RELEASABLE_COMMAND_POOL_ENABLED)) {
final int poolSize = getPoolSize(config);
logger.info("Starting releasable bound command pool of size {}", poolSize);
return new ReleasableBoundCommandPool(poolSize, tracer);
}

 

if (config.getBoolean(COMMAND_POOL_ENABLED)) {
final int poolSize = getPoolSize(config);
logger.info("Starting bound command pool of size {}", poolSize);
return new BoundCommandPool(poolSize, tracer);
}

 

logger.info("Starting unbound command pool");
// We don't bother decorating the same thread pool.
// The tracing context doesn't have to move.
return new SameThreadCommandPool();
}
// 实际的cpu 处理器个数
private int getPoolSize(final DremioConfig config) {
int poolSize = config.getInt(POOL_SIZE);
poolSize = poolSize > 0 ? poolSize : VM.availableProcessors() - 1; // make sure we don't use all cores by default
return Math.max(1, poolSize); // in the unlikely case where the cpu has a single core
}

说明

CommandPool 在好多任务执行的地方都是需要依赖的,但是主要是AttemptManager 进行操作,由源头ForemenWorkManager 依赖,并传递到依赖的服务中

参考资料

services/command-pool/src/main/java/com/dremio/service/commandpool/CommandPool.java