Drill官網文件翻譯二:Drill查詢的執行

老將黃滾發表於2016-02-02

(翻譯自Drill官網)

當您提交Drill查詢的時候,客戶端或應用程式會把查詢以SQL語句的形式傳送到Drill叢集的一個Drillbit。Drillbit是在每個線上的Drill節點上執行的程式,它負責協調,規劃和執行查詢,並按照最大限度地實現資料本地化的原則在叢集中分發查詢。

下圖描述了客戶端,應用和drillbit之前的通訊:

https://drill.apache.org/docs/img/query-flow-client.png

從客戶端或應用端接收查詢的那個drillbit會成為這個查詢是的“接待員”,會負責驅動整個查詢。這個”接待員“drillbit程式中有一個解析器,這個解析器解析這個SQL語句,應用一系列定製的規則,並把特定的SQL操作符翻譯成相應的Drill能理解的邏輯操作符。這一系列邏輯操作符形成了一個邏輯計劃。這個邏輯計劃描述了為了得到查詢結果需要做的工作,以及需要的資料來源以及要進行的處理。

這個“接待員”drillbit 會將這個邏輯計劃傳送到一個基於開銷核算的優化器,這個優化器會調整SQL操作符的順序。優化器會應用各種各樣的規則來做操作符和函式的對齊操作,並形成一個物理計劃。最終就是,優化器將邏輯計劃轉換成了一個描述這個查詢如何工作的物理計劃。

https://drill.apache.org/docs/img/client-phys-plan.png

一個“parallelizer”會將一條物理計劃轉換成若干條短語,這些短語我們稱之為”一級碎片“和”次級碎片“。

https://drill.apache.org/docs/img/execution-tree.PNG

Major Fragments

一個”Major Fragments“是這樣一個概念,可以說是代表了Dril查詢的一個階段。一個”階段(phase)“是Drill執行查詢時必須執行的一個或多個操作單元。Drill會給每個Major Fragments 分配一個MajorFragmentID.

例如,為了計算兩個檔案的Hash,Drill可能就會建立兩個主要階段(兩個Major fragments),第一階段用來掃描檔案 ,第二階段則用來聚合資料。

Major fragments

Drill使用”Exchange Operator “來連線不同的Major fragments。一個”exchange”是指的資料的位置移動,或是將物理計劃並行化的操作。一個“exchange”包含一個sender一個receiver,這使得資料可以在不同的節點間移動。

你可以在一個物理計劃中用這種方式來參與Major fragments:你可以把物理計劃匯出到一個JSON檔案中,手動修改它,並使用SUBMIT PLAN命令將這個json提交回Drill。你也可以在查詢分析器中檢視這些Major fragments,查詢分析器可以通過Drill的WEB終端登入。請查詢EXPLAIN和Query Profiles章節來獲得更多資訊。

Minor Fragments

每個Major Fragments 都可以並行化到一系列Minor Fragments;一個Minor Fragments是一個執行緒中執行的一個工作的邏輯單元。Drill中的一個邏輯工作單元,也被為一個”切片“。Drill 建立的執行計劃,是由若干Minor Fragments組成的。Drill給每個Minor Fragments分配了一個MinorFragmentID;

在”接待員“drillbit中的”並行器“是負責從一個Major Fragment中建立出若干個Minor Fragments,做法就是將一個Major Fragment 打散成儘可能多的能在叢集中同時執行的minor fragments.

Drill在單獨的執行緒內執行Minor Fragments,並且儘可能地快(這要看它依賴的上游資料)。Drill會把Minor Fragments歸劃到擁有資料本地化的那些節點上執行。如果做不到,Drill會在當前可用的Drillbit中使用那個流行的Round-Robbin演算法進行分配。

Minor Fragments 包含一個或多個關係運算子。每個運算子執行一個操作,比如scan,filter,join,或是group by。每個執行符都有一個操作型別和一個操作ID(operationID).每個操作ID定義了它和它所從屬的Minor Fragment和關係。請查閱”物理操作符“章節。

例如,當執行兩個檔案的Hash聚合操作時,Drill將第一個階段(掃行掃描檔案的階段)打散成兩個Minor frametns,每個minor fragments 包含一個掃描檔案的掃描運算子。Drill把那個專司於進行資料聚合的階段打散成4個minor fragments,四個中的每一個都包含 一個專門對資料做hash聚合的Hash 運算子。

你不能修改執行計劃中的minor fragments的數量。不過,你可以在Drill web console中檢視Query profiler並修改能夠改變minor fragments行為的一些配置,比如修改最大切片數。請查閱”選項配置“章節。

Minor Fragments的執行

Minor Fragments可以作為葉子fragment,根fragment和中間fragment來執行。一棵執行樹只能有一個根fragment.整棵執行樹上的協調是通過從根fragment開始的數字來進行的,根節點的數字是0.資料流從葉子fragment到根fragment一個個地往下流。

根fragment執行在“接待員”Drillbit上,他接受查詢,從資料表中讀取後設資料,重寫查詢,並將查詢路由到執行樹中的下一層。其他的fragments會成為葉子fragments或是中間fragments。

中間fragment會在資料可用,或是其他fragment將資料餵過來的時候開始執行。它們在資料上執行操作,並把它們往下傳。它們也會把聚合過的資料傳給根fragment,根fragment又會做進一步的聚合操作或者是把查詢結果提供給客戶端或是應用程式。

葉子fragment並行地掃表,或者是和儲存層打交道,或是是讀本地磁碟資料。葉子fragments把中間結果回傳給中間fragments,中間fragments會接著在這些中間結果上各種並行操作。

Drill只會規劃那些可以併發執行的fragments的查詢,例如,如果一個叢集只有20個切片,Drill會在那個Major fragment中規劃最多20個minor fragments。Dril會樂觀地假定它能併發地執行任務。一個Major fragments中的minor framents由於共同的上游資料依賴,會於同一時間開始執行。


相關文章