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 引擎的执行过程和原理,勉强凑合着用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值