日韩高清亚洲日韩精品一区二区三区,成熟人妻av无码专区,国产又A又黄又潮娇喘视频,男女猛烈无遮挡免费视频在线观看

Trino中Task源碼解析(tars源碼分析)

我們知道,在Trino中一個Query會拆分成多個Stage,一個Stage又會拆分成多個Task,Task是跑在Worker上的具體任務(wù),那一個Task周圍有哪些息息相關(guān)的類和方法呢,需要我們?nèi)ラ喿x源碼分析。

整體框架

和Task關(guān)系密切的幾個類以及關(guān)系如下圖所示

Trino中Task源碼解析(tars源碼分析)

TaskResource

Task的創(chuàng)建,刪除,更新都是通過Http請求來完成,由TaskResource這個類來接受請求, 但具體的實現(xiàn)方法都封裝在SqlTaskManager中,TaskResource接收到請求后調(diào)用SqlTaskManager中對應(yīng)的方法,以創(chuàng)建Task為例:

Trino中Task源碼解析(tars源碼分析)

SqlTaskManager

該類中有許多對Task進行操作的方法,比如創(chuàng)建,更新,取消,中止等等

Trino中Task源碼解析(tars源碼分析)

上圖中的類屬性tasks就是用來保存所有task相關(guān)信息的,本質(zhì)是一個不可驅(qū)逐的緩存,緩存中key是taskId(每個task的專屬標識), value是對應(yīng)創(chuàng)建的sqlTask對象。

因此SqlTaskManager中對Task操作就是從tasks中根據(jù)taskId拿到SqlTask對象,再調(diào)用對應(yīng)的方法。

Trino中Task源碼解析(tars源碼分析)

StucksplitTasksInterrupter

SqlTaskManager中還有個很重要的特性就是StuckSplitTasksInterrupter,他會定時的去檢查是否有task卡住,如果卡住則被標記為stuck并會被kill,至于是否開啟這個功能以及多長時間沒響應(yīng)才算卡住,都可以通過參數(shù)去配置。

Trino中Task源碼解析(tars源碼分析)

Trino中Task源碼解析(tars源碼分析)

可以看到代碼中會去遍歷當前所有的runningSplit,如果該runningSplit執(zhí)行時間大于設(shè)置的閾值,則會被篩選出來拿到對應(yīng)的TaskId, 再調(diào)用sqlTask的fail方法,結(jié)束這個卡住的Task

SqlTask

每一個Task都對應(yīng)于一個SqlTask對象,其中比較重要的幾個屬性:

  1. TaskStateMachine: 用來記錄Task的狀態(tài),在調(diào)用sqlTask的cancel, abort等接口時,其實就是修改狀態(tài)機的狀態(tài),并且狀態(tài)機會有一個Listener監(jiān)聽狀態(tài)機的變化,一旦有更新,就會執(zhí)行相應(yīng)的操作

Trino中Task源碼解析(tars源碼分析)

  1. SqlTaskExecution: 在創(chuàng)建SqlTask對象時,同時也會創(chuàng)建一個對應(yīng)的SqlTaskExecution。 SqlTaskExecution主要是負責Split到Driver的調(diào)度,并把split和TaskExecutor關(guān)聯(lián)起來, 通過創(chuàng)建一個TaskHandle放到TaskExecutor的隊列中去等待執(zhí)行。在創(chuàng)建TaskHandle時,會添加一個Listener,如果這個Task的狀態(tài)被設(shè)置為Terminating或者Done時,就會調(diào)用TaskExecutor中的removeTask方法來真正的取消這個task任務(wù)

Trino中Task源碼解析(tars源碼分析)

TaskExecutor

TaskExecutor是具體執(zhí)行Task任務(wù)的地方。他有一個線程池,線程池的大小可以通過參數(shù)配置,初始化的時候就會創(chuàng)建出對應(yīng)個數(shù)的線程,每個線程執(zhí)行一個TaskRunner,在TaskRunner中,while循環(huán)從waitingSplit中拿到Split,放到runningSplit中并執(zhí)行這個split。前面提到的StuckSplitTasksInterrupter中獲取的runningSplit信息就是從這個地方更新的。而waitingSplit中的split就是在上面提到的SqlTaskExecution中放進去的。

Trino中Task源碼解析(tars源碼分析)

Trino中Task源碼解析(tars源碼分析)Trino中Task源碼解析(tars源碼分析)

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號
公眾號
在線咨詢
分享本頁
返回頂部