Presto架構及原理

wdsu5225 8年前發布 | 14K 次閱讀 Presto 分布式/云計算/大數據

Presto 是 非死book 推出的一個基于Java開發的大數據分布式 SQL 查詢引擎,可對從數 G 到數 P 的大數據進行交互式的查詢,查詢的速度達到商業數據倉庫的級別,據稱該引擎的性能是 Hive 的 10 倍以上。Presto 可以查詢包括 Hive、Cassandra 甚至是一些商業的數據存儲產品,單個 Presto 查詢可合并來自多個數據源的數據進行統一分析。Presto 的目標是在可期望的響應時間內返回查詢結果,非死book 在內部多個數據存儲中使用 Presto 交互式查詢,包括 300PB 的數據倉庫,超過 1000 個 非死book 員工每天在使用 Presto 運行超過 3 萬個查詢,每天掃描超過 1PB 的數據。

目錄:

  • presto架構

  • presto低延遲原理

  • presto存儲插件

  • presto執行過程

  • presto引擎對比

Presto架構

  • Presto查詢引擎是一個 Master-Slave 的架構,由下面三部分組成:

    1. 一個Coordinator節點

    2. 一個Discovery Server節點

    3. 多個Worker節點

  • Coordinator: 負責解析SQL語句,生成執行計劃,分發執行任務給Worker節點執行

  • Discovery Server: 通常內嵌于Coordinator節點中

  • Worker節點: 負責實際執行查詢任務,負責與HDFS交互讀取數據

  • Worker節點啟動后 向Discovery Server服務注冊 ,Coordinator從Discovery Server獲得可以正常工作的Worker節點。如果配置了Hive Connector,需要配置一個Hive MetaStore服務為Presto提供Hive元信息

  • 更形象架構圖如下:

Presto低延遲原理

  • 完全基于內存的并行計算

  • 流水線式計算作業

  • 本地化計算

  • 動態編譯執行計劃

  • GC控制

Presto存儲插件

  • Presto設計了一個簡單的 數據存儲的抽象層 , 來滿足在不同數據存儲系統之上都可以使用SQL進行查詢。

  • 存儲插件(連接器,connector)只需要提供實現以下操作的接口, 包括對 元數據(metadata)的提取 ,獲得 數據存儲的位置 ,獲取 數據本身的操作 等。

  • 除了我們主要使用的Hive/HDFS后臺系統之外, 我們也開發了一些連接其他系統的Presto 連接器,包括HBase,Scribe和定制開發的系統

  • 插件結構圖如下:

presto執行過程

  • 執行過程示意圖:

  • 提交查詢: 用戶使用Presto Cli提交一個查詢語句后,Cli使用HTTP協議與Coordinator通信,Coordinator收到查詢請求后調用SqlParser解析SQL語句得到Statement對象,并將Statement封裝成一個QueryStarter對象放入線程池中等待執行,如下圖:示例SQL如下

  • select c1.rank, count(*) from dim.city c1 join dim.city c2 on c1.id = c2.id where c1.id > 10 group by c1.rank limit 10;
    
  • 邏輯執行過程示意圖如下:

???????

  • 上圖邏輯執行計劃圖中的虛線就是Presto對邏輯執行計劃的切分點,邏輯計劃Plan生成的SubPlan分為四個部分,每一個SubPlan都會提交到一個或者多個Worker節點上執行

  • SubPlan有幾個重要的屬性planDistribution、outputPartitioning、partitionBy屬性整個執行過程的流程圖如下:

    1. PlanDistribution:表示一個查詢階段的分發方式,上圖中的4個SubPlan共有3種不同的PlanDistribution方式

      • Source :表示這個SubPlan是數據源,Source類型的任務會按照數據源大小確定分配多少個節點進行執行

      • Fixed:   表示這個SubPlan會分配固定的節點數進行執行(Config配置中的query.initial-hash-partitions參數配置,默認是8)

      • None:   表示這個SubPlan只分配到一個節點進行執行

    2. OutputPartitioning:表示這個SubPlan的輸出是否按照partitionBy的key值對數據進行Shuffle (洗牌) , 只有兩個值 HASH和NONE

  • 在上圖的執行計劃中,SubPlan1和SubPlan0 PlanDistribution=Source,這兩個SubPlan都是提供數據源的節點,SubPlan1所有節點的讀取數據都會發向SubPlan0的每一個節點;SubPlan2分配8個節點執行最終的聚合操作;SubPlan3只負責輸出最后計算完成的數據,如下圖:

  • SubPlan1和SubPlan0  作為Source節點,它們讀取HDFS文件數據的方式就是調用的HDFS InputSplit API,然后每個InputSplit分配一個Worker節點去執行,每個Worker節點分配的InputSplit數目上限是參數可配置的,Config中的query.max-pending-splits-per-node參數配置,默認是100

  • SubPlan1的每個節點讀取一個Split的數據并過濾后將數據分發給每個SubPlan0節點進行Join操作和Partial Aggr操作

  • SubPlan0的每個節點計算完成后按GroupBy Key的Hash值將數據分發到不同的SubPlan2節點

  • 所有SubPlan2節點計算完成后將數據分發到SubPlan3節點

  • SubPlan3節點計算完成后通知Coordinator結束查詢,并將數據發送給Coordinator

presto引擎對比

  • 與hive、SparkSQL對比結果圖

 

來自:http://www.cnblogs.com/tgzhu/p/6033373.html

 

 本文由用戶 wdsu5225 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!