Presto技术内幕

Presto技术内幕 pdf epub mobi txt 电子书 下载 2025

JD-Presto 研发团队 著
图书标签:
  • Presto
  • 分布式SQL查询引擎
  • 大数据分析
  • 高性能查询
  • Trino
  • 数据联邦查询
  • OLAP
  • 数据仓库
  • 开源
  • 技术内幕
  • SQL优化
想要找书就要到 静思书屋
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 电子工业出版社
ISBN:9787121285639
版次:1
商品编码:11906548
品牌:Broadview
包装:平装
开本:16开
出版时间:2016-06-01
用纸:胶版纸

具体描述

产品特色

编辑推荐

  《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


《Presto技术内幕》是一本深入剖析Presto(现名为Trino)这一分布式SQL查询引擎底层设计、实现原理与优化实践的著作。本书旨在为读者提供一个全面而深刻的视角,理解Presto如何高效地处理PB级别数据的查询,以及支撑其强大能力的各项关键技术。 第一部分:Presto的基石——架构与核心组件 在数据爆炸式增长的时代,如何快速、高效地从海量数据中提取有价值的信息,成为企业面临的普遍挑战。传统的单机数据库在面对如此规模的数据时,往往力不从心。分布式查询引擎应运而生,而Presto(Trino)便是其中一颗璀璨的明星。本书的第一部分,将带领读者从宏观层面认识Presto的整体架构,解构其核心组件,为后续深入的技术探讨打下坚实基础。 分布式查询引擎的必要性与挑战: 在深入Presto之前,有必要回顾一下为什么需要分布式查询引擎。本书将首先阐述单机数据库在面对大数据量时的性能瓶颈,以及分布式计算的优势。同时,也会点明分布式查询引擎所面临的核心挑战,例如数据倾斜、网络延迟、节点故障、查询调度与执行的复杂性等,为理解Presto的设计动机提供背景。 Presto的整体架构剖析: Presto采用Master-Worker(或Coordinator-Worker)的分布式架构。本章将详细解析这一架构中的各个关键节点: Coordinator(协调节点): 负责接收SQL查询,进行语法解析、语义分析,生成查询计划,并将查询计划分发给Worker节点执行。它还负责收集Worker节点的结果,并最终返回给用户。本书将深入探讨Coordinator在查询优化、任务调度、资源管理等方面的作用。 Worker(工作节点): 负责实际的数据处理和计算。Worker节点从数据源读取数据,执行查询计划中的计算任务,并将中间结果传递给其他Worker节点或返回给Coordinator。本书将分析Worker节点如何在多核CPU、本地内存和磁盘上高效执行查询任务。 Connector(连接器): Presto的核心优势之一在于其强大的连接器机制,允许连接到各种不同的数据源,如HDFS、S3、Kafka、关系型数据库(MySQL, PostgreSQL)、NoSQL数据库(Cassandra)等。本书将详细介绍Connector的设计理念,以及如何通过Connector实现数据源的抽象,使得Presto能够统一查询来自异构数据源的数据,而无需提前进行数据迁移。 查询执行生命周期: 本章将以一个实际的SQL查询为例,详细追踪查询从提交到最终返回结果的整个生命周期。这包括: 查询解析(Parsing): SQL语句被解析成抽象语法树(AST)。 查询优化(Optimization): AST经过一系列优化规则转换,生成优化的查询计划。 查询分发(Distribution): 优化后的查询计划被分发给Worker节点。 任务执行(Execution): Worker节点并行执行查询计划中的各个计算阶段。 结果收集(Collection): Coordinator节点收集Worker节点的结果。 结果返回(Return): 最终结果返回给用户。 本书将重点关注查询优化阶段的关键技术,以及查询执行过程中任务的调度与协调机制。 内存管理与垃圾回收: 在分布式系统中,内存管理是至关重要的。本书将深入探讨Presto的内存管理策略,包括内存分配、内存回收、以及如何在有限的内存资源下高效地处理大量数据。我们将分析Presto如何利用JVM的垃圾回收机制,以及针对大数据场景可能遇到的GC问题和优化方法。 第二部分:查询优化的艺术——深度探索Presto的查询优化器 高效地执行查询是Presto的核心竞争力。其强大的查询优化器是实现这一目标的关键。本部分将深入剖析Presto的查询优化器,理解其如何分析查询语句,并生成最优的执行计划,从而最大限度地提升查询性能。 查询计划的表示: Presto使用一种基于Operator Tree(算子树)的数据结构来表示查询计划。本书将详细介绍各种算子(如Scan, Filter, Project, Join, Aggregation, Sort等)的功能和作用,以及它们如何组合成复杂的查询计划。 基于成本的优化(CBO): Presto的查询优化器采用基于成本的优化(CBO)策略。这意味着它会为不同的查询计划估算执行成本,并选择成本最低的计划。本书将深入讲解CBO的工作原理,包括: 统计信息收集: CBO依赖于精确的数据统计信息,如表的大小、列的基数、数据的分布等。本书将讨论Presto如何获取和维护这些统计信息,以及统计信息的准确性对优化效果的影响。 成本模型: Presto使用一个成本模型来估算算子和整个查询计划的执行成本。本书将分析Presto的成本模型,包括I/O成本、CPU成本、网络成本的估算方法。 优化规则: Presto内置了一系列优化规则,例如谓词下推(Predicate Pushdown)、列裁剪(Column Pruning)、常量折叠(Constant Folding)、 Join Reordering(连接顺序重排)等。本书将详细讲解这些优化规则的原理,以及它们如何被应用于生成更优的查询计划。 逻辑优化与物理优化: 查询优化过程通常分为逻辑优化和物理优化两个阶段。本书将区分这两个阶段,并分别阐述Presto在每个阶段的优化策略。 逻辑优化: 主要关注查询逻辑的等价变换,而不考虑具体的执行硬件。例如,将Filter操作下推到Scan操作之前,以减少扫描的数据量。 物理优化: 在逻辑优化之后,根据具体的硬件环境和数据特性,选择最优的物理执行策略。例如,选择哪种Join算法(Hash Join, Sort-Merge Join, Broadcast Join),以及如何并行执行算子。 数据倾斜处理: 数据倾斜是大数据查询中一个普遍存在的性能瓶颈。本书将重点分析Presto如何识别和处理数据倾斜,例如通过调整Join策略、进行局部聚合、动态调整分区大小等技术来缓解数据倾斜带来的性能影响。 特有的优化技术: 除了通用的查询优化技术,本书还将挖掘Presto在特定场景下的优化策略,例如对星型和雪花型数据模型的优化、针对流式数据源的查询优化等。 第三部分:底层实现与高可用——深入Presto的内部机制 本部分将带领读者深入Presto的底层实现,理解其如何高效地进行数据读取、计算、Shuffle以及如何保证系统的稳定运行。 数据读取与处理: Presto如何从不同的数据源高效地读取数据?本书将深入研究Presto的IO层,包括: Page(页)作为数据传输单元: Presto使用Page作为数据在Worker节点之间传输的基本单位,而非行。本书将分析Page的结构,以及它如何实现高效的数据压缩和批量处理。 Vectorized Execution(向量化执行): Presto采用了向量化执行技术,即一次处理一批数据(一个Page),而不是一次处理一行。本书将详细解释向量化执行的原理,以及它如何大幅提升CPU缓存命中率和计算效率。 编码与压缩: Presto支持多种数据编码和压缩格式,以减少存储空间和网络传输量。本书将介绍Presto支持的各种编码(如Dictionary Encoding, Run-Length Encoding)和压缩算法(如Snappy, Gzip),以及它们在不同场景下的适用性。 Shuffle(重分布)机制: 在分布式查询中,Shuffle是将中间结果按照Key进行分组的过程,这是许多复杂操作(如Join, Aggregation)的关键步骤。本书将深入分析Presto的Shuffle机制: Shuffle的原理与挑战: 讲解Shuffle的本质,以及它在网络传输、磁盘I/O方面带来的性能开销。 Presto的Shuffle实现: 详细介绍Presto的Shuffle实现方式,包括如何将中间结果写入本地磁盘,以及如何通过网络将数据传输到下游Worker节点。 Shuffle优化: 分析Presto在Shuffle过程中的优化手段,例如数据本地化、合并小的Shuffle文件等,以降低Shuffle的性能瓶颈。 跨节点通信与数据序列化: Presto的Worker节点之间需要进行频繁的通信来交换数据和控制信息。本书将探讨Presto的通信协议和数据序列化机制: Netty作为通信框架: Presto广泛使用Netty作为其底层网络通信框架。本书将介绍Netty在Presto中的应用,以及如何利用Netty实现高效的TCP通信。 数据序列化: Presto如何将内存中的数据结构序列化以便通过网络传输?本书将分析Presto使用的序列化技术,并讨论其优劣。 高可用性与容错机制: 在大规模分布式系统中,节点故障是不可避免的。Presto如何保证查询的可用性和数据的可靠性? Coordinator的HA: 介绍Presto如何实现Coordinator的高可用,以避免单点故障。 Worker节点的故障检测与恢复: 当Worker节点发生故障时,Presto如何检测到并进行相应的处理,例如任务的重试或重新调度。 查询的容错性: 分析Presto在查询执行过程中可能遇到的各种错误,以及其相应的容错策略,确保查询能够以最高的成功率完成。 资源管理与调度: Presto如何有效地管理计算资源,并将查询任务合理地分配给Worker节点?本书将探讨Presto的资源管理和调度机制,以及其在集群资源利用率方面的考量。 第四部分:实践与进阶——Presto的应用场景与未来发展 本书的最后一部分,将回归实践,探讨Presto在实际生产环境中的应用,并展望其未来的发展方向。 Presto在典型场景下的应用: 数据探索与即席查询: Presto非常适合用于快速地对海量数据进行探索性分析,回答业务人员的即席查询需求。 ETL与数据处理: Presto也可以作为一种强大的ETL工具,执行复杂的数据转换和处理任务。 数据湖上的交互式查询: Presto在查询存储在HDFS、S3等数据湖中的数据方面表现出色。 跨数据源的联邦查询: Presto能够无缝地连接多个数据源,实现跨数据库的联邦查询。 性能调优实战: 本章将结合实际案例,分享Presto的性能调优经验,包括: 查询语句的优化: 如何编写更优的SQL语句以获得更好的性能。 参数配置调优: Presto提供了丰富的配置参数,如何根据实际环境进行合理配置。 硬件选型与集群配置: 在部署Presto时,如何选择合适的硬件和配置集群以达到最佳性能。 监控与诊断: 如何利用Presto提供的监控工具来诊断性能问题。 Presto(Trino)社区与生态: 了解Presto背后的社区力量和不断发展的生态系统。本书将介绍Presto的开源社区,以及与其相关的项目和工具,例如Airflow、Superset等。 Presto的未来展望: 探讨Presto(Trino)未来的发展方向,例如在流式计算、机器学习集成、性能持续优化等方面的潜在演进。 通过以上四个部分的系统性阐述,《Presto技术内幕》将为读者提供一个全面、深入、实用的Presto学习体验。无论您是数据工程师、大数据架构师,还是对分布式计算和SQL查询引擎感兴趣的研究者,都能从中获得宝贵的知识和启发。本书的目标是帮助读者真正理解Presto的“内幕”,从而更好地利用它解决实际的大数据挑战。

