1. 程式人生 > >presto UI 分析及相關原始碼分析

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 引擎的執行過程和原理,勉強湊合著用。