dremio 实现官方create user sql 处理的一些说明
以前我简单说明实际上当时我只是说明了以下简单的思路,最近随着对于dremio 慢慢比较深入的学习,发现直接实现create user sq 似乎并不是一个比较方便的
原因
- 传入的参数是QueryContext,此上下文缺少UserService 的暴露
参考方法签名
public interface Creator {
SimpleDirectHandler toDirectHandler(QueryContext context);
}
实际QueryContext 是基于SabotContext 进行一个内部服务暴露的(比如catalog,namespace。。。)
但是QueryContext 木有直接暴露UserService 可以直接使用
解决方法
- 可以通过修改QueryContext 暴露一些SabotContext的内部服务
方便使用UserService,实际修改比较简单,就会需要的修改稍微大写,毕竟修改了sabot kernel - 直接基于bean 容器获取需要的bean
因为SabotContext 实际是guice 的一个bean获取到bean 容器也就可以取到SabotContext 或者直接就可以取到UserService了
当时目前此方法是有问题的,kernel 部分不能直接引用dac 模块部分的
QueryContext创建以及使用简单说明
- 创建
Foreman 的newAttemptManager 中
protected AttemptManager newAttemptManager(SabotContext context, AttemptId attemptId, UserRequest queryRequest,
AttemptObserver observer, UserSession session, OptionProvider options,
Cache<Long, PreparedPlan> preparedPlans, PlanCache planCache,
Predicate<DatasetConfig> datasetValidityChecker, CommandPool commandPool) {
final QueryContext queryContext = new QueryContext(session, context, attemptId.toQueryId(),
queryRequest.getPriority(), queryRequest.getMaxAllocation(), datasetValidityChecker, planCache);
return new AttemptManager(context, attemptId, queryRequest, observer, options, preparedPlans,
queryContext, commandPool, maestroService, jobTelemetryClient, ruleBasedEngineSelector,
queryRequest.runInSameThread());
}
Foreman 具体是由ForemenWorkManager 创建的,ForemenWorkManager 在drill 属于一个long running 的工作任务,dremio 中实际是类似的
说明
以上是一个简单的修改说明,实际上如果需要自己实现类似企业版的特性的话,QueryContext 不少东西看着是需要调整才能支持的,不然我们
直接实现SimpleDirectHandler 就很费事了
参考资料
sabot/kernel/src/main/java/com/dremio/exec/server/SabotContext.java
sabot/kernel/src/main/java/com/dremio/exec/server/ContextService.java
sabot/kernel/src/main/java/com/dremio/exec/ops/QueryContext.java
sabot/kernel/src/main/java/com/dremio/exec/work/protector/Foreman.java
https://www.cnblogs.com/rongfengliang/p/15484913.html