- Connector API
- Presto 連接外部資料儲存的插件契約,由 Metadata API、Data Location API、Data Source API 與 Data Sink API 四部分組成。它的設計目標是讓 connector 實作在實體分散的執行引擎環境中仍能維持高效能。
- Split
- 指向外部儲存系統中某塊可定址資料的不透明控制代碼,內容由 connector 定義——檔案系統是路徑加位移量,Redis 則是鍵、值格式與主機清單。split 既是指派給 leaf stage task 的單位,也是 worker 執行緒上的排程單位。
- Stage 與 task
- stage 是計畫中可跨 worker 平行執行的部分;每個 stage 會分散成一或多個 task,各自對不同的輸入資料執行相同的運算。leaf stage 從 connector 讀取資料,intermediate stage 只消費其他 stage 的中間結果。
- Pipeline 與 driver loop
- pipeline 是 task 內部的一串運算子,例如 hash join 的 build pipeline 與 probe pipeline,並透過本機的 in-memory shuffle 與其他 pipeline 相連。driver loop 執行一個 split 的方式,是反覆在所有能推進的運算子配對之間搬動資料,直到 quanta 用盡或無法再推進為止。
- Page 與 Block
- page 是 driver loop 在運算子之間搬動的資料單位:一段資料列序列的欄式編碼,每欄一個 Block,且採扁平的記憶體表示。Block 可以是一般、dictionary 編碼或 run-length 編碼;扁平之所以重要,是因為指標追逐、unboxing 與虛擬方法呼叫會主宰緊湊迴圈的成本。
- Data layout
- connector 向最佳化器揭露的資料表實體描述——位置資訊,加上分割、排序、grouping 與索引等屬性。一個資料表可以回傳多個 layout,讓最佳化器挑選最適合該查詢的一個,例如在述詞欄位上建有索引的 layout。
- User memory 與 system memory
- user memory 是使用者只憑對查詢與輸入資料的基本認識就能推理的用量,例如聚合的記憶體與其基數成正比;system memory 則是實作的副產物,例如 shuffle 緩衝區,可能與查詢形狀無關。Presto 對 user memory 以及 user 加 system 的總量分別設限。
- Reserved pool
- 查詢記憶體在每個節點上再切出的一塊子 pool,用來在 general pool 耗盡且無法 spilling 時解開叢集的僵局。記憶體吃緊節點上用量最大的查詢會被提升到所有 worker 的 reserved pool,而全叢集同時只允許一個查詢佔用,以免不同 worker 各自卡住不同查詢而形成死結。
- Raptor
- 專為 Presto 撰寫的 shared-nothing 儲存引擎,metadata 放在 MySQL,資料以 ORC 格式存於本機快閃磁碟,並支援排序、bucketing 與時間欄位。它支撐 A/B Testing 使用情境,因為該場景重視可預測的高吞吐、低延遲讀取,勝過就地查詢原始資料。