我正在学习Presto,并试图弄清楚Presto如何杀死正在运行的查询。但我对实际过程感到困惑。
我知道当 Presto 收到一个 kill 请求,或者它决定杀死一个消耗太多内存的查询时,它会调用 SqlQueryExecution.fail,但这种方法似乎只是改变了 QueryStateMachine,那么如何停止正在运行的线程呢?
@Override
public void fail(Throwable cause)
{
requireNonNull(cause, "cause is null");
stateMachine.transitionToFailed(cause);
}
我想知道它在哪一步中止正在运行的线程
Presto 执行在Driver
实例中进行管理。 Driver
当前可能正在执行或等待线程。 如果Driver
正在等待线程,则会关闭该线程。 在其他情况下,它会被中断并关闭。
Driver
靠工人生活。工作人员从协调器处获取应完成的信息。这发生在被终止的查询上,也适用于具有LIMIT
的查询,其中只需要读取部分数据。