随着各行各业对大数据实时查询的需求持续增长,数据查询及分析引擎正变得不可或缺。Presto是由Facebook开源的高性能分布式SQL查询引擎,其用户包括Netflix、Airbnb、LinkedIn、Twitter、Uber等知名公司。本书由Presto的核心开发人员参与撰写,教你系统地学习Presto的用法。书中内容涵盖Presto的安装、设计理念、查询操作、最佳实践、与主要云平台的结合等。本书分为三大部分:第一部分介绍Presto的基础知识;第二部分更进一步,介绍Presto架构、集群部署、与数据源的连接等;第三部分讲解安全配置以及Presto的实际用例。你可以通过本书学会针对不同的数据源快速执行交互式SQL数据分析,并利用Presto管理和使用海量数据。
1.Presto是由Facebook开源的高性能分布式SQL查询引擎,其用户包括Netflix、Airbnb、LinkedIn、Twitter、Uber等知名公司。
2.作为高性能分布式SQL查询引擎,Presto能够针对不同的数据源高效、快速地执行交互式分析。大数据的兴起使得数据存储机制多样化。面对标准不一的存储系统,你可以利用Presto轻松打破壁垒,连通数据孤岛。
3.本书由Presto项目创始成员参与执笔。你将学会用简单的Presto语句快速查询多个数据源,把握SQL-on-Anything的精髓。在任何规模、任何存储系统、任何环境中,你都能发挥SQL的威力。
- 入门:探索Presto的用例,学习安装、配置和使用Presto。
- 进阶:深入理解Presto的架构,学习连接器实例和SQL高级特性。
- 实践:了解如何在生产环境中使用Presto,保证安全性,与其他工具集成。
马特·富勒(Matt Fuller)
Starburst公司联合创始人。
曼弗雷德·莫泽(Manfred Moser)
开源社区拥护者、技术作家、培训师,Starburst公司软件工程师。
马丁·特拉韦尔索(Martin Traverso)
Presto项目创始成员,Presto软件基金会联合创始人,Starburst公司首席技术官。
【译者简介】
张晨
毕业于上海交通大学,热爱大数据技术、数据库、分布式系统和函数式编程,现于Indeed东京担任软件工程师。
黄鹏程
毕业于北京邮电大学,专注于数据库和大数据平台的开发与架构工作。曾就职于中国民生银行,担任大数据基础架构团队负责人。现任阿里云高级产品专家,负责阿里云数据库相关产品的设计与规划工作。
傅宇
毕业于南京大学,专注于数据库技术,现任阿里云技术专家,担任PolarDB-X云原生分布式数据库内核研发工作,熟悉分布式事务、查询优化器和执行器,对大数据领域充满热情。
译者序 xv
序 xvii
前言 xix
第 一部分 Presto 入门
第 1章 Presto 介绍 3
1.1 大数据带来的问题 3
1.2 Presto来救场 4
1.2.1 为性能和规模而生 5
1.2.2 SQL-on-Anything 5
1.2.3 存储与计算分离 6
1.3 Presto使用场景 6
1.3.1 单一的SQL分析访问点 7
1.3.2 数据仓库和数据源系统的访问点 7
1.3.3 提供对任何内容的SQL访问 8
1.3.4 联邦查询 9
1.3.5 虚拟数据仓库的语义层 9
1.3.6 数据湖查询引擎 9
1.3.7 SQL转换和ETL10
1.3.8 更快的响应带来更好的数据见解 10
1.3.9 大数据、机器学习和人工智能 10
1.3.10 其他使用场景 11
1.4 Presto 资源 11
1.4.1 官方网站 11
1.4.2 文档 12
1.4.3 社区交流 12
1.4.4 源代码、许可证和版本 12
1.4.5 贡献 12
1.4.6 本书资源 13
1.4.7 鸢尾花数据集 13
1.4.8 航班数据集 14
1.5 Presto简史 14
1.6 小结 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 添加数据源 20
2.4 运行Presto 21
2.5 小结 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 执行查询 25
3.1.6 输出格式 26
3.1.7 忽略错误 26
3.2 Presto JDBC驱动 27
3.2.1 下载和注册驱动 28
3.2.2 创建到Presto的连接 29
3.3 Presto与ODBC 31
3.4 客户端库 31
3.5 Presto Web UI 31
3.6 使用Presto执行SQL 32
3.6.1 概念 33
3.6.2 入门案例 33
3.7 小结 36
第二部分 深入理解Presto
第4章 Presto的架构 39
4.1 集群中的协调器和工作节点 39
4.2 协调器 41
4.3 节点发现服务 41
4.4 工作节点 42
4.5 基于连接器的架构 42
4.6 catalog、schema和表 43
4.7 查询执行模型 44
4.8 查询优化 47
4.8.1 解析和分析 48
4.8.2 初始查询计划 49
4.9 优化规则 50
4.9.1 谓词下推 51
4.9.2 Cross Join 消除 51
4.9.3 TopN 52
4.9.4 局部聚合 52
4.10 实现规则 53
4.10.1 Lateral Join 去关联化 53
4.10.2 Semi-join(IN)去关联化 54
4.11 基于代价的优化器 55
4.11.1 代价的概念 55
4.11.2 Join的代价 57
4.11.3 表统计信息 57
4.11.4 过滤统计信息 58
4.11.5 分区表的统计信息 59
4.11.6 Join枚举 60
4.11.7 广播Join和分布式Join 60
4.12 使用表统计信息 62
4.12.1 Presto的ANALYZE 命令 62
4.12.2 在写入存储时收集数据 63
4.12.3 Hive的ANALYZE 命令 63
4.12.4 显示表统计信息 63
4.13 小结 64
第5章 生产环境部署 65
5.1 配置细节 65
5.2 服务端配置 65
5.3 日志 66
5.4 节点配置 67
5.5 JVM配置 68
5.6 启动器 69
5.7 集群安装 70
5.8 使用RPM安装 72
5.8.1 安装目录结构 72
5.8.2 配置 73
5.8.3 卸载Presto 73
5.9 在云上安装 73
5.10 集群规模的考量 74
5.11 小结 74
第6章 连接器 75
6.1 配置 76
6.2 RDBMS连接器示例:PostgreSQL 76
6.2.1 查询下推 78
6.2.2 并行性和并发性 79
6.2.3 其他RDBMS连接器 80
6.2.4 安全性 81
6.3 Presto TPC-H和TPC-DS连接器 81
6.4 用于分布式存储数据源的Hive 连接器 82
6.4.1 Apache Hadoop和Hive 82
6.4.2 Hive连接器 83
6.4.3 Hive式表格式 85
6.4.4 内部表与外部表 85
6.4.5 分区数据 87
6.4.6 加载数据 88
6.4.7 文件格式和压缩 90
6.4.8 MinIO示例 91
6.5 非关系数据源 91
6.6 Presto JMX 连接器 92
6.7 黑洞连接器 94
6.8 内存连接器 94
6.9 其他连接器 95
6.10 小结 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 流式系统连接器示例: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 总结 108
7.6 Presto中的联邦查询 108
7.7 ETL和联合查询 114
7.8 小结 114
第8章 在Presto中使用SQL 115
8.1 Presto语句 116
8.2 Presto系统表 118
8.3 catalog 120
8.4 schema 120
8.5 Information Schema 121
8.6 表 122
8.6.1 表和列属性 124
8.6.2 复制现有的表 125
8.6.3 从查询结果中新建表 126
8.6.4 修改表 127
8.6.5 删除表 127
8.6.6 连接器对表操作的限制 127
8.7 视图 128
8.8 会话信息和配置 128
8.9 数据类型 129
8.9.1 集合数据类型 131
8.9.2 时态数据类型 132
8.9.3 类型转换 135
8.10 SELECT语句基础 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 从表中删除数据 147
8.20 小结 147
第9章 高级SQL特性 148
9.1 函数和运算符介绍 148
9.2 标量函数和运算符 149
9.3 布尔运算符 150
9.4 逻辑运算符 151
9.5 用BETWEEN语句选择范围 152
9.6 用IS(NOT) NULL检测值的存在 152
9.7 数学函数和运算符 152
9.8 三角函数153
9.9 常数和随机函数 154
9.10 字符串函数和运算符 154
9.11 字符串和映射 155
9.12 Unicode 156
9.13 正则表达式 158
9.14 解嵌套复杂数据类型 160
9.15 JSON函数 161
9.16 日期和时间函数及运算符 161
9.17 直方图 164
9.18 聚合函数 165
9.18.1 映射聚合函数 165
9.18.2 近似聚合函数 167
9.19 窗函数 168
9.20 lambda表达式 169
9.21 地理空间函数 170
9.22 Prepared Statement 171
9.23 小结 173
第三部分 Presto的实际应用
第 10章 安全 177
10.1 认证 178
10.2 授权 181
10.2.1 系统访问控制 181
10.2.2 连接器访问控制 184
10.3 加密 186
10.3.1 加密Presto客户端与协调器之间的通信 188
10.3.2 创建Java keystore和Java truststore 190
10.3.3 在Presto集群内加密通信 192
10.4 CA与自签名证书 193
10.5 证书认证 194
10.6 Kerberos 197
10.6.1 前提条件 198
10.6.2 Kerberos客户端认证 198
10.6.3 集群内部Kerberos 198
10.7 数据源访问和安全配置 199
10.8 使用Hive连接器进行Kerberos验证 200
10.8.1 Hive Metastore Thrift服务认证 201
10.8.2 HDFS认证 201
10.9 集群分离 202
10.10 小结 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企业版Presto 208
11.6 其他集成案例 208
11.7 自定义集成 209
第 12章 生产环境中的Presto 211
12.1 使用Presto Web UI监控 211
12.1.1 集群级的细节 212
12.1.2 查询列表 213
12.1.3 查询细节视图 215
12.2 Presto SQL查询调优 221
12.3 内存管理 223
12.4 任务并发性 226
12.5 工作节点调度 227
12.5.1 根据任务或节点调度切片 227
12.5.2 本地调度策略 227
12.6 网络数据交换 228
12.6.1 并发性 228
12.6.2 缓冲区大小 228
12.7 JVM调优 228
12.8 资源组 230
12.8.1 资源组的定义 231
12.8.2 调度策略 232
12.8.3 选择器规则定义 233
12.9 小结 233
第 13章 真实世界的案例 234
13.1 部署和运行时平台 234
13.2 集群规模 235
13.3 Hadoop/Hive迁移的使用场景 237
13.4 其他数据源 237
13.5 用户和流量 237
13.6 小结 238
第 14章 总结 239
关于作者 240
关于封面 240