Presto技術內幕( 簡體 字) | |
作者:JD-Presto研發團隊 | 類別:1. -> 程式設計 -> 綜合 |
出版社:電子工業出版社 | 3dWoo書號: 44701 詢問書籍請說出此書號! 有庫存 NT售價: 345 元 |
出版日:7/1/2016 | |
頁數:312 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787121285639 | 加入購物車 │加到我的最愛 (請先登入會員) |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
第一部分 基礎篇
第 1 章 概述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 Connector169 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 Presto是專門為大數據實時查詢計算而設計和開發的產品。由于Presto是基于Java語言開發的, 因此,對使用者和開發者而言, Presto極易學習、使用并針對特定的業務場景進行改造開發和性能 優化。無論是對多數據源支持,還是高性能、易用性、可擴展性等方面, Presto都是大數據實時查 詢計算產品中的佼佼者。 本書按照由淺入深的順序對Presto進行了全方位的細致講解,具體內容包括Presto概述、 Presto安裝與部署、 Presto RESTful框架解析、提交查詢、生成查詢執行計劃、查詢調度、查詢執行、隊列、System Connector、 Hive Connector、 Kafka Connector、 Connector開發、 Functions開發、 JD-Presto功能改造、 Presto性能調優、 Presto應用場景。 本書對Java研發工程師,在大數據技術領域從業的研發工程師、運維工程師、架構師,對大數 據研究方向感興趣的大學老師和學生、以及大數據技術的入門學者,從事海量數據分析應用的開發 者、研究者都有很強的參考價值。
序言 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, Facebook |