目錄:
- 數據查詢
- 數據導入
- 元數據修改
1、查詢
用戶可使用MySQL客戶端連接FE,執行SQL查詢, 獲得結果,查詢流程如下:
分步說明:
- ① MySQL客戶端執行DQL SQL命令。
- ② FE解析, 分析, 改寫, 優化和規划, 生成分布式執行計划。
- ③ 分布式執行計划由 若干個可在單台be上執行的plan fragment構成, FE執行exec_plan_fragment, 將plan fragment分發給BE,並指定其中一台BE為coordinator。
- ④ BE執行本地計算, 比如掃描數據。
- ⑤ 其他BE調用transimit_data將中間結果發送給BE coordinator節點匯總為最終結果。
- ⑥ FE調用fetch_data獲取最終結果。
- ⑦ FE將最終結果發送給MySQL client。
執行計划在BE上的實際執行過程比較復雜, 采用向量化執行方式,比如一個算子產生4096個結果,輸出到下一個算子參與計算,而非batch方式或者one-tuple-at-a-time。
數據導入
用戶創建表之后, 導入數據填充表
- 支持導入數據源有: 本地文件, HDFS, Kafka和S3
- 支持導入方式有: 批量導入, 流式導入
- 支持的數據格式有: CSV, Parquet, ORC等.
- 導入發起方式有: 用RESTful接口, 執行SQL命令.
數據導入的流程圖:
分步解釋:
- ① 用戶選擇一台BE作為協調者, 發起數據導入請求, 傳入數據格式, 數據源和標識此次數據導入的label, label用於避免數據重復導入. 用戶也可以向FE發起請求, FE會把請求重定向給BE.
- ② BE收到請求后, 向FE master節點上報, 執行loadTxnBegin, 創建全局事務。 因為導入過程中, 需要同時更新base表和物化索引的多個bucket, 為了保證數據導入的一致性, 用事務控制本次導入的原子性.
- ③ BE創建事務成功后, 執行streamLoadPut調用, 從FE獲得本次數據導入的計划. 數據導入, 可以看成是將數據分發到所涉及的全部的tablet副本上, BE從FE獲取的導入計划包含數據的schema信息和tablet副本信息.
- ④ BE從數據源拉取數據, 根據base表和物化索引表的schema信息, 構造內部數據格式.
- ⑤ BE根據分區分桶的規則和副本位置信息, 將發往同一個BE的數據, 批量打包, 發送給BE, BE收到數據后, 將數據寫入到對應的tablet副本中.
- ⑥ 當BE coordinator節點完成此次數據導入, 向FE master節點執行loadTxnCommit, 提交全局事務, 發送本次數據導入的 執行情況, FE master確認所有涉及的tablet的多數副本都成功完成, 則發布本次數據導入使數據對外可見, 否則, 導入失敗, 數據不可見, 后台負責清理掉不一致的數據.
3、更改元數據
更改元數據的操作有: 創建數據庫, 創建表, 創建物化視圖, 修改schema等等. 這樣的操作需要:
- 持久化到永久存儲的設備上;
- 保證高可用, 復制FE多實例上, 避免單點故障;
- 有的操作需要在BE上生效, 比如創建表時, 需要在BE上創建tablet副本.
元數據的更新操作流程如下:
分步解釋:
- ① 用戶使用MySQL client執行SQL的DDL命令, 向FE的master節點發起請求; 比如: 創建表.
- ② FE檢查請求合法性, 然后向BE發起同步命令, 使操作在BE上生效; 比如: FE確定表的列類型是否合法, 計算tablet的副本的放置位置, 向BE發起請求, 創建tablet副本.
- ③ BE執行成功, 則修改內存的Catalog. 比如: 將table, partition, index, tablet的副本信息保存在Catalog中.
- ④ FE追加本次操作到EditLog並且持久化.
- ⑤ FE通過復制協議將EditLog的新增操作項同步到FE的follower節點.
- ⑥ FE的follower節點收到新追加的操作項后, 在自己的Catalog上按順序播放, 使得自己狀態追上FE master節點.
上述執行環節出現失敗, 則本次元數據修改失敗.
參考: