一.Dremio架構
Dremio是基于Apache calcite、Apache arrow和Apache parquet3個開源架構建構,結構其核心引擎Sabot,形成這款DaaS(Data-as-a-Service)資料即服務平台;整體體驗風格與其公司開源的Apache Drill非常接近。
Ⅰ).架構圖
Ⅱ).參考API
Ⅲ).參考SQL
二.Apache Arrow
Apache Arrow是基于Apache Drill中的Value Vector來實作的,而使用Value Vector可以減少運算時重複通路資料帶來的成本,其特點:
- 零拷貝共享記憶體和基于RPC的資料移動
- 讀寫檔案格式(如CSV,Apache ORC和Apache Parquet)
- 記憶體分析和查詢處理
Ⅰ).公共資料層
Apache Arrow的功能設計思路有點類似于擴充卡模式,将不同系統的資料源進行統一适配。
a).不使用Arrow
- 每個系統都有自己的内部存儲器格式
- 在序列化和反序列化上浪費了70-80%的計算量
- 在多個項目中實作的類似功能
b).使用Arrow
- 所有系統都使用相同的記憶體格式
- 沒有跨系統通信的開銷
- 項目可以共享功能
Ⅱ).列式存儲
傳統的記憶體資料格式是以每一行作為各個字段的分布,相同字段沒有被集中在一起,造成了計算時的不必要浪費;Apache Arrow通過列式存儲格式限制,将相同字段集中排列在一起,提高了過濾查詢的響應
如下例子:
a).資料
people=[
{
"name": "mary",
"age": 30,
"placed_lived": [
{
"city": "Akron",
"state": "OH"
},
{
"city": "Bath",
"state": "OH"
}
]
},
{
"name": "mary",
"age": 31,
"placed_lived": [
{
"city": "Lodi",
"state": "OH"
},
{
"city": "Ada",
"state": "OH"
},
{
"city": "Akron",
"state": "OH"
}
]
}
]
b).存儲結構
placed_lived offsets: 存儲的起始位置是0,其中第一個人有2個city,是以為0~2;第二個人有3個city,是以為3~5
city offsets: 存儲的起始位置是0,其中第一個人的第一個city是Akron,是以為0~5,以此類推,即可知offsets位置
city Data: 即為實際資料存儲位置
三.Apache Parquet
Apache Parquet是一種面向分析的、通用的列式存儲格式,相容各種資料處理架構比如 Spark、Hive、Impala 等,同時支援 Avro、Thrift、Protocol Buffers 等資料模型。
Ⅰ).Parquet主要子產品
- parquet-format:定義了所有格式規範,以及由 Thrift 序列化的中繼資料資訊
- parquet-mr:實作讀寫 Parquet 檔案的功能子產品,與其他元件的适配工具,如Hadoop Input/Output Formats、Pig loaders 、Hive Serde 等
- parquet-cpp:用于讀寫Parquet檔案的C ++庫
- parquet-rs:用于讀寫Parquet檔案的Rust 庫
- parquet-compatibility:驗證不同語言之間讀寫 Parquet 檔案的相容性測試
Ⅱ).資料存儲格式
Parquet檔案結構
- File:一個 Parquet 檔案,包括資料和中繼資料
- Row group:資料在水準方向上按行拆分為的單元
- Column:一個行組中的每一列對應的儲存在一個列塊中
- Page:每一個列塊劃分為多個資料頁,同一個列塊的不同頁可能使用不同的編碼格式
Ⅲ).中繼資料
中繼資料包括如下3部分
- file metadata
- column (chunk) metadata
- page header metadata
四.Apache Calcite
Apache Calcite 是一款開源SQL解析工具, 可以将各種SQL語句解析成抽象文法術AST(Abstract Syntax Tree), 之後通過操作AST就可以把SQL中所要表達的算法與關系展現在具體代碼之中
Ⅰ).Calcite 主要元件
- Catelog: *定義SQL語義相關的中繼資料與命名空間
- SQL parser: 主要是把SQL轉化成AST
- SQL validator: 通過Catalog來校證AST
- Query optimizer: 将AST轉化成實體執行計劃、優化實體執行計劃
- SQL generator: 反向将實體執行計劃轉化成SQL語句
Ⅱ).Calcite 主要功能
- SQL 解析
- SQL 校驗
- 查詢優化
- SQL 生成器
- 資料連接配接
五.Apache Drill
Apache Drill是用于大規模資料集的低延遲分布式SQL查詢引擎,包括結構化和半結構化/嵌套資料
Ⅰ).Drill核心子產品
- RPC端點: Drill公開了一個低開銷的基于protobuf的RPC協定,以與用戶端進行通信
- SQL解析器: Drill使用開源SQL解析器架構Calcite來解析傳入的查詢
- 存儲插件界面: Drill充當多個資料源之上的查詢層,存儲插件為Drill提供以下資訊
- a).資料源的的中繼資料
- b).Drill用于讀取和寫入資料源的接口
- c).資料的位置和一組優化規則,以幫助在特定資料源上高效,快速地執行Drill查詢
Ⅱ).Drill查詢
- 用戶端或應用程式會以SQL語句的形式将查詢發送到Drill叢集中的Drillbit,Drill無主從概念
- 接受查詢的Drill節點成為Foreman,Foreman驅動整個查詢
- Foreman解析器解析SQL,并根據SQL運算符形成邏輯計劃
- Foreman優化器使用各種類型的規則把操作符和函數重新排列為最佳計劃後,将邏輯計劃轉換為執行查詢的實體計劃
- Foreman中的并行化程式将實體計劃轉換為多個片段,片段建立了一個多級執行樹
- 查詢根據執行樹在資料源并行執行,并将結果發送回用戶端或應用程式
Ⅲ).Drill特點
- 低延遲SQL查詢
- 動态查詢檔案(如JSON,Parquet,AVRO和NoSQL)和HBase表中的自描述資料,無需Hive Metastore中的中繼資料定義
- 嵌套資料支援
- 與Apache Hive內建(對Hive表和視圖的查詢,對所有Hive檔案格式和Hive UDF的支援)
- 使用标準JDBC / ODBC驅動程式進行BI / SQL工具內建