Presto簡介和部署

一、Presto是什麼?

Presto是一個開源的分佈式SQL查詢引擎,適用於交互式分析查詢,數據量支持GB到PB字節。

Presto的設計和編寫完全是爲了解決像Facebook這樣規模的商業數據倉庫的交互式分析和處理速度的問題。
官網和部署地址:http://prestodb.jd.com/overview.html

二、它可以做什麼?

Presto支持在線數據查詢,包括Hive, Cassandra, 關係數據庫以及專有數據存儲。 一條Presto查詢可以將多個數據源的數據進行合併,可以跨越整個組織進行分析。

Presto以分析師的需求作爲目標,他們期望響應時間小於1秒到幾分鐘。 Presto終結了數據分析的兩難選擇,要麼使用速度快的昂貴的商業方案,要麼使用消耗大量硬件的慢速的“免費”方案。

三、數據模型

1.presto採取三層表結構:

catalog 對應某一類數據源,例如hive的數據,或mysql的數據
schema 對應mysql中的數據庫
table 對應mysql中的表
在這裏插入圖片描述

2.presto的存儲單元包括:

Page: 多行數據的集合,包含多個列的數據,內部僅提供邏輯行,實際以列式存儲。
Block:一列數據,根據不同類型的數據,通常採取不同的編碼方式,瞭解這些編碼方式,有助於自己的存儲系統對接presto。

3.不同類型的block:

1.array類型block,應用於固定寬度的類型,例如int,long,double。block由兩部分組成
boolean valueIsNull[]表示每一行是否有值。
T values[] 每一行的具體值。

2. 可變寬度的block,應用於string類數據,由三部分信息組成

Slice : 所有行的數據拼接起來的字符串。
int offsets[] :每一行數據的起始便宜位置。每一行的長度等於下一行的起始便宜減去當前行的起始便宜。
boolean valueIsNull[] 表示某一行是否有值。如果有某一行無值,那麼這一行的便宜量等於上一行的偏移量。
3. 固定寬度的string類型的block,所有行的數據拼接成一長串Slice,每一行的長度固定。

  1. 字典block:對於某些列,distinct值較少,適合使用字典保存。主要有兩部分組成:

字典,可以是任意一種類型的block(甚至可以嵌套一個字典block),block中的每一行按照順序排序編號。
int ids[] 表示每一行數據對應的value在字典中的編號。在查找時,首先找到某一行的id,然後到字典中獲取真實的值。

插件

瞭解了presto的數據模型,就可以給presto編寫插件,來對接自己的存儲系統。presto提供了一套connector接口,從自定義存儲中讀取元數據,以及列存儲數據。先看connector的基本概念:

ConnectorMetadata: 管理表的元數據,表的元數據,partition等信息。在處理請求時,需要獲取元信息,以便確認讀取的數據的位置。Presto會傳入filter條件,以便減少讀取的數據的範圍。元信息可以從磁盤上讀取,也可以緩存在內存中。
ConnectorSplit: 一個IO Task處理的數據的集合,是調度的單元。一個split可以對應一個partition,或多個partition。
SplitManager : 根據表的meta,構造split。
SlsPageSource : 根據split的信息以及要讀取的列信息,從磁盤上讀取0個或多個page,供計算引擎計算。
Presto提供了一個簡單的connector : local file connector ,可用於參考如何實現自己的connector。不過local file connector中使用的遍歷數據的單元是cursor,即一行數據,而不是一個page。 hive 的connector中實現了三種類型,parquet connector, orc connector, rc file connector。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章