産品特色
編輯推薦
《Presto技術內幕》由淺入深地詳細介紹瞭Presto 的安裝過程、內部運行原理機製、功能特性、性能優化方法,以及在應用過程中常見的問題及解決方案等,同時詳細介紹瞭JD-Presto 版本的許多新功能及其適用的業務場景,這些功能的成功研發,使得JD-Presto 版本不僅僅可用於離綫大數據分析計算來提升性能,還可用於多種數據源混閤進行實時大數據分析計算,使一些使用其他大數據技術不能解決的業務場景有瞭一個全新有效的解決方案。
內容簡介
Presto是專門為大數據實時查詢計算而設計和開發的産品。由於Presto是基於Java語言開發的,因此,對使用者和開發者而言,Presto極易學習、使用並針對特定的業務場景進行改造開發和性能優化。無論是對多數據源支持,還是高性能、易用性、可擴展性等方麵, Presto都是大數據實時查詢計算産品中的佼佼者。
《Presto技術內幕》按照由淺入深的順序對Presto進行瞭全方位的細緻講解,具體內容包括Presto概述、 Presto安裝與部署、 Presto RESTful框架解析、提交查詢、生成查詢執行計劃、查詢調度、查詢執行、隊列、System Connector、 Hive Connector、 Kafka Connector、 Connector開發、 Functions開發、 JD-Presto功能改造、 Presto性能調優、 Presto應用場景。
目錄
第一部分 基礎篇
第 1 章 Presto概述2
1.1 Presto 背景及發展2
1.2 Presto 特點2
1.3 基本概念3
1.3.1 Presto 服務進程3
1.3.2 Presto 模型4
1.3.3 Presto 查詢執行模型 5
1.4 Presto 整體架構9
1.4.1 硬件架構9
1.4.2 軟件架構9
1.5 小結11
第 2 章 Presto 安裝與部署12
2.1 環境說明 12
2.2 準備工作13
2.2.1 建立 SSH 信任關係13
2.2.2 安裝 Java 17
2.2.3 安裝 Maven 17
2.2.4 安裝 Hive 18
2.3 源碼編譯21
2.3.1 下載源碼 21
2.3.2 源碼結構說明 22
2.3.3 編譯 26
2.4 部署 30
2.4.1 服務部署 30
2.4.2 客戶端部署 38
2.4.3 JDBC 使用 40
2.5 小結 42
第二部分 核心設計篇
第 3 章 Presto RESTful 框架解析 44
3.1 Statement 服務接口 44
3.2 Query 服務接口 47
3.3 Stage 服務接口48
3.4 Task 服務接口49
3.5 小結 52
第 4 章 提交查詢 53
4.1 提交查詢的步驟 53
4.2 源碼解析 53
4.3 提交查詢的流程 60
4.4 小結 61
第 5 章 生成查詢執行計劃 62
5.1 基本概念 63
5.1.1 Node 63
5.1.2 Metadata API 67
5.2 詞法與語法分析 68
5.2.1 語法規則 69
5.2.2 詞法分析 69
5.2.3 語法分析 71
5.3 獲取 QueryExecution 72
5.3.1 獲取 QueryExecutionFactory 72
5.3.2 創建 QueryExecution 73
5.3.3 啓動 QueryExecution 74
5.4 語義分析 77
5.4.1 Statement 分析 77
5.4.2 Relation 分析84
5.4.3 錶達式分析 91
5.5 執行計劃生成91
5.5.1 執行計劃節點 91
5.5.2 SQL 執行計劃93
5.5.3 Relation 執行計劃95
5.5.4 Query 執行計劃 99
5.6 執行計劃優化102
5.6.1 ImplementSampleAsFilter 102
5.6.2 CanonicalizeExpressions 102
5.6.3 SimplifyExpressions 102
5.6.4 UnaliasSymbolReferences 103
5.6.5 PruneRedundantProjections 103
5.6.6 SetFlatteningOptimizer 103
5.6.7 LimitPushDown 104
5.6.8 PredicatePushDown 104
5.6.9 MergeProjections 104
5.6.10 ProjectionPushDown 104
5.6.11 IndexJoinOptimizer105
5.6.12 CountConstantOptimizer 105
5.6.13 WindowFilterPushDown 105
5.6.14 HashGenerationOptimizer 105
5.6.15 PruneUnreferencedOutputs 106
5.6.16 MetadataQueryOptimizer 106
5.6.17 SingleDistinctOptimizer 106
5.6.18 BeginTableWrite 106
5.6.19 AddExchanges 107
5.6.20 PickLayout 107
5.7 執行計劃分段107
5.7.1 Source 107
5.7.2 Fixed 107
5.7.3 Single 107
5.7.4 Coordinator_only 107
5.8 示例108
5.8.1 Count 執行計劃108
5.8.2 Join 執行計劃108
5.9 小結110
第 6 章 查詢調度 111
6.1 生成調度執行器 111
6.2 查詢調度過程 113
6.2.1 NodeManager 114
6.2.2 NodeSelector 115
6.3 小結 118
第 7 章 查詢執行 119
7.1 查詢執行邏輯 120
7.2 Task 調度120
7.2.1 Source Task 調度120
7.2.2 Fixed Task 調度126
7.2.3 Single Task 調度 128
7.2.4 Coordinator_Only Task 調度 128
7.3 Task 執行129
7.3.1 創建 Task 129
7.3.2 更新 Task 135
7.3.3 運行 Task 140
7.4 小結 147
第 8 章 隊列 148
8.1 配置說明 148
8.1.1 queues 隊列定義149
8.1.2 rules 規則定義 149
8.2 隊列加載 150
8.3 隊列匹配 151
8.4 小結 154
第 9 章 System Connector 155
9.1 System Connector 使用155
9.1.1 Information_schema 155
9.1.2 Metadata 157
9.1.3 Runtime 157
9.2 System Connector 實現159
9.2.1 Information_schema 實現160
9.2.2 System Connector 實現163
9.3 小結 168
第 10 章 Hive Connector 169
10.1 與 Hive 的結閤 170
10.2 Split 分片管理 175
10.3 數據讀取179
10.4 Create Table As Select 的實現 182
10.5 小結186
第 11 章 Kafka Connector 187
11.1 認識 Kafka Connector 187
11.1.1 配置187
11.1.2 配置屬性187
11.1.3 內置字段189
11.1.4 錶定義文件190
11.1.5 Kafka 中的 key 和 message 191
11.1.6 行解碼192
11.1.7 日期和時間解碼器194
11.1.8 文本解碼器194
11.1.9 數值解碼器194
11.2 Kafka 連接器使用教程194
11.2.1 安裝 Apache Kafka195
11.2.2 下載數據195
11.2.3 在 Presto 中配置 Kafka topics 197
11.2.4 基本數據查詢197
11.2.5 添加錶定義文件199
11.2.6 將 message 中所有值映射到不同列200
11.2.7 使用實時數據202
11.3 Kafka Connector 獲取數據 207
11.3.1 Split 分片管理207
11.3.2 數據讀取209
11.4 小結210
第 12 章 Connector 開發211
12.1 創建 Maven 工程 211
12.2 注冊 Plugin 213
12.3 Connector 213
12.4 Metadata 215
12.5 SplitManager 217
12.6 RecordSetProvider 218
12.7 小結 219
第 13 章 Functions 開發220
13.1 Function 注冊 220
13.2 窗口函數 225
13.3 聚閤函數 229
13.4 小結 232
第三部分 高級篇
第 14 章 JD-Presto 功能改造234
14.1 PDBO 功能開發234
14.1.1 JDBC Split 剖析235
14.1.2 JdbcRecordCursor 剖析 238
14.1.3 分批次讀取實現原理 240
14.1.4 動態步長實現原理 243
14.1.5 條件下發 245
14.1.6 PDBO 配置定義 247
14.2 DDL 及 DML 支持 250
14.2.1 Hive 連接器 Insert 功能 250
14.2.2 Hive 連接器 CTAS 動態分區錶功能 252
14.3 動態增加、修改、刪除 Catalog 254
14.3.1 目的 254
14.3.2 現狀 254
14.3.3 實現 255
14.3.4 效果 258
14.4 小結 258
第 15 章 Presto 性能調優259
15.1 閤理設計分區 259
15.2 Group By 字句優化 259
15.3 使用模糊聚閤函數 259
15.4 閤並多條 Like 子句為一條 regexp_like 子句260
15.5 大錶放在 Join 子句左邊260
15.6 關閉 distributed hash join 261
15.7 使用 ORC 存儲 261
15.8 小結 262
第 16 章 Presto 應用場景 263
16.1 ETL 263
16.2 實時數據計算264
16.3 Ad-Hoc 查詢266
16.4 實時數據流分析266
16.5 小結268
附錄 A 常見問題及解決辦法269
A.1 同時訪問兩個 Hadoop 集群269
A.2 Kafka 集群重啓後無法獲取數據272
A.3 Task exceeded max memory size 277
A.4 SQL 中 In 子句太長導緻棧溢齣錯誤278
A.5 高並發導緻大量查詢齣錯279
附錄 B Presto 配置參數說明 282
附錄 C Presto 執行信息說明289
精彩書摘
1.3.3 Presto 查詢執行模型
Presto 在執行 SQL 語句時,將這些 SQL 語句解析為相應的查詢,並在分布式集群中執行這些查詢。
1. Statement
Statement 語句。其實就是指我們輸入的 SQL 語句。 Presto 支持符閤 ANSI 標準的 SQL語句。這種語句由子句( Clause)、錶達式( Expression)和斷言( Predicate)組成。Presto 為什麼將語句( Statement)和查詢( Query)的概念分開呢?因為在 Presto 中,語句和查詢本身就是不同的概念。語句指的是終端用戶輸入的用文字錶示的 SQL 語句;當 Presto 執行輸入的 SQL 語句時,會根據 SQL 語句生成查詢執行計劃,進而生成可以執行的查詢( Query),而查詢代錶的是分布到所有的 Worker 之間執行的實際查詢操作。
2. Query
Query 即查詢執行。當 Presto 接收一個 SQL 語句並執行時,會解析該 SQL 語句,將其轉變成一個查詢執行和相關的查詢執行計劃。一個查詢執行代錶可以在 Presto 集群中運行的查詢,是由運行在各個 Worker 上且各自之間相互關聯的階段( Stage)組成的。
那麼 SQL 語句與查詢執行之間有什麼不同呢?
其實很簡單,你可以認為 SQL 語句就是提交給 Presto 的用文字錶示的 SQL 執行語句。而查詢執行則是為瞭完成 SQL 語句所錶述的查詢而實例化的配置信息、組件、查詢執行計劃和優化信息等。一個查詢執行由 Stage、 Task、 Driver、 Split、 Operator 和 DataSource 組成。這些組件之間通過內部聯係共同組成瞭一個查詢執行,從而得到 SQL 語句錶述的查詢,並得到相應的結果集。
3. Stage
Stage 即查詢執行階段。當 Presto 運行 Query 時, Presto 會將一個 Query 拆分成具有層級關係的多個 Stage,一個 Stage 就代錶查詢執行計劃的一部分。例如,當我們執行一個查詢,從 Hive 的一張具有 1 億條記錄的錶中查詢數據並進行聚閤操作時, Presto 會創建一個Root Stage(在後麵的章節你會知道,該 Stage 就是 Single Stage),該 Stage 聚閤其上遊 Stage的輸齣數據,然後將結果輸齣給 Coordinator,並由 Coordinator 將結果輸齣給終端用戶。Presto 技術內幕。
通常情況下, Stage 之間是樹狀的層級結構。每個 Query 都有一個 Root Stage。該 Stage用於聚集所有其他 Stage 的輸齣數據,並將最終的數據反饋給終端用戶。需要注意的是,Stage並不會在集群中實際執行,它隻是 Coordinator 用於對查詢執行計劃進行管理和建模的邏輯概念。每個 Stage(除瞭 Single Stage 和 Source Stage)都會有輸入和輸齣,都會從上遊 Stage讀取數據,然後將産生結果輸齣給下遊 Stage。需要注意的是: Source Stage 沒有上遊 Stage,它從 Connector 獲取數據。 Single Stage 沒有下遊 Stage,它的結果直接輸齣給 Coordinator,並由 Coordinator 輸齣給終端用戶。
Presto 中的 Stage 共分為 4 種,具體介紹如下。
Coordinator_Only:這種類型的 Stage 用於執行 DDL 或者 DML 語句中最終的錶結構創建或者更改。
Single:這種類型的 Stage 用於聚閤子 Stage 的輸齣數據,並將最終數據輸齣給終端用戶。
Fixed: 這種類型的 Stage 用於接受其子 Stage 産生的數據並在集群中對這些數據進行分布式的聚閤或者分組計算。
Source:這種類型的 Stage 用於直接連接數據源,從數據源讀取數據,在讀取數據的時候,該階段也會根據 Presto 對查詢執行計劃的優化完成相關的斷言下發( Predicate PushDown)和條件過濾等。
說明
由於一個 SQL 查詢可以被分解為多個前後關聯的 Stage,在這裏我們約定:按照數據的流嚮,越靠近數據源的 Stage 越處於上遊,越遠離數據源的 Stage 越處於下遊。
4. Exchange
Exchange 的字麵意思就是 “交換”。 Presto 的 Stage 是通過 Exchange 來連接另一個 Stage的。Exchange 用於完成有上下遊關係的 Stage 之間的數據交換。在 Presto 中有兩種 Exchange:Output Buffer 和 Exchange Client。生産數據的 Stage 通過名為 Output Buffer 的 Exchange 將數據傳送給其下遊的 Stage(根據數據的流嚮,分為上下遊,你可以將 Presto 中查詢執行過程中的數據比喻成一條河流,那麼産生數據的 Stage 相對於消費數據的 Stage 來說,就是上遊)。消費數據的 Stage 通過名為 Exchange Client 的 Exchange 從上遊 Stage 讀取數據。如果當前的 Stage 是 Source 類型的 Stage,那麼該 Stage 則是直接通過相應的 Connector從數據源讀取數據的。而該 Stage 則是通過名為 Source Operator 的 Operator 與 Connector 進行交互的。例如,如果一個 Source Stage 直接從 HDFS 獲取數據,那麼這種操作不是通過Exchange Client 來完成的,而是通過運行於 Driver 中的 Source Operator 來完成的。
5. Task
從前麵的章節我們可以知道, Stage 並不會在 Presto 集群中實際運行,它僅代錶針對於一個 SQL 語句查詢執行計劃中的一部分查詢的執行過程,隻是用來對查詢執行計劃進行管理和的各個 Worker 節點上的。
在 Presto 集群中,一個查詢執行被分解成具有層級關係的一係列的 Stage,一個 Stage又被拆分為一係列的 Task。每個 Task 處理一個或者多個 Split。每個 Task 都有對應的輸入和輸齣。一個 Stage 被分解為多個 Task,從而可以並行地執行一個 Stage。 Task 也采用瞭相同的機製:一個 Task 也可以被分解為一個或者多個 Driver,從而並行地執行一個 Task。同的機製:一個 Task 也可以被分解為一個或者多個 Driver,從而並行地執行一個 Task。
說明
由於一個 SQL 查詢可以被分解為多個前後關聯的 Stage,而每個 Stage 中均含有一個或者多個Ta
Presto技術內幕 epub pdf mobi txt 電子書 下載 2024
Presto技術內幕 下載 epub mobi pdf txt 電子書