隨著各行各業(yè)對大數(shù)據(jù)實時查詢的需求持續(xù)增長,數(shù)據(jù)查詢及分析引擎正變得不可或缺。Presto是由Facebook開源的高性能分布式SQL查詢引擎,其用戶包括Netflix、Airbnb、LinkedIn、Twitter、Uber等知名公司。本書由Presto的核心開發(fā)人員參與撰寫,教你系統(tǒng)地學習Presto的用法。書中內(nèi)容涵蓋Presto的安裝、設(shè)計理念、查詢操作、最佳實踐、與主要云平臺的結(jié)合等。本書分為三大部分:第一部分介紹Presto的基礎(chǔ)知識;第二部分更進一步,介紹Presto架構(gòu)、集群部署、與數(shù)據(jù)源的連接等;第三部分講解安全配置以及Presto的實際用例。你可以通過本書學會針對不同的數(shù)據(jù)源快速執(zhí)行交互式SQL數(shù)據(jù)分析,并利用Presto管理和使用海量數(shù)據(jù)。
1.Presto是由Facebook開源的高性能分布式SQL查詢引擎,其用戶包括Netflix、Airbnb、LinkedIn、Twitter、Uber等知名公司。
2.作為高性能分布式SQL查詢引擎,Presto能夠針對不同的數(shù)據(jù)源高效、快速地執(zhí)行交互式分析。大數(shù)據(jù)的興起使得數(shù)據(jù)存儲機制多樣化。面對標準不一的存儲系統(tǒng),你可以利用Presto輕松打破壁壘,連通數(shù)據(jù)孤島。
3.本書由Presto項目創(chuàng)始成員參與執(zhí)筆。你將學會用簡單的Presto語句快速查詢多個數(shù)據(jù)源,把握SQL-on-Anything的精髓。在任何規(guī)模、任何存儲系統(tǒng)、任何環(huán)境中,你都能發(fā)揮SQL的威力。
- 入門:探索Presto的用例,學習安裝、配置和使用Presto。
- 進階:深入理解Presto的架構(gòu),學習連接器實例和SQL高級特性。
- 實踐:了解如何在生產(chǎn)環(huán)境中使用Presto,保證安全性,與其他工具集成。
馬特·富勒(Matt Fuller)
Starburst公司聯(lián)合創(chuàng)始人。
曼弗雷德·莫澤(Manfred Moser)
開源社區(qū)擁護者、技術(shù)作家、培訓(xùn)師,Starburst公司軟件工程師。
馬丁·特拉韋爾索(Martin Traverso)
Presto項目創(chuàng)始成員,Presto軟件基金會聯(lián)合創(chuàng)始人,Starburst公司首席技術(shù)官。
【譯者簡介】
張晨
畢業(yè)于上海交通大學,熱愛大數(shù)據(jù)技術(shù)、數(shù)據(jù)庫、分布式系統(tǒng)和函數(shù)式編程,現(xiàn)于Indeed東京擔任軟件工程師。
黃鵬程
畢業(yè)于北京郵電大學,專注于數(shù)據(jù)庫和大數(shù)據(jù)平臺的開發(fā)與架構(gòu)工作。曾就職于中國民生銀行,擔任大數(shù)據(jù)基礎(chǔ)架構(gòu)團隊負責人。現(xiàn)任阿里云高級產(chǎn)品專家,負責阿里云數(shù)據(jù)庫相關(guān)產(chǎn)品的設(shè)計與規(guī)劃工作。
傅宇
畢業(yè)于南京大學,專注于數(shù)據(jù)庫技術(shù),現(xiàn)任阿里云技術(shù)專家,擔任PolarDB-X云原生分布式數(shù)據(jù)庫內(nèi)核研發(fā)工作,熟悉分布式事務(wù)、查詢優(yōu)化器和執(zhí)行器,對大數(shù)據(jù)領(lǐng)域充滿熱情。
譯者序 xv
序 xvii
前言 xix
第 一部分 Presto 入門
第 1章 Presto 介紹 3
1.1 大數(shù)據(jù)帶來的問題 3
1.2 Presto來救場 4
1.2.1 為性能和規(guī)模而生 5
1.2.2 SQL-on-Anything 5
1.2.3 存儲與計算分離 6
1.3 Presto使用場景 6
1.3.1 單一的SQL分析訪問點 7
1.3.2 數(shù)據(jù)倉庫和數(shù)據(jù)源系統(tǒng)的訪問點 7
1.3.3 提供對任何內(nèi)容的SQL訪問 8
1.3.4 聯(lián)邦查詢 9
1.3.5 虛擬數(shù)據(jù)倉庫的語義層 9
1.3.6 數(shù)據(jù)湖查詢引擎 9
1.3.7 SQL轉(zhuǎn)換和ETL10
1.3.8 更快的響應(yīng)帶來更好的數(shù)據(jù)見解 10
1.3.9 大數(shù)據(jù)、機器學習和人工智能 10
1.3.10 其他使用場景 11
1.4 Presto 資源 11
1.4.1 官方網(wǎng)站 11
1.4.2 文檔 12
1.4.3 社區(qū)交流 12
1.4.4 源代碼、許可證和版本 12
1.4.5 貢獻 12
1.4.6 本書資源 13
1.4.7 鳶尾花數(shù)據(jù)集 13
1.4.8 航班數(shù)據(jù)集 14
1.5 Presto簡史 14
1.6 小結(jié) 15
第 2章 安裝和配置Presto 16
2.1 使用Docker容器嘗試Presto 16
2.2 使用歸檔文件安裝 17
2.2.1 JVM 17
2.2.2 Python 18
2.2.3 安裝 18
2.2.4 配置 19
2.3 添加數(shù)據(jù)源 20
2.4 運行Presto 21
2.5 小結(jié) 21
第3章 使用Presto 22
3.1 Presto CLI 22
3.1.1 使用入門 22
3.1.2 分頁 25
3.1.3 命令歷史 25
3.1.4 額外診斷 25
3.1.5 執(zhí)行查詢 25
3.1.6 輸出格式 26
3.1.7 忽略錯誤 26
3.2 Presto JDBC驅(qū)動 27
3.2.1 下載和注冊驅(qū)動 28
3.2.2 創(chuàng)建到Presto的連接 29
3.3 Presto與ODBC 31
3.4 客戶端庫 31
3.5 Presto Web UI 31
3.6 使用Presto執(zhí)行SQL 32
3.6.1 概念 33
3.6.2 入門案例 33
3.7 小結(jié) 36
第二部分 深入理解Presto
第4章 Presto的架構(gòu) 39
4.1 集群中的協(xié)調(diào)器和工作節(jié)點 39
4.2 協(xié)調(diào)器 41
4.3 節(jié)點發(fā)現(xiàn)服務(wù) 41
4.4 工作節(jié)點 42
4.5 基于連接器的架構(gòu) 42
4.6 catalog、schema和表 43
4.7 查詢執(zhí)行模型 44
4.8 查詢優(yōu)化 47
4.8.1 解析和分析 48
4.8.2 初始查詢計劃 49
4.9 優(yōu)化規(guī)則 50
4.9.1 謂詞下推 51
4.9.2 Cross Join 消除 51
4.9.3 TopN 52
4.9.4 局部聚合 52
4.10 實現(xiàn)規(guī)則 53
4.10.1 Lateral Join 去關(guān)聯(lián)化 53
4.10.2 Semi-join(IN)去關(guān)聯(lián)化 54
4.11 基于代價的優(yōu)化器 55
4.11.1 代價的概念 55
4.11.2 Join的代價 57
4.11.3 表統(tǒng)計信息 57
4.11.4 過濾統(tǒng)計信息 58
4.11.5 分區(qū)表的統(tǒng)計信息 59
4.11.6 Join枚舉 60
4.11.7 廣播Join和分布式Join 60
4.12 使用表統(tǒng)計信息 62
4.12.1 Presto的ANALYZE 命令 62
4.12.2 在寫入存儲時收集數(shù)據(jù) 63
4.12.3 Hive的ANALYZE 命令 63
4.12.4 顯示表統(tǒng)計信息 63
4.13 小結(jié) 64
第5章 生產(chǎn)環(huán)境部署 65
5.1 配置細節(jié) 65
5.2 服務(wù)端配置 65
5.3 日志 66
5.4 節(jié)點配置 67
5.5 JVM配置 68
5.6 啟動器 69
5.7 集群安裝 70
5.8 使用RPM安裝 72
5.8.1 安裝目錄結(jié)構(gòu) 72
5.8.2 配置 73
5.8.3 卸載Presto 73
5.9 在云上安裝 73
5.10 集群規(guī)模的考量 74
5.11 小結(jié) 74
第6章 連接器 75
6.1 配置 76
6.2 RDBMS連接器示例:PostgreSQL 76
6.2.1 查詢下推 78
6.2.2 并行性和并發(fā)性 79
6.2.3 其他RDBMS連接器 80
6.2.4 安全性 81
6.3 Presto TPC-H和TPC-DS連接器 81
6.4 用于分布式存儲數(shù)據(jù)源的Hive 連接器 82
6.4.1 Apache Hadoop和Hive 82
6.4.2 Hive連接器 83
6.4.3 Hive式表格式 85
6.4.4 內(nèi)部表與外部表 85
6.4.5 分區(qū)數(shù)據(jù) 87
6.4.6 加載數(shù)據(jù) 88
6.4.7 文件格式和壓縮 90
6.4.8 MinIO示例 91
6.5 非關(guān)系數(shù)據(jù)源 91
6.6 Presto JMX 連接器 92
6.7 黑洞連接器 94
6.8 內(nèi)存連接器 94
6.9 其他連接器 95
6.10 小結(jié) 95
第7章 高級連接器實例 96
7.1 用Phoenix連接HBase 96
7.2 鍵值存儲連接器示例:Accumulo 97
7.2.1 使用Presto Accumulo連接器 100
7.2.2 Accumulo中的謂詞下推 102
7.3 Apache Cassandra 連接器 103
7.4 流式系統(tǒng)連接器示例:Kafka 104
7.5 文檔存儲連接器示例:Elasticsearch 106
7.5.1 概述 106
7.5.2 配置和使用方法 106
7.5.3 查詢處理 107
7.5.4 全文搜索 107
7.5.5 總結(jié) 108
7.6 Presto中的聯(lián)邦查詢 108
7.7 ETL和聯(lián)合查詢 114
7.8 小結(jié) 114
第8章 在Presto中使用SQL 115
8.1 Presto語句 116
8.2 Presto系統(tǒng)表 118
8.3 catalog 120
8.4 schema 120
8.5 Information Schema 121
8.6 表 122
8.6.1 表和列屬性 124
8.6.2 復(fù)制現(xiàn)有的表 125
8.6.3 從查詢結(jié)果中新建表 126
8.6.4 修改表 127
8.6.5 刪除表 127
8.6.6 連接器對表操作的限制 127
8.7 視圖 128
8.8 會話信息和配置 128
8.9 數(shù)據(jù)類型 129
8.9.1 集合數(shù)據(jù)類型 131
8.9.2 時態(tài)數(shù)據(jù)類型 132
8.9.3 類型轉(zhuǎn)換 135
8.10 SELECT語句基礎(chǔ) 136
8.11 WHERE子句 137
8.12 GROUP BY和HAVING子句 138
8.13 ORDER BY子句和LIMIT子句 140
8.14 JOIN語句 140
8.15 UNION、INTERSECT和EXCEPT子句 141
8.16 分組操作 143
8.17 WITH子句 144
8.18 子查詢 145
8.18.1 標量子查詢 145
8.18.2 EXISTS子查詢 146
8.18.3 集合比較子查詢 146
8.19 從表中刪除數(shù)據(jù) 147
8.20 小結(jié) 147
第9章 高級SQL特性 148
9.1 函數(shù)和運算符介紹 148
9.2 標量函數(shù)和運算符 149
9.3 布爾運算符 150
9.4 邏輯運算符 151
9.5 用BETWEEN語句選擇范圍 152
9.6 用IS(NOT) NULL檢測值的存在 152
9.7 數(shù)學函數(shù)和運算符 152
9.8 三角函數(shù)153
9.9 常數(shù)和隨機函數(shù) 154
9.10 字符串函數(shù)和運算符 154
9.11 字符串和映射 155
9.12 Unicode 156
9.13 正則表達式 158
9.14 解嵌套復(fù)雜數(shù)據(jù)類型 160
9.15 JSON函數(shù) 161
9.16 日期和時間函數(shù)及運算符 161
9.17 直方圖 164
9.18 聚合函數(shù) 165
9.18.1 映射聚合函數(shù) 165
9.18.2 近似聚合函數(shù) 167
9.19 窗函數(shù) 168
9.20 lambda表達式 169
9.21 地理空間函數(shù) 170
9.22 Prepared Statement 171
9.23 小結(jié) 173
第三部分 Presto的實際應(yīng)用
第 10章 安全 177
10.1 認證 178
10.2 授權(quán) 181
10.2.1 系統(tǒng)訪問控制 181
10.2.2 連接器訪問控制 184
10.3 加密 186
10.3.1 加密Presto客戶端與協(xié)調(diào)器之間的通信 188
10.3.2 創(chuàng)建Java keystore和Java truststore 190
10.3.3 在Presto集群內(nèi)加密通信 192
10.4 CA與自簽名證書 193
10.5 證書認證 194
10.6 Kerberos 197
10.6.1 前提條件 198
10.6.2 Kerberos客戶端認證 198
10.6.3 集群內(nèi)部Kerberos 198
10.7 數(shù)據(jù)源訪問和安全配置 199
10.8 使用Hive連接器進行Kerberos驗證 200
10.8.1 Hive Metastore Thrift服務(wù)認證 201
10.8.2 HDFS認證 201
10.9 集群分離 202
10.10 小結(jié) 202
第 11章 將Presto與其他工具集成 203
11.1 使用Apache Superset進行查詢、可視化和更多操作 203
11.2 使用RubiX提高性能 204
11.3 使用Apache Airflow的工作流 205
11.4 嵌入式Presto示例:Amazon Athena 205
11.5 Starburst企業(yè)版Presto 208
11.6 其他集成案例 208
11.7 自定義集成 209
第 12章 生產(chǎn)環(huán)境中的Presto 211
12.1 使用Presto Web UI監(jiān)控 211
12.1.1 集群級的細節(jié) 212
12.1.2 查詢列表 213
12.1.3 查詢細節(jié)視圖 215
12.2 Presto SQL查詢調(diào)優(yōu) 221
12.3 內(nèi)存管理 223
12.4 任務(wù)并發(fā)性 226
12.5 工作節(jié)點調(diào)度 227
12.5.1 根據(jù)任務(wù)或節(jié)點調(diào)度切片 227
12.5.2 本地調(diào)度策略 227
12.6 網(wǎng)絡(luò)數(shù)據(jù)交換 228
12.6.1 并發(fā)性 228
12.6.2 緩沖區(qū)大小 228
12.7 JVM調(diào)優(yōu) 228
12.8 資源組 230
12.8.1 資源組的定義 231
12.8.2 調(diào)度策略 232
12.8.3 選擇器規(guī)則定義 233
12.9 小結(jié) 233
第 13章 真實世界的案例 234
13.1 部署和運行時平臺 234
13.2 集群規(guī)!235
13.3 Hadoop/Hive遷移的使用場景 237
13.4 其他數(shù)據(jù)源 237
13.5 用戶和流量 237
13.6 小結(jié) 238
第 14章 總結(jié) 239
關(guān)于作者 240
關(guān)于封面 240