presto UI 分析及相关源码分析

CLUSTER OVERVIEW

访问coordinator 的 http://IP:PORT,首先呈现的是 cluster overview

访问coordinator

九个参数窗口,唯独 “ RESERVED MEMORY ” 不太好理解,presto 相关文档又没有解释。

而且容易和presto的配置“resources.reserved-system-memory”相混,容易以为是同一个概念。

RESERVED MEMORY

最后通过presto 源码阅读确认, 确认为 部分 Operator 操作产生的内存消耗。
web UI 先发HTTP请求至coordinator,coordinator,server代码最后调用StageStateMachine.java相关代码。

//StageStateMachine.java
totalMemoryReservation += taskStats.getMemoryReservation().toBytes();   

继续溯源

#TaskContext.java
succinctBytes(memoryReservation.get()),

继续溯源

public synchronized ListenableFuture<?> reserveMemory(long bytes)
    {
        checkArgument(bytes >= 0, "bytes is negative");

        ListenableFuture<?> future = queryContext.reserveMemory(bytes);
        memoryReservation.getAndAdd(bytes);
        return future;
    }

继续溯源

//DriverContext.java
public ListenableFuture<?> reserveMemory(long bytes)
    {
        ListenableFuture<?> future = pipelineContext.reserveMemory(bytes);
        long newMemoryReservation = memoryReservation.addAndGet(bytes);
        peakMemoryReservation.accumulateAndGet(newMemoryReservation, Math::max);
        return future;
    }

继续溯源,省掉一些环节

//xxOperator.java
public void addInput(Page page)
    {
        checkState(needsInput(), "Operator is already finishing");
        requireNonNull(page, "page is null");

        long memorySize = 0;
        for (Aggregator aggregate : aggregates) {
            aggregate.processPage(page);
            memorySize += aggregate.getEstimatedSize();
        }
        if (partial) {
            systemMemoryContext.setBytes(memorySize);
        }
        else {
            operatorContext.setMemoryReservation(memorySize);
        }
    }
// Driver.java
// if we got an output page, add it to the next operator
                    if (page != null && page.getPositionCount() != 0) {
                        next.getOperatorContext().startIntervalTimer();
                        next.addInput(page);
                        next.getOperatorContext().recordAddInput(page);
                        movedPage = true;
                    }

QUERY DETAILS

CLUSTER OVERVIEW 下面就是 QUERY DETAILS,可以查看某个 query 的细节
这里写图片描述

Query overview

“20180803_081402_00023_zw488” 为 “Query ID”
点进 Query ID,可以呈现Query overview 的详情页面。
这里写图片描述

再往下,是stages、tasks 的详情页
这里写图片描述

query Live Plan

query details 第二个 button 即为 “Live Plan”。呈现的是执行计划
这里写图片描述

Live Plan 有个问题,对于复杂的SQL查询,stage 会比较多,Live Plan 会呈现不出,显示为空白。 这种情况可以辅助于命令行,查看某个查询的执行计划。

stage performance

显示的Pipeline 、driver
Stage对应一个PlanFragment
Task是Stage的实例
每个PlanFragment会被拆分为若干Pipeline
Pipeline的实例是Driver
这里写图片描述

总结

presto UI 整体上太粗糙,用户体验一般。
相关参数没有说明,还得从源码中去定位细节。
“Live plan”,还不能完全呈现执行计划,存在一些bug。
总之,作为分析presto 引擎的执行过程和原理,勉强凑合着用。

猜你喜欢

转载自blog.csdn.net/zhixingheyi_tian/article/details/81435896