用户评价

评分

评价三: 这本书给我的感觉,就像是一位经验丰富的导师,循循善诱地带领我走进Presto的广阔世界。它没有一开始就堆砌枯燥的理论,而是从一个宏观的视角切入,勾勒出Presto在整个大数据生态中的定位和价值。随后,便开始深入剖析其核心架构,从查询引擎的设计到数据源连接,再到执行计划的优化,每一步都讲解得细致入微。我印象特别深刻的是,作者在解释Presto的分布式查询能力时,并没有停留在表面,而是深入到各个组件的协同工作机制,以及如何克服网络延迟、数据倾斜等实际挑战。书中提供的案例分析,更是让我看到了Presto在实际生产环境中的强大应用,这些真实的场景,极大地提升了我学习的积极性,也让我对Presto的实际操作有了更清晰的认识。这本书的体系结构非常清晰,逻辑层次分明,读起来有一种顺畅到底的愉悦感,仿佛是在攀登一座知识的高峰,每一步都稳扎稳打,步步为营。

评分

评价一: 这本书的装帧设计着实令人眼前一亮,纸张的触感温润,印刷清晰,即使是深夜阅读,也不会感到眼睛疲劳。封面上“Presto技术内幕”几个大字,在素雅的底色映衬下,透露出一种沉静而深邃的力量,仿佛预示着即将展开一段引人入胜的技术探索之旅。我尤其喜欢书签带的设计,细节之处见真章,这小小的布条不仅方便了我随时标记阅读进度,更增添了一份仪式感,让翻阅的过程变得更加愉悦。打开书页,排版布局也十分合理,字里行间疏朗有致,没有丝毫拥挤感,阅读起来倍感舒适。即使是初次接触Presto技术的读者,也能感受到作者在细节上的用心,这种对品质的极致追求,无疑为后续的技术内容奠定了良好的阅读基础。这本书不仅仅是一堆技术术语的堆砌,更是一次精雕细琢的出版品,光是这份对细节的打磨,就足以让我对其中的内容充满期待。我毫不犹豫地将其摆放在书架最显眼的位置,每次拿起,都能感受到它散发出的那种沉甸甸的知识分量和作者的专业态度。

