産品特色
編輯推薦
《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 中均含有一個或者多個Task,在這裏我們約定:按照數據的流嚮,越靠近數據源的 Task 越處於上遊,越遠離數據源的 Ta越處於下遊。
6. Driver
一個 Task 包含一個或者多個 Driver。一個 Driver 其實就是作用於一個 Split 的一係列Operator 的集閤。因此一個 Driver 用於處理一個 Split,並且生成相應的輸齣,這些輸齣由Task 收集並且傳送給其下遊 Stage 中的一個 Task。一個 Driver 擁有一個輸入和一個輸齣。
7. Operator
一個 Operator 代錶對一個 Split 的一種操作,例如過濾、加權、轉換等。一個 Operator依次讀取一個 Split 中的數據,將 Operator 所代錶的計算和操作作用於 Split 的數據上,並産生輸齣。每個 Operator 均會以 Page 為最小處理單位分彆讀取輸入數據和産生輸齣數據。Operator 每次隻會讀取一個 Page 對象,相應地,每次也隻會産生一個 Page 對象。
8. Split
Split 即分片。一個分片其實就是一個大的數據集中的一個小的子集。而 Driver 則是作用於一個分片上的一係列操作的集閤,而每個節點上運行的 Task,又包含多個 Driver,從而一個 Task 可以處理多個 Split。其中每一種操作均由一個 Operator 錶示。分布式查詢執行計劃的源 Stage( Source Stage)通過 Connector 從數據源獲得多個分片。Source Stage 對 Split處理完畢之後,會將輸齣傳遞給其下遊 Stage (通常其下遊 Stage 的類型為 Fixed 或者 Single)。
當 Presto 執行一個查詢的時候,首先會從 Coordinator 得到一個錶對應的所有 Split。然後 Presto 就會根據查詢執行計劃,選擇閤適的節點運行相應的 Task 處理 Split。
……
前言/序言
序言 1
12 年來,京東一直以開源技術作為構建自身核心技術體係的基礎,在開源領域深耕多年,積極推動行業分享與交流。 JD-Presto 是京東首個貢獻於開源社區的軟件産品,開創瞭京東迴饋開源社區的先河。
一年前, JD-Presto 研發團隊是京東眾多研發團隊中的普通一員,時至今日,他們已成長為京東負有盛名的研發團隊之一。一年來,他們忍受著孤獨與寂寞,麵對著無數睏難與挫摺,但他們從未放棄,憑著對技術的熱愛、對信念的堅守、對優秀産品的執著追求,勇敢麵對睏難與挑戰,曆盡艱辛,終於迎來勝利的曙光。目前 JD-Presto 在京東內部已成功應用於精準營銷、安全識彆、商傢後颱、財務報錶等十多個生産係統。京東為擁有 JD-Presto研發團隊而驕傲!
與書店裏的 Hadoop 書籍不同的是,本書是市麵上第一本詳細介紹 Presto 的書籍。它由淺入深地詳細介紹瞭 Presto 的安裝過程、內部運行原理機製、功能特性、性能優化方法,以及在應用過程中常見的問題及解決方案等,同時詳細介紹瞭 JD-Presto 版本的許多新功能及其適用的業務場景。這些功能的成功研發,使得 JD-Presto 版本不僅可用於離綫大數據分析計算來提升性能,還可用於多種數據源混閤進行實時大數據分析計算,使一些使用其他大數據技術不能解決的業務場景有瞭一個全新有效的解決方案。同時,他們維護著 Presto在中國社區的建設,鼓舞著和培養瞭一群 Presto 的愛好者。
今天,國內已有越來越多的技術人員與公司在使用 JD-Presto 版本,相信本書能對讀者學習和使用 JD-Presto 版本提供很大的幫助。本書不僅僅滿足瞭初學者對技術書籍的渴求,也適閤對 JD-Presto版本有一定使用經驗的人員學習參考使用。希望它能成為你在 Presto 技術旅程中的一個朋友,點亮你前進的道路。
張晨
京東集團 CTO
序言 2
記得我剛加入京東的時候, Hadoop 的集群建設方興未艾,大數據計算紛紛被轉到Hadoop 中進行處理。然而,以前做數據挖掘的同學並不十分精通 Java 語言。他們更擅長於業務和 SQL 語言。為瞭讓他們的工作更有效率、更得心應手,有必要找尋一個像 GoogleDremel 一樣,以 SQL 為驅動的交互式 Ad-hoc 查詢工具。於是我花瞭一些時間進行評估,包括 Hive、 Spark、 Impala 等, 後來 Facebook 剛開源不久的 Presto 便映入眼簾。 Presto 設計簡單精巧,可以處理海量數據,最大化地利用硬件性能,計算全部在內存中完成,很好地利用高速網絡來進行數據調度,其編碼風格一緻,易於掌握和改進。雖然在當時 Presto的數據源和 SQL 的支持度還有待豐富,但已經初步展示瞭發展的潛力,很適閤京東的應用。Presto 就這樣在京東找到瞭傢。 JD-Presto 研發團隊成員具有多年 JAVA 編程和分布式並行處理經驗,他們工作兢兢業業,在原先開源的基礎上,豐富瞭多種數據源的處理接口,並且通過對任務調度的追蹤和分析, 改進並提升瞭並行處理任務的吞吐量。我們積極和 Facebook的 Presto 團隊閤作,成為 Presto 在國內的首批貢獻者,建立並運行 Presto 的中國社區。我們也和 CSDN 的同仁建立瞭 Presto 的開發者論壇,在國內積極推廣,普及 Presto 知識,讓更多的開發人員受益。
京東是開源社區的受益者,也是開源開放文化的擁護者。我們將自己取得的點點滴滴毫無保留地迴饋於開源社區,與大傢共享,和大傢一起進步。為瞭更好地服務於對 Presto有興趣的研發人員,京東的同事們將平時工作中的積纍和認識編輯成書,奉獻給大傢,希望他們的努力有助於讀者學習和掌握 Presto。在此,我特彆感謝為此書齣版而辛勤工作的同事,他們是呂信、郭李明、袁安峰、孔雲龍、戴東東等人。
翁誌
京東集團首席技術顧問
序言 3
Presto is an open source, highly scalable, distributed SQL engine we developed at Facebook. Since releasing it two years ago, we have witnessed a tremendous amount of community interest and adoption. In the last twelve months, the Presto community has grown from technology firms in Silicon Valley to a broad variety of organizations worldwide. Today, NASDAQ, the second largest stock exchange in the United States, runs Presto to power their analytical use cases.
( Presto 是我們在 Facebook 開發的開源、高度可擴展的分布式 SQL 引擎。 Presto 在兩年前發布後,大量的社區開始關注和後續應用 Presto。在最近的 12 個月裏, Presto 社區已經一傢矽榖科技公司成長為全球性的生態圈,涵蓋一批多樣化的組織。如今,全美第二大證券交易所納斯達剋也在使用 Presto 來驅動他們的案例分析業務。)
As organizations adopt Presto, many are contributing back to it. Teradata, a leader in data warehousing technology, maintains a group of engineers who contribute to Presto. We have also collaborated with engineers at JD.com since 2014 to make Presto better. Presto earned an "Open Source Outstanding Project" award at the 2015 China Open Source World Summit.
(組織機構們不僅在應用 Presto,他們中的一部分也在迴饋 Presto。 Teradata,數據倉庫技術領域內的引領者之一,擁有一支專門為 Presto 貢獻力量的工程師團隊。從 2014 年起,我們與中國電商領域引領者京東公司的開發人員展開閤作,精益求精地打造 Presto 産品。隨後 Presto 在 2015 年“第十屆開源中國開源世界高峰論壇”上獲取“ 2015 COPU 開源優秀項目大奬”。)
We hope you will learn more about Presto through this book developed by engineersat JD.com, and we encourage you to work with the community to improve Presto.
(我們真誠地希望你通過這本由京東工程師們撰寫的書更深入地瞭解 Presto 引擎,也鼓勵並期待你攜手社區,改善 Presto 引擎。)
Jay Tang
Manager of Presto product, Big Data
前言
為什麼要寫這本書
相信很多軟件開發人員在遇到應用係統涉及需要多種數據源、多種字符集下的混閤計算時,都被數據的準確性和查詢性能所睏擾,一直以來都沒有一個有效的技術方案能解決這個問題。 2014 年 7 月,京東 CTO 體係首席技術顧問翁誌先生把 Presto 引入京東,數據準確性驗證錶明, Presto 在多種數據源、多種字符集下的混閤計算均錶現優異,數據準確性符閤財務標準。我們認識到, Presto 是一個非常優秀的産品,盡管它有許多不足,我們決心把它打造為一個介於 T+1 計算和生産實時報錶之間混閤計算的大數據産品,支持秒級、分鍾級獲取查詢結果、支持多並發的交互式 Ad-Hoc 查詢與分析。 Presto 是一個較為完美的大數據實時計算解決方案,而市麵上這類産品太少瞭,我們將經過生産環境驗證的 JD-Presto 版本源給業內使用,主導Presto 中國社區的推廣工作。應廣大 Presto 技術愛好者的要求,我們編寫瞭這本書,以幫助更多的初學者、大數據領域的從業者學習及使用 JD-Presto。和其他許多調研過 Presto 的部門或公司一樣,我們最初搭建的 Presto 測試集群在京東這種大數據量的環境下復雜計算任務幾乎運行不起來, JOIN 查詢也比較弱, 集群時常宕機。同時,在測試過程中我們也發現,與Spark、 Impala 相比, Presto 使用更為簡單、易用、高效,這讓我們深感振奮,一緻認為這個産品值得團隊花大力氣去研究和優化。因此,我們專門申請瞭上百颱高性能服務器來搭建性能測試集群環境, 隨後在幾百 TB 級數據量下進行大規模的測試與驗證, 完全證實瞭 Presto 的平均性能是 Hive 等離綫數據分析産品性能的 10倍,並且支持 ANSI 標準 SQL、數據源完全解耦等一係列優勢。在之後一年多的時間中,我們研發瞭眾多實用功能,著力修復瞭許多 Bug,大幅提升瞭 Presto 的查詢性能和並發執行性能,如重寫瞭數據庫驅動,使得 Presto 連接數據庫進行海量數據查詢的性能提升瞭幾百倍;優化瞭內存使用效率,使查詢性能對內存大小的依賴大幅降低;支持分布式數據庫的分庫分錶設計;優化數據存儲算法。通過上述一係列新功能的成功研發和對性能的大幅改進,使得 JD-Presto 的性能穩定是是 Hive 的 10 倍以上,是 Spark 的 3 倍以上,集群成本節省一半,在一個大規模的大數據集群中, 這種技術優勢可帶來顯著的經濟效益。
本書讀者對象
Java 研發工程師;
在大數據技術領域從業的研發工程師、運維工程師、架構師;
對大數據研究方嚮感興趣的大學老師和學生、以及大數據技術的入門學者;
從事海量數據分析應用的開發者、研究者。
如何閱讀本書
本書按照由淺入深的順序對大數據實時計算産品 Presto 進行瞭全方位的細緻講解,從基本的安裝部署與使用到源碼解析,以及根據實際業務需求進行新功能改造開發和性能優化。
若你從來沒有使用過 Presto,那麼完全可以按照由淺入深的順序從頭開始閱讀此書。
若你已經成功地使用瞭 Presto 一段時間,想要深入地瞭解 Presto 的設計思想並希望從源碼級彆瞭解 Presto 的實現思路,那麼可以直接從核心設計篇進行閱讀。
若你本來就是 Presto 的貢獻者,苦於 Presto 不能滿足你的實際業務問題,想要對 Presto進行功能改造但是還沒有明確的思路;又或者你在使用 Presto 的過程中發現其性能沒有達到你的預期,而又找不到優化的方案,那麼高級篇會給你提供一些建議。
在本書最後的附錄部分不僅對 Presto 使用過程中齣現的各種問題給齣瞭明確的解決方案,還對 Presto中的各個配置參數的含義和作用進行瞭詳細的說明並給齣瞭推薦配置值。
相信此書會為廣大大數據愛好者提供一個新的視角,思考並解決大數據相關問題。
勘誤和支持
由於作者水平和能力有限,編寫時間倉促,本書存在不妥之處在所難免,我們真誠希望同行和廣大讀者朋友們不吝賜教。另外,如果你有關於JD-Presto 的任何問題,可以加入我們的QQ群:141254058,與我們在綫交流,或者訪問網站: http://prestodb-china.com/,期待你的反饋意見,我們將不勝感激。
緻謝
感謝現任京東 CTO 體係首席技術顧問、信息安全部、京東矽榖研發中心負責人翁誌先生,在産品研發和推廣使用的過程中給予瞭我們極大的支持和鼓勵。同時在本書齣版的過程中,從選題、審稿到齣版無不得到他的熱心幫助,在此緻以深深的謝意!
感謝京東雲平颱——數據研發運營部的負責人樊建剛先生給予我們充分的授權和支持,他鼓勵我們將産品開源、組建技術交流群和中文社區,使得 JD-Presto 成為京東第一個開源的軟件産品,開創京東迴饋開源社區的先河。
感謝研發團隊的兄弟們,他們酷愛技術、注重團隊協作、深入理解客戶需求,能從一個較為全麵的角度考慮産品的架構設計與功能研發,這是産品成功的基石,也是最關鍵的因素。
迴首這一路的艱辛,無以錶達此時的心情,隻能說,兄弟們所做的一切都讓我心懷崇敬!
戴東東
2016