导图社区 Presto思维导图
Presto是Facebook开发的数据查询引擎,可对250PB以上的数据进行快速地交互式分析。下图梳理了Presto入门、深入了解、实际应用等方面,需要的收藏下图学习吧!
编辑于2021-07-22 16:21:18presto
入门
介绍
大数据带来的问题
数据存储机制日益多样
采集越来越多的数据
数据分散在各个孤岛上
Presto来救场
为性能和规模而生
SQL-on-Anything
存储与计算分离
Presto使用场景
单一的SQL分析访问点
数据仓库和数据源系统的访问点
提供对任何内容的SQL访问
联邦查询
虚拟数据仓库的语义层
数据湖查询引擎
SQL转换和ETL
更快的响应带来更好的数据见解
Presto 更快的处理速度带来了更好的数据分析和结果
大数据、机器学习和人工智能
Presto资源
官方网站
文档
社区交流
源代码、许可证和版本
贡献
Presto简史
Facebook 于 2008 年开源了 Hive
2012 年,4 个 Facebook 工程师开始研发 Presto
2016 年,Amazon 发布了以 Presto 作为主要基石的 Athena 服务
2017 年,Starburst 横空出世,它是一家专门推广 Presto 的公司
2018 年末,Presto 的创始人离开 Facebook,成立了 Presto 软件基金会,以使该项目保持协作与独立。自那时起,Presto 的创新和增长速度都更上一层楼。
安装和配置
使用Docker容器尝试Presto
使用归档文件安装
安装
https://repo.maven.apache.org/maven2/io/prestosql/presto-server
配置
日志配置
节点配置
JVM 配置
添加数据源
数据源配置为 catalog
可以通过在 etc/catalog 目录下创建一个 catalog 属性文件来注册 catalog
使用 TPC-H 连接器探索 Presto
要配置 TPC-H 连接器,需要创建一个 catalog 属性文件etc/catalog/tpch.properties,并将连接器配置为 tpch
运行Presto
run 命令将 Presto 启动为前台进程
可以使用 Ctrl-C 组合键结束服务器进程
使用
Presto CLI
使用入门
版本的列表:https://repo.maven.apache.org/maven2/io/prestosql/presto-cli。
CLI 连接到运行在 http://localhost:8080 上的 Presto 服务端
查看数据源:show catalog
查看表:show schema from
分页
查询的结果将使用精心配置好的 less 程序分页。你可以通过将环境变量 PRESTO_PAGER 设置为另一个程序的名称(如 more)来覆盖这一行为,或将其置为空来彻底禁用分页。
命令历史
你可以使用上下箭头键来滚动浏览这些历史,也可以使用 Ctrl-S 组合键和 Ctrl-R 组合键来查询历史。要再次执行一条查询,只需按回车键即可。
Presto 的命令历史保存在 ~/.presto_history 文件中,你可以使用 PRESTO_HISTORY_FILE 环境变量来修改默认值
额外诊断
Presto CLI 提供了 --debug 选项来打开运行查询时的调试信息输出。
执行查询
使用 --execute 选项
--catalog 和 --schema 选项来避免使用完全限定符
CLI 中使用 -f 选项执行该文件中的命令
分号分隔不同的查询语句,你可以一次执行多个查询。
输出格式
--output-format 选项来控制
可用的选项有 ALIGNED、VERTICAL、CSV、TSV、CSV_HEADER、TSV_HEADER 和 NULL,默认值是 CSV。
忽略错误
--ignore-error
Presto JDBC驱动
下载 JDBC 驱动。
将 JDBC 驱动放置在应用 classpath 的覆盖范围之内。
配置 JDBC 驱动
配置 Presto 连接
连接 Presto 并开始使用
Presto与ODBC
目前 Presto 没有开源的 ODBC 驱动可用
客户端库
Python、C、Go、Node.js、R、Ruby 等语言开发的库
Presto Web UI
使用Presto执行SQL
概念
连接器
使 Presto 适配一个数据源。每一个 catalog 对应于一个特定的连接器
catalog
定义连接到一个数据源的细节。它包含了 schema 并配置了一个连接器来使用。
schema
组织表的一种方式。catalog 和 schema 一起定义了一个集合的表,这些表可以查询。
表
表是无序的行的集合。这些行内容被组织成带有数据类型的有名称的列。
入门案例
实际应用
安全
需要安全保障的 Presto 网络连接
认证
密码认证和LDAP认证
基于 LDAP 服务的 LDAP 验证器
使用外部 LDAP 服务对 Presto 进行 LDAP 认证
password-authenticator.properties
授权
access-control.properties
Presto 允许经过认证的所有用户做任何事情
只允许任何读取数据或元数据的操作。这包括SELECT 查询,但不包括 CREATE、INSERT 和 DELETE 查询
基于文件的访问控制
security.config-file
系统访问控制对于限制访问是非常有用的。但是,它们只能在catalog 级配置访问权限,不能用于配置更细粒度的访问权限
连接器访问控制
通过连接器访问控制,Presto 允许你在 catalog 中配置细粒度的权限
SELECT
INSERT
DELETE
每个连接器都需要实现ConnectorAccessControl 来支持这个标准 SQL 功能
使用角色来管理权限
加密
数据传输中的加密场景
静态数据的加密场景
加密Presto客户端与协调器之间的通信
在 Presto 客户端和 Presto 协调器之间通过 HTTPS 进行安全通信
用于HTTPS通信的配置属性
config.properties
创建Java keystore和Java truststore
Java 中的 keytool 是用于创建和管理 keystore 和 truststore 的命令行工具,作为 Java 开发工具包(JDK)的一部分供用户使用
创建 Presto 协调器使用的 keystore
导出证书
创建 truststore
证书连接
在Presto集群内加密通信
Presto 集群中节点之间通过 HTTPS 进行安全通信
config.properties 中启用 HTTPS
config.properties 中设置http-server.http.enabled=false 来禁用 HTTP;否则,用户仍可以使用 HTTP 连接到集群
CA与自签名证书
Presto 使用由 CA 签发的证书
创建一个包含中间证书和根证书的 truststore
继续从链上导入所有必要的中间证书
证书认证
Presto 客户端的证书认证
配置 Presto 协调器进行相互 TLS 认证
config.properties
向协调器提供客户端证书进行相互认证
在客户端上创建 keystore
对于证书认证,Presto 会从 X.509 证书中提取主体的专有名称。这个值作为安全主体与用户名进行比较。除非在 CLI 中使用 ---user 选项明确指定,否则用户名默认为操作系统的用户名
Kerberos
前提条件
Kerberos 需要在 Presto 协调器上配置,该协调器需要能够连接到 Kerberos密钥分发中心(key distribution center,KDC
Kerberos客户端认证
启用
集群内部Kerberos
设置协调器的 Kerberos 主机名,指定 Kerberos 配置文件 krb5.conf 的所在位置
内部通信指定有效的 Kerberos 凭证并启用它
数据源访问和安全配置
影响用户数据的数据源安全配置
使用Hive连接器进行Kerberos验证
Hive Metastore Thrift服务认证
启用 Kerberos 认证
HDFS认证
集群分离
通过在相互独立的 Presto 集群上使用数据源和配置 catalog,实现它们的完全分离
将只读操作从 ETL 和其他写操作的场景中分离出来
其它工具集成
使用Apache Superset进行查询、可视化和更多操作
在这两个系统都启动并运行后,你只需要在 Superset 中将 Presto 配置成一个数据库即可
使用RubiX提高性能
来自 Qubole 的轻量级数据缓存框架 RubiX 作为缓存层,可以放在 Presto计算资源和数据源之间。它支持磁盘缓存和内存缓存。在查询分布式存储系统时,因为避免了数据传输和对底层数据源的重复查询,所以使用这个开源平台可以提升性能并降低成本
使用Apache Airflow的工作流
嵌入式Presto示例:Amazon Athena
Amazon Athena 架构概览
Starburst企业版Presto
其他集成案例
自定义集成
插件可以增加一些功能,如连接到其他数据源的连接器、事件监听器、访问控制、自定义类型和用户自定义函数等,可用于查询语句
使用 Presto CLI 或 Presto JDBC 驱动进行简单的集成
生产环境使用
使用Presto Web UI监控
Presto Web UI 的主仪表盘
集群级的细节
运行中的查询
Presto 集群中当前正在运行的查询总数
队列中的查询
Presto 集群中所有用户在队列中等待的查询总数。基于资源组的配置,协调器调度在队列中等待的查询。
阻塞的查询
集群中阻塞的查询总数。由于缺少必要的切片或其他资源,阻塞的查询无法继续执行。在接下来的章节里,你会了解更多有关查询状态的知识
活动的工作节点
集群中活动的工作节点的数量。通过手动或自动扩展添加或删除任何工作节点时,这些节点都会注册到发现服务上,因此显示的数字会据此更新
可运行的驱动
集群中可运行的驱动的平均数
保留内存
Presto 中所有保留内存的量,以字节为单位
行每秒
集群上运行着的所有查询每秒处理的总行数
字节每秒
集群上运行着的所有查询每秒处理的总数据量,以字节为单位
工作节点并行度
工作节点的并行度总量,也就是集群中所有查询运行时在所有工作节点上花费的线程 CPU 时间总量
查询列表
Presto Web UI 中的查询列表
文本输入框可以让你通过键入要使用的标准文本查找特定的查询
左边的控件允许你设定查询显示的顺序、当数据改变时重排序的时机和显示查询的最大数量
在查询管理控件下方的每一行都代表一个查询
左边的列显示查询的信息,右边的列显示查询的 SQL 文本和执行状态
用于特定查询的值阵列
查询状态
RUNNING(执行中)
FINISHED(已完成)
USERCANCELLED(用户取消)
USER ERROR(用户错误)
查询细节视图
概览
会话(Session)
执行(Execution)
资源利用概览(Resource Utilizations Summary)
时间线(Timeline)
查询(Query)
准备查询(Prepare Query)
Stages
TIME—SCHEDULED
在此 Stage 的所有任务完成前,它处于调度中状态的总时间。
TIME—BLOCKED
此 Stage 因等待数据而被阻塞的总时间。
TIME—CPU
此 Stage 中任务花费的总 CPU 时间
MEMORY—CUMULATIVE
运行此 Stage 所花费的累计内存总量。这个值并不意味着某一时刻Stage 使用了这么多的内存,它表示的是在处理过程中使用到的内存的累加量。
MEMORY—CURRENT
此 Stage 当前使用的总保留内存量。对于已完成的查询,这个值显示为0。
MEMORY—BUFFERS
当前等待处理的数据占用的内存量
MEMORY—PEAK
执行此 Stage 使用到的峰值总内存量。查询执行过程中的某些操作可能需要很多内存,因此了解峰值内存使用量非常有用
TASKS—PENDING
此 Stage 中处于等待状态的任务数量。查询结束后,这个值总是显示为0。
TASKS—RUNNING
此 Stage 正在执行的任务数量。查询结束后,这个值总是显示为 0。在查询执行时,这个值根据任务开始和完成的情况动态更新
TASKS—BLOCKED
此 Stage 中处于阻塞状态的任务数量。查询结束后,这个值总是显示为0。在查询执行时,这个值根据任务在阻塞和执行状态之间的切换情况动态更新。
TASKS—TOTAL
查询完成的总任务数量。
SCHEDULED TIME SKEW、CPU TIME SKEW、TASK SCHEDULEDTIME 和 TASK CPU TIME
这些直方图显示了调度时间、CPU 时间、任务调度时间和多工作节点多任务的 CPU 时间等指标的分布和变化趋势,这可以让你在执行长时间、分布式查询时诊断工作节点的利用情况。
查询细节页面上的任务信息区域
子主题
任务(Tasks)
实时计划
实时计划(Live Plan)标签页可以让你实时观察 Presto 集群执行查询处理的过程
Stage 性能
在查询处理结束后,Stage 性能视图可以提供有关查询性能细节的可视化
切片
切片视图显示了在查询执行过程中切片创建和执行的时间线
JSON
JSON 标签页以 JSON 格式提供了所有查询的细节信息,这些信息根据获取快照的不同而改变。
Presto SQL查询调优
将部分聚合下推到 Join 之前执行,从而减少输入 Join 的数据量
push_aggregation_through_join
使用 EXPLAIN 命令来确定 Join 顺序
通过设置一个切换,来使用表在 SQL 中出现的语法顺序来强制指定 Join 顺序。这可以通过在 config.properties 文件中使用 optimizer.join-reordering-strategy 属性进行全局设置
指定某一查询的 Join 顺序,则可以使用会话属性join_reordering_strategy
config.properties 文件中设定 optimizer.max-reordered-joins 参数来提高重排序表数量
提高这个值可能会导致 Presto 花费大量时间和资源进行查询优化,从而导致性能问题
内存管理
系统内存
系统内存的分配基于查询引擎自己的执行实现。缓冲区的读写和shuffle、表扫描等操作会影响系统内存的分配
用户内存
用户查询中的聚合和排序等操作会影响用户内存的分配。
内存属性
query.max-memory-per-node
一个查询在单个工作节点上可以使用的用户内存的最大值。这些内存可用于处理聚合和输入数据分配等
query.max-total-memory-per-node
一个查询在单个节点上可用的内存总量(包括用户内存和系统内存)的最大值,这个值必须大于 query.max-memory-per-node。当一个查询消耗的用户内存和系统内存总量超过了这个限制,它就会被终止。
query.max-memory
一个查询在全集群所有工作节点上可以使用的用户内存总量的最大值。
query.max-total-memory
一个查询可以在全集群所有节点上使用的内存总量(包括用户内存和系统内存)的最大值,因此这个值必须大于 query.max-memory。
大多数查询包含多个 Join、聚合和窗函数。如果查询的工作负载轻,你就可以设定降低的单个查询内存限制并提高并发性;反过来,如果查询工作负载重,你就只能提高单个查询的内存限制并降低并发性
防止死锁
query.low-memory-killer.policy
选用 total-reservation 时,Presto 会终结集群中占用内存最多的查询,从而释放资源
另外,选用 total-reservation-on-blocked-nodes 时,系统会终止在阻塞的节点上使用最多内存的查询
错误代码
EXCEEDED_LOCAL_MEMORY_LIMIT 表示内存使用超过了 query.max-memory-per-node 或 query.max-total-memory-per-node 的限制。
EXCEEDED_GLOBAL_MEMORY_LIMIT 表示内存使用超过了 query.max-memory 或 query.max-total-memory 的限制。
任务并发性
任务工作线程数
默认值是机器 CPU 数的 2 倍
task.max-worker-threads 属性来增加线程数
任务的算子并发数
Join 和 Aggregation 之类的算子通过本地数据分区和并行执行算子来实现并行处理
默认并发数是16,你可以通过设定 task.concurrency 属性来调整它
工作节点调度
根据任务或节点调度切片
每个工作节点能处理的切片数量有上限,默认情况下其最大值是 100
当发现工作节点上的切片数已经达到此限制但仍没有充分利用资源时,你可以考虑调整
node-scheduler.max-splits-per-node 属性调整
node-scheduler.max-pending-splits-per-task属性的值确保在工作节点处理任务的同时,等待的任务可以被放入队列中
本地调度策略
如果工作节点和分布式存储节点部署在相同的机器上,则最好将切片调度在数据所在的工作节点上;如果将切片调度在其他节点而不是数据所在节点,则这些数据必须在网络上传输才能处理。因此,将切片调度到数据存储的节点上可以提高性能
node-scheduler.network-topology
默认值 legacy 在调度切片时不会考虑数据位置
flat,从而使用考虑数据位置的改进策略。Presto 调度器会使用队列50% 的空间来调度本地切片
当 Presto 安装并放置在 HDFS 数据节点上时候,调度本地切片会提供更好的性能
网络数据交换
并发性
默认线程数是 25
exchange.client-threads 属性来修改
缓冲区大小
发送方
sink.max-buffer-size 属性调整
提高大规模集群的吞吐量
默认的缓冲区大小是 32MB
接收方
默认大小也是 32MB
exchange.max-buffer-size 属性进行调整
设定较大的接收缓冲区可以从网络上获取更多数据来延缓背压(backpressure)的发生,从而提高查询性能,特别是大规模集群的性能
JVM调优
资源组
资源组是一系列定义可用集群资源的命名属性,你可以认为一个资源组是集群中与其他资源组隔离的一部分资源。资源组由 CPU 和内存限制、并发数限制、队列优先级和队列中查询的优先级权重等定义
etc/resource-groups.properties 文件指定类型和配置文件路径
配置例子
选择器
第一个选择器匹配类型为 DATA_DEFINITION 的所有查询,并将它分配到ddl 资源组。第二个选择器匹配所有的查询,并将它们放到 ad-hoc 资源组。
资源组的定义
name
资源组名,必填项。选择器规则会使用这个名称引用资源组以分配查询。
maxQueued
资源组查询队列的最大长度,必填项。
hardConcurrencyLimit
资源组允许的最大并发查询数量,必填项
softMemoryLimit
并发运行的查询可以使用的分布式内存最大值,必填项。一旦达到此限制,在内存释放之前,新的查询都要在队列中等待。属性值可以使用绝对值(GB)和百分比(%)
softCpuLimit
在一个时间段(由 cpuQuotaPeriod 属性定义)中可以使用的 CPU 时间的软限制,可选项。一旦达到此限制,正在执行的查询会被施加一个惩罚。
hardCpuLimit
在一个时间段(由 cpuQuotaPeriod 属性定义)中可以使用的 CPU 时间的硬限制,可选项。一旦达到这个限制,就会拒绝查询直到下一个配额时间段(quota period)。
schedulingPolicy
在资源组的查询队列中选择一个新的查询来调度和处理的策略
schedulingWeight
与 schedulingPolicy 一起使用的可选属性
jmxExport
指示资源组是否通过 JMX 暴露信息的标志,默认是 false
subGroups
用于其他嵌套资源组的容器。
调度策略
schedulingPolicy 属性的值可以配置
公平调度
将 schedulingPolicy 设为在先进先出(FIFO)队列中的公平调度查询。如果此资源组包含子资源组,就会交替使用队列中有查询的子资源组。
优先级调度
将 schedulingPolicy 设置为 query_priority 会基于优先队列调度查询。查询的优先级由客户端的 query_priority 会话属性指定(参见8.8 节)。如果资源组有子资源组,则子资源组也必须指定query_priority。
权重调度
将 schedulingPolicy 设置为 weighted_fair,这用于选择启动下一个查询的子资源组。此策略需要配合 schedulingWeight 属性使用:调度器将基于子资源组的 schedulingWeight 按比例选择查询。
选择器规则定义
user
匹配用户名。可以使用正则表达式来匹配多个名称。
source
匹配查询来源,例如 presto-cli 或 presto-jdbc。可以使用正则表达式进行匹配。
queryType
匹配查询类型,可选项包括 DATA_DEFINITION、DELETE、DESCRIBE、EXPLAIN、INSERT 和 SELECT。
clientTags
匹配提交查询的客户端指定的客户端标签
你可以使用 --source 或 --client-tags 选项在 Presto CLI 上指定查询来源和客户端标签:
案例
部署和运行时平台
容器的使用正逐渐成为标准
集群规模
大规模使用 Presto 的情况大多数是使用多集群部署
使用负载均衡器可以让你在不影响用户使用的情况下升级集群
协调器故障不会导致系统停止服务
为了提高集群性能所进行的横向扩展可以包含来自不同运行时平台的集群。例如,你可能有一个长期使用的内部 Kubernetes 集群和一个部署在公共云上的临时 Kubernetes 集群。后者可用于在高峰时段分担任务负载
相互独立的集群可以让你清晰地隔离不同的使用场景并在不同方面调优集群
Hadoop/Hive迁移的使用场景
其他数据源
用户和流量
深入理解
架构
集群中的协调器和工作节点
Presto 集群中协调器和工作节点之间的通信
协调器
处理 SQL 语句时客户端、协调器和工作节点之间的通信 协调器、工作节点和客户端基于 HTTP 进行通信。
节点发现服务
协调器通常会运行一个内嵌版的节点发现服
协调器维护一个可用工作节点的最新列表,并用它来调度查询执行
节点发现服务的配置指向协调器的主机名和端口
工作节点
执行协调器分配的任务并处理数据
工作节点使用连接器从数据源获取数据
将最终的结果数据发送给协调器
集群中的工作节点相互协作来处理 SQL 语句和数据
基于连接器的架构
服务提供者接口(service provider interface,SPI)
API 的三个部分
获取表、视图、schema 元数据的操作
产生数据分区的逻辑单位的操作,用于 Presto 的并行读写
在源数据和查询引擎所需的内存数据格式之间进行转换的数据读取和写入组件
catalog、schema和表
每个 catalog都会配置一个连接器来访问特定的数据源
数据源在 catalog 中暴露出一个或多个 schema
每个 schema 又包含表
表提供数据行
每个数据行由一些具有不同数据类型的列组成
查询执行模型
处理一条 SQL 查询语句并创建查询计划
查询计划和调度的 SPI
逻辑查询计划到分布式查询计划的转换
协调器执行的任务管理
切片中的数据在不同任务之间传输并在不同工作节点上处理
一个任务处理数据的单位是切片
并行和任务分配的单位
Stage 的任务以 page的形式生产数据
具有输入输出切片的任务及其并行驱动
每个切片初始化一个驱动
每个驱动都是包含多个算子的流水线的一个实例,并且负责处理切片中的数据
一个任务可以使用一个或多个驱动
查询优化
解析和分析
识别查询用到的表
识别查询中用到的列
识别 ROW 值中的字段引用
初始查询计划
优化规则
谓词下推
过滤条件移动到尽可能接近数据源的位置
Cross Join消除
Cross Join 消除规则对表重新排序,以最小化 Cross Join 的数量(理想状态下可以将其变为 0)
TopN
局部聚合
通过聚合数据,我们可以减少流经下游 Join 的数据量
实现规则
Lateral Join去关联化
Semi-join(IN)去关联化
基于代价的优化器
代价的概念
无论在单查询还是并发查询任务中,CPU 时间、内存需求和网络带宽的使用都是构成查询执行时间的三个维度,这些维度组成了 Presto 的代价。
Join的代价
为了控制 Join 的内存开销,哪个表会成为构建表由 CBO 选择。在特定条件下,优化器可以避免其中一个表的网络传输,这样可以减少网络带宽使用(即减少网络开销)。为了达成这一目的,CBO 需要了解 Join 表的大小,这些数据由表统计信息提供。
表统计信息
基于连接器提供的表统计信息,Presto 可能会给出一套不同的计划
过滤统计信息
分区表的统计信息
Join枚举
广播Join和分布式Join
广播 Join 策略的可视化
分布式 Join 策略
分布式 Join 的优势在于,Presto 可以计算这样一个 Join:Join 两边的数据量都非常大,而一台机器的内存无法保存构建侧的全部数据。这一策略的缺点是需要额外的网络传输。
使用表统计信息
Presto的ANALYZE命令
在写入存储时收集数据
Hive的ANALYZE命令
显示表统计信息
SHOW STATS
生产环境
配置细节
etc 目录
服务端配置
etc/config.properties
基础设置属性
coordinator=true|false
设置 Presto 实例是否作为协调器运行,这样可以接受来自客户端的查询请求并管理查询执行。默认值为 true,值设为 false 会使服务端程序作为工作节点运行
node-scheduler.include-coordinator=true|false
设置是否将调度工作运行于协调器上,默认为 true。对于更大的集群,我们建议将此属性设为 false。在协调器上执行的处理工作会影响查询性能,因为服务端的资源可能被其占用而无法进行服务调度、管理和监控查询执行等重要工作。
http-server.http.port=8080 和 http-server.https.port=8443
指定服务端使用的 HTTP/HTTPS 连接端口。Presto 使用 HTTP 进行内部和外部通信。
query.max-memory=5GB
查询可以使用的分布式内存的最大值
query.max-memory-per-node=1GB
查询在单个机器上可以使用的用户内存的最大值
query.max-total-memory-per-node=2GB
查询在任何一台服务器上可以使用的用户内存和系统内存加起来的最大值。系统内存是在执行过程中由读取器、写入器和网络缓冲等组件所使用的内存
discovery-server.enabled=true
Presto 使用发现服务来找到集群中的所有节点。每个 Presto 实例在启动时都会注册到发现服务。为了简化部署和避免运行额外的服务,Presto 协调器可以运行内置版本的发现服务。它与 Presto 共享 HTTP 服务器,因此使用相同的端口。通常此属性在协调器上设置为 true。在所有的工作节点上都必须删除此属性,从而禁用它。
discovery.uri=http://localhost:8080
发现服务的 URI。使用 Presto 协调器内置的发现服务时,此属性的值应为 Presto 协调器的 URI 且应指定正确的端口。这个 URI 不能以斜杠结尾
日志
日志配置文件 etc/log.properties
var/log 目录
launcher.log
此文件由启动器(参见 5.6 节)创建,它与服务器的标准输出(stdout)流和标准错误(stderr)流相连,包含服务器初始化时产生的一些日志信息,以及 JVM 产生的错误和诊断信息。
server.log
这是 Presto 主要的日志文件。如果服务器初始化失败,这个文件通常会包含相关的信息。此外,它还包括有关应用程序实际运行和数据源连接等的大部分信息。
http-request.log
HTTP 请求日志,包含服务器接收到的每一个 HTTP 请求。这既包括对Web UI 和 Presto CLI 的使用请求,也包括第 3 章介绍的 JDBC 或 ODBC连接请求,因为所有这些操作都使用 HTTP 连接。这个文件也包括认证和授权日志。
节点配置
配置文件 etc/node.properties
配置属性
node.environment=demo
运行环境的名称(必填项)。Presto 集群里的所有节点必须拥有同一个环境名,该名称显示在 Presto Web UI 的标题部分
node.id=some-random-unique-string
当前 Presto 安装实例的唯一识别符(可选项)。每个节点都必须拥有不同的唯一标识。如果想要在 Presto 节点重启和升级时保持一致的标识,则需要指定该属性。如果不指定此属性,每次重启时都会生成一个新的随机标识。
node.data-dir=/var/presto/data
Presto 存储日志文件和其他数据的文件系统目录(可选项),默认为安装目录下的 var 文件夹。
JVM配置
配置文件 etc/jvm.config
启动器
bin 目录下提供了用于启动和管理 Presto 的脚本
脚本案例
集群安装
config.properties 文件中的 coordinator 属性在协调器上设置为 true,在工作节点上设置为 false
设置了 node-scheduler 属性以排除协调器
在所有的工作节点和协调器上,discovery-uri 属性都设置为指向协调器的 IP 地址或主机名。
通过删除属性禁用了工作节点上的发现服务。
协调器的主配置文件 etc/config.properties
工作节点的主配置文件 etc/config.properties
使用RPM安装
安装目录结构
/usr/lib/presto/
此目录包含了运行 Presto 所需的各种库,插件放置在其中的 plugin 目录下。
/etc/presto
此目录包含了运行 Presto 所需的通用配置文件,如 node.properties、jvm.config 和 config.properties 等。catalog 配置文件位于其中的 catalog目录下。
/etc/presto/env.sh
此文件设置了使用的 Java 安装路径。
/var/log/presto
此目录包含日志文件。
/var/lib/presto/data
这是数据目录
/etc/rc.d/init.d/presto
这个目录包含了控制服务器进程的服务脚本
node.properties 文件需要下列两个额外的属性
配置
使用 presto-admin 工具
卸载Presto
在云上安装
云部署方案的一大优势是提供了部署高弹性集群的可能性,集群中的工作节点可以根据需要创建和销毁
集群规模的考量
模式和步骤
基于粗略估计和可用的基础设施决定初始规模。
确保集群的工具和基础设施支持集群伸缩。
启动集群并逐步增加使用量。
监控使用率和性能。
根据观察到的结果调整集群的规模和配置。
由监控、调整和继续使用构成的反馈闭环可以让你更好地了解 Presto 部署的行为。
因素会影响集群性能
每个节点的资源,如 CPU 和内存
集群内部以及集群到数据源和存储的网络性能
连接的数据源的数量和特性
在数据源上执行的查询及其范围、复杂度、数量和结果数据量。
数据源存储的读写性能。
活跃用户及其使用模式
充分利用 Presto Web UI 进行监控
连接器
配置
创建一个 catalog 文件来配置catalog
必填属性 connector.name 表示 catalog 中使用的是哪个连接器
同一个连接器可以在不同的 catalog 中多次使用
RDBMS连接器示例:PostgreSQL
etc/catalog/postgresql.properties
使用连接器中的 JDBC 实现 Presto 集群与 PostgresSQL 的交互
查询下推
Presto 能够通过将 SQL 语句下推到底层数据源中来进行负载的下推处理,这就是所谓的查询下推,也称为 SQL 下推
可以减少底层系统返回给 Presto 的数据量,从而避免了不必要的内存、CPU 和网络开销
并行性和并发性
如果查询在 PostgreSQL 中的两个表之间执行 Join,Presto 通过 JDBC 创建两个不同的连接来检索数据,用于访问 PostgreSQL 中不同表的多个 JDBC 连接
其他RDBMS连接器
MySQL
PostgreSQL
AWS Redshift
Microsoft SQL Server
安全性
RDBMS 连接器进行认证的唯一方式是在 catalog 配置文件中存储用户名和密码
Presto TPC-H和TPC-DS连接器
用于开发和测试
用于分布式存储数据源的Hive连接器
Apache Hadoop和Hive
Hive连接器
Presto 和 Presto Hive 连接器完全不使用 Hive 运行时环境。Presto 是它的替代品,用于运行交互式查询
Hive 连接器只是使用 HMS 中的元数据,并使用 Hadoop 项目提供的 HDFS 客户端直接访问 HDFS 上的数据。
Hive式表格式
schema,有时仍称为数据库,可以包含多个表
内部表与外部表
内部表是由 Hive 管理的,因此其实也是由 Presto 管理的,它和它的数据一起创建于数据库目录所在的位置;而外部表不是由 Hive 管理的,它明确指向 Hive 所管理的目录之外的一个位置。
使用的是外部表,通常不允许 Presto 写入这些表
外部表
分区数据
当提交此查询时,Presto 会识别 WHERE 子句中的分区列,并使用关联值只读取 view_date= 2019-01-15/country=US 子目录。只读取需要的分区可能会节省大量性能。如果数据规模现在还很小,性能提升可能不会很明显,但随着数据规模增长,性能的提升是非常显著的。
加载数据
INSERT INTO ... VALUES、INSERT INTO ... SELECT和 CREATE TABLE AS SELECT 等语句
INSERT SELECT 和 CREATE TABLE AS 语句
Presto 不允许向外部表写入数据。要启用它,你需要在 catalog 配置文件中将 hive.non-managed-table-writes-enabled 设置为 true。
Presto 支持所谓的动态分区:当 Presto 检测到分区列值没有对应的目录时会创建它。
自动发现和添加分区
文件格式和压缩
Presto 使用的三种最常用的文件格式是 ORC、Parquet 和 Avro 数据文件
数据类型被默认设置为ORC
catalog 中所有表的默认存储格式可以通过 catalog 属性文件中的hive.storage-format 配置来设置。
默认情况下,Presto 使用 GZIP 压缩编解码器来编写文件。可通过在 catalog属性文件中设置 hive.compression-codec 配置,将代码更改为使用SNAPPY 或 NONE。
指定文件格式
非关系数据源
Elasticsearch
MongoDB
Apache Kafka
Apache Accumulo
Apache Cassandra
Apache HBase
Apache Phoenix
Presto JMX连接器
它使用 Java 管理扩展(Java management extensions,JMX),允许你使用 Presto 的 SQL 接口来访问可用信息。这对于监控和故障排除非常有用。
黑洞连接器
它作为任何数据的最终消费者,类似于 UNIX 操作系统中的 null 设备(/dev/null)。你可以把它作为从其他 catalog 中读取并插入数据的目标。因为它实际上不写入任何内容,所以你可以用它来衡量从这些 catalog 中读取数据的性能。
这个操作本质上是衡量从 tpch catalog 中读取性能,它读取了 150 万条订单记录,然后将其发送到 blackhole。使用其他模式(如 tcph.sf100)会增加数据集的大小。这可以用来评估你的 Presto 集群的性能
内存连接器
你可以像使用临时数据库一样使用内存连接器。所有的数据都存储在集群的内存中,停止集群就会销毁数据。当然,你也可以主动使用 SQL 语句来删除表中的数据,甚至删除整张表。
高级连接器实例
用 Phoenix 连接到 Hbase
键值存储连接器示例:Accumulo
键值存储系统用于管理记录存储的字典,并允许通过唯一的键来检索某条记录
由分布式 Apache Accumulo、HDFS 和 Apache ZooKeeper 组成的 Accumulo 基本体系结构
具有主节点和多个 tablet 服务器的 Accumulo 架构
多个工作节点并行访问 Accumulo
使用Presto Accumulo连接器
Accumulo中的谓词下推
Apache Cassandra 连接器
流系统连接器示例:Kafka。
使用场景
对实时 Kafka 主题流的ad-hoc 查询,以检查和更好地了解当前系统的状态和数据流
是从 Kafka 迁移数据
文档存储连接器示例:Elasticsearch
概述
Presto 连接器允许用户使用 SQL 访问这些系统并查询其中的数据,即使这些系统没有原生 SQL 访问
配置和使用方法
查询处理
Presto 可以查询 Elasticsearch 以了解所有的 Elasticsearch 分片(shard)
这些切片会并发地向特定的分片发起单独的请求。一旦结果返回,就会在 Presto 中进行合并,然后返回给用户
Presto 与Elasticsearch 结合后不仅可以使用 SQL 进行查询,而且比 Elasticsearch 本身的性能更好。
全文搜索
Presto中的联邦查询
联邦查询的逻辑查询计划
查询计划中的下推
目前,Presto 还不支持更复杂的 SQL 下推。例如,Presto 对只涉及RDBMS 数据的聚合或 Join 才进行下推,以消除向 Presto 的数据传输。
ETL和联合查询
通过使用 CREATE TABLE AS 或INSERT SELECT,你可以将数据从一个数据源移动到另一个数据源
使用sql
Presto语句
SHOW CATALOGS [ LIKE pattern ]
列出可用的 catalog
SHOW SCHEMAS [ FROM catalog ] [ LIKE pattern ]
列出 catalog 中的 schema。
SHOW TABLES [ FROM schema ] [ LIKE pattern ]
列出一个 schema 中的表
SHOW FUNCTIONS
显示所有可用 SQL 函数的列表。
SHOW COLUMNS FROM table 或 DESCRIBE table
列出表中的列及其数据类型和其他属性。
USE catalog.schema 或 USE schema
更新会话以使用指定的 catalog 和 schema 作为默认值。如果没有指定catalog,则使用当前 catalog 来解析 schema。
SHOW STATS FOR table_name
显示某个表中的数据规模和数量等统计信息。
EXPLAIN
生成查询计划,并详细列出各个步骤。
Presto系统表
系统表包含的 schema
system.runtime.queries 表提供了 Presto 中当前和历史查询的信息
system.runtime.tasks 表则提供了 Presto 中任务的底层细节
catalog
Presto catalog 代表在 catalog 属性文件中使用连接器配置的数据源。catalog 包含一个或多个 schema,而 schema 提供了表的集合
schema
Presto 的 catalog 包含 schema。schema 包含表、视图和其他各种对象,是组织表的一种方式。catalog 和 schema 共同定义了一组可以查询的表
创建 schema
修改
删除
Information Schema
Information Schema 是 SQL 标准的一部分,并在 Presto 中作为一组视图,提供了关于 catalog 中的 schema、表、列、视图和其他对象的元数据。
Information Schema 都有 8 个视图
表
Presto 的表由行、列和这些列的数据类型所组成。从源数据到表的映射是由 catalog 定义的
建表
其他的系统(如 Hive)扩展了 SQL 语言,使用户可以使用那些无法用标准 SQL 表达的逻辑或数据。遵循相同的方法违反了 Presto 尽可能地接近 SQL 标准的理念,也导致难以管理多种不同的连接器。因此Presto 选择使用 WITH 语句指定表和列的属性,而不是扩展 SQL 语言。
表和列属性
Hive连接器所支持的表属性
可用的表属性
可用的列属性
复制现有的表
LIKE 子句会创建一个与现有表具有相同列定义的表
默认情况下,表和列属性不会被复制。由于属性在 Presto中很重要,我们建议在语法中使用 INCLUDING PROPERTIES 来复制它们
从查询结果中新建表
CREATE TABLE AS(CTAS)语句可用于新建包含 SELECT 查询结果的表。
CTAS 可用于转换表和数据
修改表
ALTER TABLE 语句可以执行诸如重命名表、添加列、删除列或重命名列等操作
删除表
使用 DROP TABLE 语句可以删除一个表
连接器对表操作的限制
连接器的实现和底层数据源的能力与语义很大程度上会影响 SQL 的支持程度
如果你尝试使用连接器不支持的语句或操作,Presto 就会返回一个错误
视图
视图是基于 SQL 查询结果集的虚拟表。很多 RDBMS 对视图有良好的支持,但 Presto 不支持创建、编辑或删除视图。
Presto 把底层数据源中的视图当作表一样处理,这使得你可以将视图用于一些非常有用的目的
会话信息和配置
当使用 Presto 时,所有的配置都在一个用户特定的上下文中维护,称为会话。该会话包含键值对,表示当前用户与 Presto 交互时所使用的诸多配置。
使用 LIKE 模式来查看你感兴趣的选项
设置属性
撤销设置并恢复到默认值
覆盖config.properties 主配置文件
数据类型
布尔数据类型
整数数据类型
浮点数据类型
固定精度数据类型
字符串数据类型
集合数据类型
时态数据类型
可解析为时间戳数据类型的字符串格式
可解析为时态数据类型的字符串格式
可解析为日期数据类型的字符串格式
时间输出格式
时区
America/New_YorkAmerica/Los_AngelesEurope/Warsaw+08:00-10:00
时间间隔
YEAR TO MONTH的时间间隔
DAY TO SECOND的时间间隔
类型转换
try_cast。它尝试执行类型转换,但与失败后会报错的 CAST 不同,try_cast 会返回 NULL 值,这在不需要处理错误时很有用
SELECT语句基础
WHERE子句
GROUP BY和HAVING子句
GROUP BY 用于将具有相同值的行合并成一行
GROUP BY 经常与聚合函数相结合
HAVING 子句在 GROUP BY 之后求值,并作用于分组后的行;而 WHERE 子句是在 GROUP BY 之前求值的,并作用于单个行
ORDER BY子句和LIMIT子句
JOIN语句
INNER JOIN、LEFT OUTER JOIN、RIGHT OUTERJOIN、FULL OUTER JOIN、FULL OUTER JOIN 和 CROSS JOIN
UNION、INTERSECT和EXCEPT子句
UNION、INTERSECT 和 EXCEPT 在 SQL 中叫作集合操作。它们用于将多个SQL 语句中的数据组合成一个结果
INTERSECT 返回两个查询中都有的元素作为结果集
UNION,它可以合并所有的值并去除重复的值
UNION ALL 将保留重复值
EXCEPT 返回第一个查询中去除第二个查询中的元素后剩下的元素
分组操作
ROLLUP(a, b, c) 生成分组集合 (a, b, c)、(a, b)、(a)、()
CUBE(a, b, c) 生成分组集合 (a, b, c)、(a, b)、(a, c)、(b, c)、(a)、(b)、(c)、()
WITH子句
WITH 子句用于在单个查询中定义一个内联视图。这通常可以使查询更可读,因为查询可能需要多次包含相同的嵌套查询。
子查询
标量子查询
标量子查询指返回单个值(一行一列)的子查询
它只对子查询进行一次计算,之后都使用静态值
EXISTS子查询
EXISTS 子查询表示如果有任何记录则结果为 true。这些查询通常作为关联子查询使用
集合比较子查询
ANY 子查询的形式为表达式运算符量化符(子查询)。有效的运算符的值是<、>、<=、>=、=、= 或 <>。也可以使用 SOME 来代替 ANY。这种类型的查询最常见的另一个形式是表达式 IN 子查询,它等价于表达式 = ANY 子查询
从表中删除数据
高级sql特性
函数和运算符介绍
标量函数和运算符
布尔运算符
逻辑运算符
用BETWEEN语句选择范围
用IS (NOT) NULL检测值的存在
数学函数和运算符
三角函数
常数和随机函数
字符串函数和运算符
字符串和映射
Unicode
正则表达式
解嵌套复杂数据类型
JSON函数
日期和时间函数及运算符
聚合函数
窗函数
lambda表达式
地理空间函数
Prepared Statement