评分

评价五: 坦白说,在阅读《Presto技术内幕》之前,我对Presto的理解仅停留在“一个能做快速SQL查询的工具”这个层面。然而,这本书彻底颠覆了我的认知,让我看到了Presto背后深厚的技术积淀和精妙的设计。作者在讲解Presto的内存管理、垃圾回收机制时,那种深入骨髓的分析,让我对分布式系统中的资源调度有了全新的认识。我尤其惊叹于作者对于Presto如何处理海量数据、如何保证查询效率的细致阐述,这其中涉及到的分布式事务、一致性协议等内容,都讲解得鞭辟入里。这本书不仅让我掌握了Presto的使用技巧,更重要的是,它启发了我从更高的维度去理解和设计分布式查询系统。每一次翻阅,都能从中获得新的启发,仿佛每一次阅读都是一次思维的升华。我真心认为,这本书是所有对Presto技术感兴趣、或者正在从事相关工作的开发者,不可多得的宝贵财富,它将为你的技术生涯带来不可估量的价值。

评分

评价二: 从拿到《Presto技术内幕》这本书开始,我就被它那种严谨而又不失灵动的叙述风格深深吸引。作者的文字功底十分扎实,能够将复杂的技术概念,用通俗易懂的语言娓娓道来,即便是对于之前对Presto了解不深的读者,也能快速抓住核心要点。书中穿插的图表和示例代码,更是将抽象的理论具象化,让我在理解过程中事半功倍。我尤其欣赏作者在讲解某个技术特性时,总是能够追溯其演进的脉络,分析其背后的设计哲学,这样一来,我不仅知道“是什么”,更明白了“为什么”,这种深度和广度,是市面上很多技术书籍所不具备的。阅读过程中,我常常会停下来,反复咀嚼作者的论述,仿佛置身于一场关于Presto的深度对话。作者对于技术细节的把握,堪称炉火纯青,每一个概念的提出,每一个算法的解析,都力求精确,不含糊。这种精益求精的态度,让我在阅读的同时,也学到了如何严谨地进行技术思考和表达。

评分

评价四: 《Presto技术内幕》这本书的价值,绝不仅仅在于对Presto技术的知识罗列,更在于它所传达的解决问题的思路和工程实践的智慧。作者在书中常常会分享一些在实际项目中遇到的挑战,以及他们是如何运用Presto的特性来巧妙解决的。这些经验之谈,比单纯的技术讲解更能触及我的痛点,让我感受到作者的真诚和专业。尤其是在关于性能调优的部分,作者并没有给出所谓的“万能公式”,而是引导我理解不同场景下调优的侧重点,以及如何通过深入分析日志和监控数据来定位问题。这种培养独立思考和解决问题的能力,恰恰是我作为一名技术人员最为看重的。书中提及的各种配置参数和优化策略,更是为我在实际工作中提供了宝贵的参考,让我能够更自信地驾驭Presto。这本书就像一本技术宝典,里面蕴藏着无数的“秘籍”,等待着我去发掘和运用。

评分

东西还不错,一直在京东买东西

评分

书不错,开始学习啊,希望有干货!

评分

送货很快包装很好赞一个

评分

这本书特别的薄,特别特别不好,感觉价格是79块钱,有点贵,也不是做活动,可能不会买

评分

确实是一本好书

评分

速度快,东西好,非常不错啊

评分

东西比较系统齐全,只是有些东西已经更新了

评分

还没看,目录不错,应该值得看。

评分

未来的日子就靠你了,

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.idnshop.cc All Rights Reserved. 静思书屋 版权所有